therubyracer 0.4.6 → 0.4.7

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of therubyracer might be problematic. Click here for more details.

Files changed (1148) hide show
  1. data/Manifest.txt +1138 -0
  2. data/README.rdoc +7 -5
  3. data/Rakefile +12 -2
  4. data/ext/v8/Makefile +169 -0
  5. data/ext/v8/extconf.rb +20 -3
  6. data/ext/v8/upstream/2.0.6/.sconsign.dblite +0 -0
  7. data/ext/v8/upstream/2.0.6/AUTHORS +23 -0
  8. data/ext/v8/upstream/2.0.6/ChangeLog +1479 -0
  9. data/ext/v8/upstream/2.0.6/LICENSE +55 -0
  10. data/ext/v8/upstream/2.0.6/SConstruct +1028 -0
  11. data/ext/v8/upstream/2.0.6/benchmarks/README.txt +63 -0
  12. data/ext/v8/upstream/2.0.6/benchmarks/base.js +264 -0
  13. data/ext/v8/upstream/2.0.6/benchmarks/crypto.js +1698 -0
  14. data/ext/v8/upstream/2.0.6/benchmarks/deltablue.js +880 -0
  15. data/ext/v8/upstream/2.0.6/benchmarks/earley-boyer.js +4684 -0
  16. data/ext/v8/upstream/2.0.6/benchmarks/raytrace.js +935 -0
  17. data/ext/v8/upstream/2.0.6/benchmarks/regexp.js +1614 -0
  18. data/ext/v8/upstream/2.0.6/benchmarks/revisions.html +86 -0
  19. data/ext/v8/upstream/2.0.6/benchmarks/richards.js +539 -0
  20. data/ext/v8/upstream/2.0.6/benchmarks/run.html +141 -0
  21. data/ext/v8/upstream/2.0.6/benchmarks/run.js +61 -0
  22. data/ext/v8/upstream/2.0.6/benchmarks/splay.js +378 -0
  23. data/ext/v8/upstream/2.0.6/benchmarks/style.css +77 -0
  24. data/ext/v8/upstream/2.0.6/benchmarks/v8-logo.png +0 -0
  25. data/ext/v8/upstream/2.0.6/include/v8-debug.h +275 -0
  26. data/ext/v8/upstream/2.0.6/include/v8.h +3236 -0
  27. data/ext/v8/upstream/2.0.6/samples/SConscript +38 -0
  28. data/ext/v8/upstream/2.0.6/samples/count-hosts.js +42 -0
  29. data/ext/v8/upstream/2.0.6/samples/process.cc +622 -0
  30. data/ext/v8/upstream/2.0.6/samples/shell.cc +303 -0
  31. data/ext/v8/upstream/2.0.6/src/SConscript +283 -0
  32. data/ext/v8/upstream/2.0.6/src/accessors.cc +695 -0
  33. data/ext/v8/upstream/2.0.6/src/accessors.h +114 -0
  34. data/ext/v8/upstream/2.0.6/src/allocation.cc +198 -0
  35. data/ext/v8/upstream/2.0.6/src/allocation.h +169 -0
  36. data/ext/v8/upstream/2.0.6/src/api.cc +3831 -0
  37. data/ext/v8/upstream/2.0.6/src/api.h +479 -0
  38. data/ext/v8/upstream/2.0.6/src/apinatives.js +110 -0
  39. data/ext/v8/upstream/2.0.6/src/apiutils.h +69 -0
  40. data/ext/v8/upstream/2.0.6/src/arguments.h +97 -0
  41. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm-inl.h +277 -0
  42. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm.cc +1821 -0
  43. data/ext/v8/upstream/2.0.6/src/arm/assembler-arm.h +1027 -0
  44. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2-inl.h +267 -0
  45. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2.cc +1821 -0
  46. data/ext/v8/upstream/2.0.6/src/arm/assembler-thumb2.h +1027 -0
  47. data/ext/v8/upstream/2.0.6/src/arm/builtins-arm.cc +1271 -0
  48. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm-inl.h +74 -0
  49. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm.cc +6682 -0
  50. data/ext/v8/upstream/2.0.6/src/arm/codegen-arm.h +535 -0
  51. data/ext/v8/upstream/2.0.6/src/arm/constants-arm.cc +112 -0
  52. data/ext/v8/upstream/2.0.6/src/arm/constants-arm.h +347 -0
  53. data/ext/v8/upstream/2.0.6/src/arm/cpu-arm.cc +132 -0
  54. data/ext/v8/upstream/2.0.6/src/arm/debug-arm.cc +213 -0
  55. data/ext/v8/upstream/2.0.6/src/arm/disasm-arm.cc +1166 -0
  56. data/ext/v8/upstream/2.0.6/src/arm/fast-codegen-arm.cc +1698 -0
  57. data/ext/v8/upstream/2.0.6/src/arm/frames-arm.cc +123 -0
  58. data/ext/v8/upstream/2.0.6/src/arm/frames-arm.h +162 -0
  59. data/ext/v8/upstream/2.0.6/src/arm/ic-arm.cc +849 -0
  60. data/ext/v8/upstream/2.0.6/src/arm/jump-target-arm.cc +238 -0
  61. data/ext/v8/upstream/2.0.6/src/arm/macro-assembler-arm.cc +1259 -0
  62. data/ext/v8/upstream/2.0.6/src/arm/macro-assembler-arm.h +423 -0
  63. data/ext/v8/upstream/2.0.6/src/arm/regexp-macro-assembler-arm.cc +1266 -0
  64. data/ext/v8/upstream/2.0.6/src/arm/regexp-macro-assembler-arm.h +282 -0
  65. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm-inl.h +103 -0
  66. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm.cc +59 -0
  67. data/ext/v8/upstream/2.0.6/src/arm/register-allocator-arm.h +43 -0
  68. data/ext/v8/upstream/2.0.6/src/arm/simulator-arm.cc +2264 -0
  69. data/ext/v8/upstream/2.0.6/src/arm/simulator-arm.h +306 -0
  70. data/ext/v8/upstream/2.0.6/src/arm/stub-cache-arm.cc +1516 -0
  71. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.cc +412 -0
  72. data/ext/v8/upstream/2.0.6/src/arm/virtual-frame-arm.h +532 -0
  73. data/ext/v8/upstream/2.0.6/src/array.js +1154 -0
  74. data/ext/v8/upstream/2.0.6/src/assembler.cc +772 -0
  75. data/ext/v8/upstream/2.0.6/src/assembler.h +525 -0
  76. data/ext/v8/upstream/2.0.6/src/ast.cc +512 -0
  77. data/ext/v8/upstream/2.0.6/src/ast.h +1820 -0
  78. data/ext/v8/upstream/2.0.6/src/bootstrapper.cc +1680 -0
  79. data/ext/v8/upstream/2.0.6/src/bootstrapper.h +103 -0
  80. data/ext/v8/upstream/2.0.6/src/builtins.cc +851 -0
  81. data/ext/v8/upstream/2.0.6/src/builtins.h +245 -0
  82. data/ext/v8/upstream/2.0.6/src/bytecodes-irregexp.h +104 -0
  83. data/ext/v8/upstream/2.0.6/src/char-predicates-inl.h +86 -0
  84. data/ext/v8/upstream/2.0.6/src/char-predicates.h +65 -0
  85. data/ext/v8/upstream/2.0.6/src/checks.cc +100 -0
  86. data/ext/v8/upstream/2.0.6/src/checks.h +284 -0
  87. data/ext/v8/upstream/2.0.6/src/code-stubs.cc +164 -0
  88. data/ext/v8/upstream/2.0.6/src/code-stubs.h +164 -0
  89. data/ext/v8/upstream/2.0.6/src/code.h +68 -0
  90. data/ext/v8/upstream/2.0.6/src/codegen-inl.h +88 -0
  91. data/ext/v8/upstream/2.0.6/src/codegen.cc +504 -0
  92. data/ext/v8/upstream/2.0.6/src/codegen.h +522 -0
  93. data/ext/v8/upstream/2.0.6/src/compilation-cache.cc +490 -0
  94. data/ext/v8/upstream/2.0.6/src/compilation-cache.h +98 -0
  95. data/ext/v8/upstream/2.0.6/src/compiler.cc +1132 -0
  96. data/ext/v8/upstream/2.0.6/src/compiler.h +107 -0
  97. data/ext/v8/upstream/2.0.6/src/contexts.cc +256 -0
  98. data/ext/v8/upstream/2.0.6/src/contexts.h +345 -0
  99. data/ext/v8/upstream/2.0.6/src/conversions-inl.h +95 -0
  100. data/ext/v8/upstream/2.0.6/src/conversions.cc +709 -0
  101. data/ext/v8/upstream/2.0.6/src/conversions.h +118 -0
  102. data/ext/v8/upstream/2.0.6/src/counters.cc +78 -0
  103. data/ext/v8/upstream/2.0.6/src/counters.h +239 -0
  104. data/ext/v8/upstream/2.0.6/src/cpu.h +65 -0
  105. data/ext/v8/upstream/2.0.6/src/d8-debug.cc +345 -0
  106. data/ext/v8/upstream/2.0.6/src/d8-debug.h +155 -0
  107. data/ext/v8/upstream/2.0.6/src/d8-posix.cc +675 -0
  108. data/ext/v8/upstream/2.0.6/src/d8-readline.cc +128 -0
  109. data/ext/v8/upstream/2.0.6/src/d8-windows.cc +42 -0
  110. data/ext/v8/upstream/2.0.6/src/d8.cc +776 -0
  111. data/ext/v8/upstream/2.0.6/src/d8.h +225 -0
  112. data/ext/v8/upstream/2.0.6/src/d8.js +1625 -0
  113. data/ext/v8/upstream/2.0.6/src/date-delay.js +1138 -0
  114. data/ext/v8/upstream/2.0.6/src/dateparser-inl.h +114 -0
  115. data/ext/v8/upstream/2.0.6/src/dateparser.cc +186 -0
  116. data/ext/v8/upstream/2.0.6/src/dateparser.h +240 -0
  117. data/ext/v8/upstream/2.0.6/src/debug-agent.cc +425 -0
  118. data/ext/v8/upstream/2.0.6/src/debug-agent.h +129 -0
  119. data/ext/v8/upstream/2.0.6/src/debug-delay.js +2073 -0
  120. data/ext/v8/upstream/2.0.6/src/debug.cc +2751 -0
  121. data/ext/v8/upstream/2.0.6/src/debug.h +866 -0
  122. data/ext/v8/upstream/2.0.6/src/disasm.h +77 -0
  123. data/ext/v8/upstream/2.0.6/src/disassembler.cc +318 -0
  124. data/ext/v8/upstream/2.0.6/src/disassembler.h +56 -0
  125. data/ext/v8/upstream/2.0.6/src/dtoa-config.c +91 -0
  126. data/ext/v8/upstream/2.0.6/src/execution.cc +701 -0
  127. data/ext/v8/upstream/2.0.6/src/execution.h +312 -0
  128. data/ext/v8/upstream/2.0.6/src/factory.cc +957 -0
  129. data/ext/v8/upstream/2.0.6/src/factory.h +393 -0
  130. data/ext/v8/upstream/2.0.6/src/fast-codegen.cc +725 -0
  131. data/ext/v8/upstream/2.0.6/src/fast-codegen.h +371 -0
  132. data/ext/v8/upstream/2.0.6/src/flag-definitions.h +426 -0
  133. data/ext/v8/upstream/2.0.6/src/flags.cc +555 -0
  134. data/ext/v8/upstream/2.0.6/src/flags.h +81 -0
  135. data/ext/v8/upstream/2.0.6/src/frame-element.cc +45 -0
  136. data/ext/v8/upstream/2.0.6/src/frame-element.h +235 -0
  137. data/ext/v8/upstream/2.0.6/src/frames-inl.h +215 -0
  138. data/ext/v8/upstream/2.0.6/src/frames.cc +749 -0
  139. data/ext/v8/upstream/2.0.6/src/frames.h +659 -0
  140. data/ext/v8/upstream/2.0.6/src/func-name-inferrer.cc +76 -0
  141. data/ext/v8/upstream/2.0.6/src/func-name-inferrer.h +135 -0
  142. data/ext/v8/upstream/2.0.6/src/global-handles.cc +516 -0
  143. data/ext/v8/upstream/2.0.6/src/global-handles.h +180 -0
  144. data/ext/v8/upstream/2.0.6/src/globals.h +608 -0
  145. data/ext/v8/upstream/2.0.6/src/handles-inl.h +76 -0
  146. data/ext/v8/upstream/2.0.6/src/handles.cc +811 -0
  147. data/ext/v8/upstream/2.0.6/src/handles.h +367 -0
  148. data/ext/v8/upstream/2.0.6/src/hashmap.cc +226 -0
  149. data/ext/v8/upstream/2.0.6/src/hashmap.h +120 -0
  150. data/ext/v8/upstream/2.0.6/src/heap-inl.h +407 -0
  151. data/ext/v8/upstream/2.0.6/src/heap-profiler.cc +695 -0
  152. data/ext/v8/upstream/2.0.6/src/heap-profiler.h +277 -0
  153. data/ext/v8/upstream/2.0.6/src/heap.cc +4204 -0
  154. data/ext/v8/upstream/2.0.6/src/heap.h +1704 -0
  155. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32-inl.h +325 -0
  156. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32.cc +2375 -0
  157. data/ext/v8/upstream/2.0.6/src/ia32/assembler-ia32.h +914 -0
  158. data/ext/v8/upstream/2.0.6/src/ia32/builtins-ia32.cc +1222 -0
  159. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32-inl.h +46 -0
  160. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32.cc +9770 -0
  161. data/ext/v8/upstream/2.0.6/src/ia32/codegen-ia32.h +834 -0
  162. data/ext/v8/upstream/2.0.6/src/ia32/cpu-ia32.cc +79 -0
  163. data/ext/v8/upstream/2.0.6/src/ia32/debug-ia32.cc +208 -0
  164. data/ext/v8/upstream/2.0.6/src/ia32/disasm-ia32.cc +1357 -0
  165. data/ext/v8/upstream/2.0.6/src/ia32/fast-codegen-ia32.cc +1813 -0
  166. data/ext/v8/upstream/2.0.6/src/ia32/frames-ia32.cc +111 -0
  167. data/ext/v8/upstream/2.0.6/src/ia32/frames-ia32.h +135 -0
  168. data/ext/v8/upstream/2.0.6/src/ia32/ic-ia32.cc +1490 -0
  169. data/ext/v8/upstream/2.0.6/src/ia32/jump-target-ia32.cc +432 -0
  170. data/ext/v8/upstream/2.0.6/src/ia32/macro-assembler-ia32.cc +1517 -0
  171. data/ext/v8/upstream/2.0.6/src/ia32/macro-assembler-ia32.h +528 -0
  172. data/ext/v8/upstream/2.0.6/src/ia32/regexp-macro-assembler-ia32.cc +1219 -0
  173. data/ext/v8/upstream/2.0.6/src/ia32/regexp-macro-assembler-ia32.h +230 -0
  174. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32-inl.h +82 -0
  175. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32.cc +99 -0
  176. data/ext/v8/upstream/2.0.6/src/ia32/register-allocator-ia32.h +43 -0
  177. data/ext/v8/upstream/2.0.6/src/ia32/simulator-ia32.cc +30 -0
  178. data/ext/v8/upstream/2.0.6/src/ia32/simulator-ia32.h +62 -0
  179. data/ext/v8/upstream/2.0.6/src/ia32/stub-cache-ia32.cc +1961 -0
  180. data/ext/v8/upstream/2.0.6/src/ia32/virtual-frame-ia32.cc +1105 -0
  181. data/ext/v8/upstream/2.0.6/src/ia32/virtual-frame-ia32.h +580 -0
  182. data/ext/v8/upstream/2.0.6/src/ic-inl.h +93 -0
  183. data/ext/v8/upstream/2.0.6/src/ic.cc +1426 -0
  184. data/ext/v8/upstream/2.0.6/src/ic.h +443 -0
  185. data/ext/v8/upstream/2.0.6/src/interpreter-irregexp.cc +646 -0
  186. data/ext/v8/upstream/2.0.6/src/interpreter-irregexp.h +48 -0
  187. data/ext/v8/upstream/2.0.6/src/json-delay.js +254 -0
  188. data/ext/v8/upstream/2.0.6/src/jsregexp.cc +5234 -0
  189. data/ext/v8/upstream/2.0.6/src/jsregexp.h +1439 -0
  190. data/ext/v8/upstream/2.0.6/src/jump-target-inl.h +49 -0
  191. data/ext/v8/upstream/2.0.6/src/jump-target.cc +383 -0
  192. data/ext/v8/upstream/2.0.6/src/jump-target.h +280 -0
  193. data/ext/v8/upstream/2.0.6/src/list-inl.h +166 -0
  194. data/ext/v8/upstream/2.0.6/src/list.h +158 -0
  195. data/ext/v8/upstream/2.0.6/src/log-inl.h +126 -0
  196. data/ext/v8/upstream/2.0.6/src/log-utils.cc +503 -0
  197. data/ext/v8/upstream/2.0.6/src/log-utils.h +292 -0
  198. data/ext/v8/upstream/2.0.6/src/log.cc +1457 -0
  199. data/ext/v8/upstream/2.0.6/src/log.h +371 -0
  200. data/ext/v8/upstream/2.0.6/src/macro-assembler.h +93 -0
  201. data/ext/v8/upstream/2.0.6/src/macros.py +137 -0
  202. data/ext/v8/upstream/2.0.6/src/mark-compact.cc +2007 -0
  203. data/ext/v8/upstream/2.0.6/src/mark-compact.h +442 -0
  204. data/ext/v8/upstream/2.0.6/src/math.js +263 -0
  205. data/ext/v8/upstream/2.0.6/src/memory.h +74 -0
  206. data/ext/v8/upstream/2.0.6/src/messages.cc +177 -0
  207. data/ext/v8/upstream/2.0.6/src/messages.h +112 -0
  208. data/ext/v8/upstream/2.0.6/src/messages.js +937 -0
  209. data/ext/v8/upstream/2.0.6/src/mirror-delay.js +2332 -0
  210. data/ext/v8/upstream/2.0.6/src/mksnapshot.cc +169 -0
  211. data/ext/v8/upstream/2.0.6/src/natives.h +63 -0
  212. data/ext/v8/upstream/2.0.6/src/objects-debug.cc +1317 -0
  213. data/ext/v8/upstream/2.0.6/src/objects-inl.h +3044 -0
  214. data/ext/v8/upstream/2.0.6/src/objects.cc +8306 -0
  215. data/ext/v8/upstream/2.0.6/src/objects.h +4960 -0
  216. data/ext/v8/upstream/2.0.6/src/oprofile-agent.cc +116 -0
  217. data/ext/v8/upstream/2.0.6/src/oprofile-agent.h +69 -0
  218. data/ext/v8/upstream/2.0.6/src/parser.cc +4810 -0
  219. data/ext/v8/upstream/2.0.6/src/parser.h +195 -0
  220. data/ext/v8/upstream/2.0.6/src/platform-freebsd.cc +645 -0
  221. data/ext/v8/upstream/2.0.6/src/platform-linux.cc +808 -0
  222. data/ext/v8/upstream/2.0.6/src/platform-macos.cc +643 -0
  223. data/ext/v8/upstream/2.0.6/src/platform-nullos.cc +454 -0
  224. data/ext/v8/upstream/2.0.6/src/platform-openbsd.cc +597 -0
  225. data/ext/v8/upstream/2.0.6/src/platform-posix.cc +380 -0
  226. data/ext/v8/upstream/2.0.6/src/platform-win32.cc +1908 -0
  227. data/ext/v8/upstream/2.0.6/src/platform.h +556 -0
  228. data/ext/v8/upstream/2.0.6/src/prettyprinter.cc +1511 -0
  229. data/ext/v8/upstream/2.0.6/src/prettyprinter.h +219 -0
  230. data/ext/v8/upstream/2.0.6/src/property.cc +96 -0
  231. data/ext/v8/upstream/2.0.6/src/property.h +327 -0
  232. data/ext/v8/upstream/2.0.6/src/regexp-delay.js +406 -0
  233. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  234. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp.cc +464 -0
  235. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-irregexp.h +141 -0
  236. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-tracer.cc +356 -0
  237. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler-tracer.h +103 -0
  238. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler.cc +240 -0
  239. data/ext/v8/upstream/2.0.6/src/regexp-macro-assembler.h +220 -0
  240. data/ext/v8/upstream/2.0.6/src/regexp-stack.cc +103 -0
  241. data/ext/v8/upstream/2.0.6/src/regexp-stack.h +123 -0
  242. data/ext/v8/upstream/2.0.6/src/register-allocator-inl.h +74 -0
  243. data/ext/v8/upstream/2.0.6/src/register-allocator.cc +100 -0
  244. data/ext/v8/upstream/2.0.6/src/register-allocator.h +295 -0
  245. data/ext/v8/upstream/2.0.6/src/rewriter.cc +855 -0
  246. data/ext/v8/upstream/2.0.6/src/rewriter.h +54 -0
  247. data/ext/v8/upstream/2.0.6/src/runtime.cc +8163 -0
  248. data/ext/v8/upstream/2.0.6/src/runtime.h +432 -0
  249. data/ext/v8/upstream/2.0.6/src/runtime.js +626 -0
  250. data/ext/v8/upstream/2.0.6/src/scanner.cc +1098 -0
  251. data/ext/v8/upstream/2.0.6/src/scanner.h +425 -0
  252. data/ext/v8/upstream/2.0.6/src/scopeinfo.cc +649 -0
  253. data/ext/v8/upstream/2.0.6/src/scopeinfo.h +236 -0
  254. data/ext/v8/upstream/2.0.6/src/scopes.cc +963 -0
  255. data/ext/v8/upstream/2.0.6/src/scopes.h +401 -0
  256. data/ext/v8/upstream/2.0.6/src/serialize.cc +1260 -0
  257. data/ext/v8/upstream/2.0.6/src/serialize.h +404 -0
  258. data/ext/v8/upstream/2.0.6/src/shell.h +55 -0
  259. data/ext/v8/upstream/2.0.6/src/simulator.h +41 -0
  260. data/ext/v8/upstream/2.0.6/src/smart-pointer.h +109 -0
  261. data/ext/v8/upstream/2.0.6/src/snapshot-common.cc +97 -0
  262. data/ext/v8/upstream/2.0.6/src/snapshot-empty.cc +40 -0
  263. data/ext/v8/upstream/2.0.6/src/snapshot.h +59 -0
  264. data/ext/v8/upstream/2.0.6/src/spaces-inl.h +372 -0
  265. data/ext/v8/upstream/2.0.6/src/spaces.cc +2864 -0
  266. data/ext/v8/upstream/2.0.6/src/spaces.h +2072 -0
  267. data/ext/v8/upstream/2.0.6/src/string-stream.cc +584 -0
  268. data/ext/v8/upstream/2.0.6/src/string-stream.h +189 -0
  269. data/ext/v8/upstream/2.0.6/src/string.js +901 -0
  270. data/ext/v8/upstream/2.0.6/src/stub-cache.cc +1108 -0
  271. data/ext/v8/upstream/2.0.6/src/stub-cache.h +578 -0
  272. data/ext/v8/upstream/2.0.6/src/third_party/dtoa/COPYING +15 -0
  273. data/ext/v8/upstream/2.0.6/src/third_party/dtoa/dtoa.c +3330 -0
  274. data/ext/v8/upstream/2.0.6/src/third_party/valgrind/valgrind.h +3925 -0
  275. data/ext/v8/upstream/2.0.6/src/token.cc +56 -0
  276. data/ext/v8/upstream/2.0.6/src/token.h +270 -0
  277. data/ext/v8/upstream/2.0.6/src/top.cc +991 -0
  278. data/ext/v8/upstream/2.0.6/src/top.h +459 -0
  279. data/ext/v8/upstream/2.0.6/src/unicode-inl.h +238 -0
  280. data/ext/v8/upstream/2.0.6/src/unicode.cc +749 -0
  281. data/ext/v8/upstream/2.0.6/src/unicode.h +279 -0
  282. data/ext/v8/upstream/2.0.6/src/uri.js +415 -0
  283. data/ext/v8/upstream/2.0.6/src/usage-analyzer.cc +426 -0
  284. data/ext/v8/upstream/2.0.6/src/usage-analyzer.h +40 -0
  285. data/ext/v8/upstream/2.0.6/src/utils.cc +322 -0
  286. data/ext/v8/upstream/2.0.6/src/utils.h +592 -0
  287. data/ext/v8/upstream/2.0.6/src/v8-counters.cc +55 -0
  288. data/ext/v8/upstream/2.0.6/src/v8-counters.h +198 -0
  289. data/ext/v8/upstream/2.0.6/src/v8.cc +193 -0
  290. data/ext/v8/upstream/2.0.6/src/v8.h +119 -0
  291. data/ext/v8/upstream/2.0.6/src/v8natives.js +846 -0
  292. data/ext/v8/upstream/2.0.6/src/v8threads.cc +450 -0
  293. data/ext/v8/upstream/2.0.6/src/v8threads.h +144 -0
  294. data/ext/v8/upstream/2.0.6/src/variables.cc +163 -0
  295. data/ext/v8/upstream/2.0.6/src/variables.h +235 -0
  296. data/ext/v8/upstream/2.0.6/src/version.cc +88 -0
  297. data/ext/v8/upstream/2.0.6/src/version.h +64 -0
  298. data/ext/v8/upstream/2.0.6/src/virtual-frame.cc +381 -0
  299. data/ext/v8/upstream/2.0.6/src/virtual-frame.h +44 -0
  300. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64-inl.h +352 -0
  301. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64.cc +2539 -0
  302. data/ext/v8/upstream/2.0.6/src/x64/assembler-x64.h +1399 -0
  303. data/ext/v8/upstream/2.0.6/src/x64/builtins-x64.cc +1255 -0
  304. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64-inl.h +46 -0
  305. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64.cc +8223 -0
  306. data/ext/v8/upstream/2.0.6/src/x64/codegen-x64.h +785 -0
  307. data/ext/v8/upstream/2.0.6/src/x64/cpu-x64.cc +79 -0
  308. data/ext/v8/upstream/2.0.6/src/x64/debug-x64.cc +202 -0
  309. data/ext/v8/upstream/2.0.6/src/x64/disasm-x64.cc +1596 -0
  310. data/ext/v8/upstream/2.0.6/src/x64/fast-codegen-x64.cc +1820 -0
  311. data/ext/v8/upstream/2.0.6/src/x64/frames-x64.cc +109 -0
  312. data/ext/v8/upstream/2.0.6/src/x64/frames-x64.h +121 -0
  313. data/ext/v8/upstream/2.0.6/src/x64/ic-x64.cc +1392 -0
  314. data/ext/v8/upstream/2.0.6/src/x64/jump-target-x64.cc +432 -0
  315. data/ext/v8/upstream/2.0.6/src/x64/macro-assembler-x64.cc +2409 -0
  316. data/ext/v8/upstream/2.0.6/src/x64/macro-assembler-x64.h +765 -0
  317. data/ext/v8/upstream/2.0.6/src/x64/regexp-macro-assembler-x64.cc +1337 -0
  318. data/ext/v8/upstream/2.0.6/src/x64/regexp-macro-assembler-x64.h +295 -0
  319. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64-inl.h +86 -0
  320. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64.cc +84 -0
  321. data/ext/v8/upstream/2.0.6/src/x64/register-allocator-x64.h +43 -0
  322. data/ext/v8/upstream/2.0.6/src/x64/simulator-x64.cc +27 -0
  323. data/ext/v8/upstream/2.0.6/src/x64/simulator-x64.h +63 -0
  324. data/ext/v8/upstream/2.0.6/src/x64/stub-cache-x64.cc +1884 -0
  325. data/ext/v8/upstream/2.0.6/src/x64/virtual-frame-x64.cc +1089 -0
  326. data/ext/v8/upstream/2.0.6/src/x64/virtual-frame-x64.h +560 -0
  327. data/ext/v8/upstream/2.0.6/src/zone-inl.h +297 -0
  328. data/ext/v8/upstream/2.0.6/src/zone.cc +193 -0
  329. data/ext/v8/upstream/2.0.6/src/zone.h +305 -0
  330. data/ext/v8/upstream/2.0.6/test/cctest/SConscript +95 -0
  331. data/ext/v8/upstream/2.0.6/test/cctest/cctest.cc +126 -0
  332. data/ext/v8/upstream/2.0.6/test/cctest/cctest.h +211 -0
  333. data/ext/v8/upstream/2.0.6/test/cctest/cctest.status +54 -0
  334. data/ext/v8/upstream/2.0.6/test/cctest/test-accessors.cc +450 -0
  335. data/ext/v8/upstream/2.0.6/test/cctest/test-alloc.cc +215 -0
  336. data/ext/v8/upstream/2.0.6/test/cctest/test-api.cc +8699 -0
  337. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-arm.cc +227 -0
  338. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-ia32.cc +395 -0
  339. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-x64.cc +292 -0
  340. data/ext/v8/upstream/2.0.6/test/cctest/test-ast.cc +97 -0
  341. data/ext/v8/upstream/2.0.6/test/cctest/test-compiler.cc +318 -0
  342. data/ext/v8/upstream/2.0.6/test/cctest/test-conversions.cc +130 -0
  343. data/ext/v8/upstream/2.0.6/test/cctest/test-debug.cc +5788 -0
  344. data/ext/v8/upstream/2.0.6/test/cctest/test-decls.cc +593 -0
  345. data/ext/v8/upstream/2.0.6/test/cctest/test-disasm-arm.cc +281 -0
  346. data/ext/v8/upstream/2.0.6/test/cctest/test-disasm-ia32.cc +418 -0
  347. data/ext/v8/upstream/2.0.6/test/cctest/test-flags.cc +234 -0
  348. data/ext/v8/upstream/2.0.6/test/cctest/test-func-name-inference.cc +267 -0
  349. data/ext/v8/upstream/2.0.6/test/cctest/test-hashmap.cc +176 -0
  350. data/ext/v8/upstream/2.0.6/test/cctest/test-heap-profiler.cc +396 -0
  351. data/ext/v8/upstream/2.0.6/test/cctest/test-heap.cc +796 -0
  352. data/ext/v8/upstream/2.0.6/test/cctest/test-list.cc +101 -0
  353. data/ext/v8/upstream/2.0.6/test/cctest/test-lock.cc +63 -0
  354. data/ext/v8/upstream/2.0.6/test/cctest/test-log-stack-tracer.cc +372 -0
  355. data/ext/v8/upstream/2.0.6/test/cctest/test-log-utils.cc +310 -0
  356. data/ext/v8/upstream/2.0.6/test/cctest/test-log.cc +1081 -0
  357. data/ext/v8/upstream/2.0.6/test/cctest/test-macro-assembler-x64.cc +2104 -0
  358. data/ext/v8/upstream/2.0.6/test/cctest/test-mark-compact.cc +341 -0
  359. data/ext/v8/upstream/2.0.6/test/cctest/test-parsing.cc +129 -0
  360. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-linux.cc +80 -0
  361. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-macos.cc +10 -0
  362. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-nullos.cc +80 -0
  363. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-win32.cc +26 -0
  364. data/ext/v8/upstream/2.0.6/test/cctest/test-regexp.cc +1815 -0
  365. data/ext/v8/upstream/2.0.6/test/cctest/test-serialize.cc +438 -0
  366. data/ext/v8/upstream/2.0.6/test/cctest/test-sockets.cc +162 -0
  367. data/ext/v8/upstream/2.0.6/test/cctest/test-spaces.cc +248 -0
  368. data/ext/v8/upstream/2.0.6/test/cctest/test-strings.cc +432 -0
  369. data/ext/v8/upstream/2.0.6/test/cctest/test-thread-termination.cc +290 -0
  370. data/ext/v8/upstream/2.0.6/test/cctest/test-threads.cc +52 -0
  371. data/ext/v8/upstream/2.0.6/test/cctest/test-utils.cc +186 -0
  372. data/ext/v8/upstream/2.0.6/test/cctest/test-version.cc +89 -0
  373. data/ext/v8/upstream/2.0.6/test/cctest/testcfg.py +108 -0
  374. data/ext/v8/upstream/2.0.6/test/es5conform/README +14 -0
  375. data/ext/v8/upstream/2.0.6/test/es5conform/es5conform.status +226 -0
  376. data/ext/v8/upstream/2.0.6/test/es5conform/harness-adapt.js +74 -0
  377. data/ext/v8/upstream/2.0.6/test/es5conform/testcfg.py +108 -0
  378. data/ext/v8/upstream/2.0.6/test/message/message.status +31 -0
  379. data/ext/v8/upstream/2.0.6/test/message/overwritten-builtins.js +31 -0
  380. data/ext/v8/upstream/2.0.6/test/message/overwritten-builtins.out +30 -0
  381. data/ext/v8/upstream/2.0.6/test/message/regress/regress-73.js +33 -0
  382. data/ext/v8/upstream/2.0.6/test/message/regress/regress-73.out +30 -0
  383. data/ext/v8/upstream/2.0.6/test/message/regress/regress-75.js +32 -0
  384. data/ext/v8/upstream/2.0.6/test/message/regress/regress-75.out +30 -0
  385. data/ext/v8/upstream/2.0.6/test/message/simple-throw.js +28 -0
  386. data/ext/v8/upstream/2.0.6/test/message/simple-throw.out +30 -0
  387. data/ext/v8/upstream/2.0.6/test/message/testcfg.py +135 -0
  388. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-no-message.js +51 -0
  389. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-no-message.out +26 -0
  390. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-return-in-finally.js +39 -0
  391. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-return-in-finally.out +28 -0
  392. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch-and-finally.js +34 -0
  393. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch-and-finally.out +30 -0
  394. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch.js +34 -0
  395. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch.out +30 -0
  396. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-finally.js +34 -0
  397. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-finally.out +30 -0
  398. data/ext/v8/upstream/2.0.6/test/message/try-finally-return-in-finally.js +37 -0
  399. data/ext/v8/upstream/2.0.6/test/message/try-finally-return-in-finally.out +28 -0
  400. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-finally.js +32 -0
  401. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-finally.out +30 -0
  402. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try-and-finally.js +32 -0
  403. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try-and-finally.out +30 -0
  404. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try.js +32 -0
  405. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try.out +30 -0
  406. data/ext/v8/upstream/2.0.6/test/mjsunit/api-call-after-bypassed-exception.js +39 -0
  407. data/ext/v8/upstream/2.0.6/test/mjsunit/apply.js +196 -0
  408. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-apply.js +134 -0
  409. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-call-apply.js +41 -0
  410. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-enum.js +52 -0
  411. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-indirect.js +47 -0
  412. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-lazy.js +47 -0
  413. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-opt.js +130 -0
  414. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-read-and-assignment.js +164 -0
  415. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments.js +97 -0
  416. data/ext/v8/upstream/2.0.6/test/mjsunit/array-concat.js +120 -0
  417. data/ext/v8/upstream/2.0.6/test/mjsunit/array-constructor.js +119 -0
  418. data/ext/v8/upstream/2.0.6/test/mjsunit/array-functions-prototype.js +159 -0
  419. data/ext/v8/upstream/2.0.6/test/mjsunit/array-indexing.js +66 -0
  420. data/ext/v8/upstream/2.0.6/test/mjsunit/array-iteration.js +228 -0
  421. data/ext/v8/upstream/2.0.6/test/mjsunit/array-join.js +45 -0
  422. data/ext/v8/upstream/2.0.6/test/mjsunit/array-length-number-conversion.js +53 -0
  423. data/ext/v8/upstream/2.0.6/test/mjsunit/array-length.js +111 -0
  424. data/ext/v8/upstream/2.0.6/test/mjsunit/array-reduce.js +514 -0
  425. data/ext/v8/upstream/2.0.6/test/mjsunit/array-sort.js +362 -0
  426. data/ext/v8/upstream/2.0.6/test/mjsunit/array-splice.js +314 -0
  427. data/ext/v8/upstream/2.0.6/test/mjsunit/ascii-regexp-subject.js +49 -0
  428. data/ext/v8/upstream/2.0.6/test/mjsunit/big-array-literal.js +111 -0
  429. data/ext/v8/upstream/2.0.6/test/mjsunit/big-object-literal.js +114 -0
  430. data/ext/v8/upstream/2.0.6/test/mjsunit/binary-operation-overwrite.js +36 -0
  431. data/ext/v8/upstream/2.0.6/test/mjsunit/bit-not.js +75 -0
  432. data/ext/v8/upstream/2.0.6/test/mjsunit/bitwise-operations-undefined.js +49 -0
  433. data/ext/v8/upstream/2.0.6/test/mjsunit/body-not-visible.js +39 -0
  434. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-1344252.js +79 -0
  435. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-222.js +42 -0
  436. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-223.js +39 -0
  437. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-900066.js +38 -0
  438. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-941049.js +100 -0
  439. data/ext/v8/upstream/2.0.6/test/mjsunit/call-non-function-call.js +38 -0
  440. data/ext/v8/upstream/2.0.6/test/mjsunit/call-non-function.js +63 -0
  441. data/ext/v8/upstream/2.0.6/test/mjsunit/call.js +87 -0
  442. data/ext/v8/upstream/2.0.6/test/mjsunit/char-escape.js +53 -0
  443. data/ext/v8/upstream/2.0.6/test/mjsunit/class-of-builtins.js +50 -0
  444. data/ext/v8/upstream/2.0.6/test/mjsunit/closure.js +37 -0
  445. data/ext/v8/upstream/2.0.6/test/mjsunit/codegen-coverage.js +91 -0
  446. data/ext/v8/upstream/2.0.6/test/mjsunit/compare-character.js +50 -0
  447. data/ext/v8/upstream/2.0.6/test/mjsunit/compare-nan.js +66 -0
  448. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/countoperation.js +111 -0
  449. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/function-call.js +52 -0
  450. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/globals.js +65 -0
  451. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/jsnatives.js +33 -0
  452. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/literals-assignment.js +104 -0
  453. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/literals.js +52 -0
  454. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/loops.js +35 -0
  455. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/objectliterals.js +57 -0
  456. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/property-simple.js +39 -0
  457. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/short-circuit.js +102 -0
  458. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/thisfunction.js +35 -0
  459. data/ext/v8/upstream/2.0.6/test/mjsunit/const-declaration.js +172 -0
  460. data/ext/v8/upstream/2.0.6/test/mjsunit/const-eval-init.js +111 -0
  461. data/ext/v8/upstream/2.0.6/test/mjsunit/const-redecl.js +220 -0
  462. data/ext/v8/upstream/2.0.6/test/mjsunit/const.js +70 -0
  463. data/ext/v8/upstream/2.0.6/test/mjsunit/constant-folding.js +232 -0
  464. data/ext/v8/upstream/2.0.6/test/mjsunit/context-variable-assignments.js +37 -0
  465. data/ext/v8/upstream/2.0.6/test/mjsunit/cyclic-array-to-string.js +65 -0
  466. data/ext/v8/upstream/2.0.6/test/mjsunit/cyrillic.js +199 -0
  467. data/ext/v8/upstream/2.0.6/test/mjsunit/d8-os.js +180 -0
  468. data/ext/v8/upstream/2.0.6/test/mjsunit/date-parse.js +268 -0
  469. data/ext/v8/upstream/2.0.6/test/mjsunit/date.js +149 -0
  470. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-backtrace-text.js +122 -0
  471. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-backtrace.js +272 -0
  472. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-breakpoints.js +120 -0
  473. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-changebreakpoint.js +108 -0
  474. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-clearbreakpoint.js +101 -0
  475. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-clearbreakpointgroup.js +117 -0
  476. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-compile-event.js +126 -0
  477. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-conditional-breakpoints.js +171 -0
  478. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-constructed-by.js +60 -0
  479. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-constructor.js +78 -0
  480. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-continue.js +114 -0
  481. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-enable-disable-breakpoints.js +90 -0
  482. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-arguments.js +93 -0
  483. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-bool-constructor.js +80 -0
  484. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-locals.js +132 -0
  485. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-recursive.js +167 -0
  486. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-with.js +77 -0
  487. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate.js +118 -0
  488. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-event-listener.js +73 -0
  489. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-handle.js +252 -0
  490. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-ignore-breakpoints.js +89 -0
  491. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-mirror-cache.js +85 -0
  492. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-multiple-breakpoints.js +105 -0
  493. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-referenced-by.js +112 -0
  494. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-references.js +118 -0
  495. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-scopes.js +761 -0
  496. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-script-breakpoints.js +112 -0
  497. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-script.js +92 -0
  498. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-scripts-request.js +108 -0
  499. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-setbreakpoint.js +165 -0
  500. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-sourceinfo.js +352 -0
  501. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-sourceslice.js +74 -0
  502. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-step-stub-callfunction.js +87 -0
  503. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-step.js +82 -0
  504. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-accessor.js +248 -0
  505. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-builtin.js +78 -0
  506. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-call-function-stub.js +115 -0
  507. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-constructor.js +78 -0
  508. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-function-call.js +149 -0
  509. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepnext-do-while.js +79 -0
  510. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepout-recursive-function.js +106 -0
  511. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepout-to-builtin.js +84 -0
  512. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-suspend.js +96 -0
  513. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-version.js +90 -0
  514. data/ext/v8/upstream/2.0.6/test/mjsunit/declare-locally.js +43 -0
  515. data/ext/v8/upstream/2.0.6/test/mjsunit/deep-recursion.js +66 -0
  516. data/ext/v8/upstream/2.0.6/test/mjsunit/delay-syntax-error.js +41 -0
  517. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-global-properties.js +37 -0
  518. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-in-eval.js +32 -0
  519. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-in-with.js +34 -0
  520. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-vars-from-eval.js +40 -0
  521. data/ext/v8/upstream/2.0.6/test/mjsunit/delete.js +163 -0
  522. data/ext/v8/upstream/2.0.6/test/mjsunit/div-mod.js +157 -0
  523. data/ext/v8/upstream/2.0.6/test/mjsunit/do-not-strip-fc.js +31 -0
  524. data/ext/v8/upstream/2.0.6/test/mjsunit/dont-enum-array-holes.js +35 -0
  525. data/ext/v8/upstream/2.0.6/test/mjsunit/dont-reinit-global-var.js +47 -0
  526. data/ext/v8/upstream/2.0.6/test/mjsunit/double-equals.js +114 -0
  527. data/ext/v8/upstream/2.0.6/test/mjsunit/dtoa.js +32 -0
  528. data/ext/v8/upstream/2.0.6/test/mjsunit/enumeration-order.js +109 -0
  529. data/ext/v8/upstream/2.0.6/test/mjsunit/error-constructors.js +32 -0
  530. data/ext/v8/upstream/2.0.6/test/mjsunit/escape.js +118 -0
  531. data/ext/v8/upstream/2.0.6/test/mjsunit/eval-enclosing-function-name.js +76 -0
  532. data/ext/v8/upstream/2.0.6/test/mjsunit/eval-typeof-non-existing.js +35 -0
  533. data/ext/v8/upstream/2.0.6/test/mjsunit/eval.js +157 -0
  534. data/ext/v8/upstream/2.0.6/test/mjsunit/execScript-case-insensitive.js +34 -0
  535. data/ext/v8/upstream/2.0.6/test/mjsunit/extra-arguments.js +54 -0
  536. data/ext/v8/upstream/2.0.6/test/mjsunit/extra-commas.js +46 -0
  537. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in-null-or-undefined.js +33 -0
  538. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in-special-cases.js +64 -0
  539. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in.js +86 -0
  540. data/ext/v8/upstream/2.0.6/test/mjsunit/fun-as-prototype.js +36 -0
  541. data/ext/v8/upstream/2.0.6/test/mjsunit/fun-name.js +34 -0
  542. data/ext/v8/upstream/2.0.6/test/mjsunit/function-arguments-null.js +30 -0
  543. data/ext/v8/upstream/2.0.6/test/mjsunit/function-caller.js +48 -0
  544. data/ext/v8/upstream/2.0.6/test/mjsunit/function-names.js +133 -0
  545. data/ext/v8/upstream/2.0.6/test/mjsunit/function-property.js +29 -0
  546. data/ext/v8/upstream/2.0.6/test/mjsunit/function-prototype.js +98 -0
  547. data/ext/v8/upstream/2.0.6/test/mjsunit/function-source.js +49 -0
  548. data/ext/v8/upstream/2.0.6/test/mjsunit/function.js +83 -0
  549. data/ext/v8/upstream/2.0.6/test/mjsunit/fuzz-accessors.js +85 -0
  550. data/ext/v8/upstream/2.0.6/test/mjsunit/fuzz-natives.js +159 -0
  551. data/ext/v8/upstream/2.0.6/test/mjsunit/get-own-property-descriptor.js +51 -0
  552. data/ext/v8/upstream/2.0.6/test/mjsunit/get-prototype-of.js +68 -0
  553. data/ext/v8/upstream/2.0.6/test/mjsunit/getter-in-prototype.js +50 -0
  554. data/ext/v8/upstream/2.0.6/test/mjsunit/getter-in-value-prototype.js +35 -0
  555. data/ext/v8/upstream/2.0.6/test/mjsunit/global-const-var-conflicts.js +57 -0
  556. data/ext/v8/upstream/2.0.6/test/mjsunit/global-deleted-property-ic.js +45 -0
  557. data/ext/v8/upstream/2.0.6/test/mjsunit/global-deleted-property-keyed.js +38 -0
  558. data/ext/v8/upstream/2.0.6/test/mjsunit/global-ic.js +48 -0
  559. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-eval-in-with.js +59 -0
  560. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-eval.js +85 -0
  561. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-nested-eval.js +66 -0
  562. data/ext/v8/upstream/2.0.6/test/mjsunit/global-vars-eval.js +34 -0
  563. data/ext/v8/upstream/2.0.6/test/mjsunit/global-vars-with.js +43 -0
  564. data/ext/v8/upstream/2.0.6/test/mjsunit/greedy.js +60 -0
  565. data/ext/v8/upstream/2.0.6/test/mjsunit/has-own-property.js +38 -0
  566. data/ext/v8/upstream/2.0.6/test/mjsunit/html-comments.js +57 -0
  567. data/ext/v8/upstream/2.0.6/test/mjsunit/html-string-funcs.js +47 -0
  568. data/ext/v8/upstream/2.0.6/test/mjsunit/if-in-undefined.js +36 -0
  569. data/ext/v8/upstream/2.0.6/test/mjsunit/in.js +159 -0
  570. data/ext/v8/upstream/2.0.6/test/mjsunit/indexed-accessors.js +120 -0
  571. data/ext/v8/upstream/2.0.6/test/mjsunit/instanceof.js +93 -0
  572. data/ext/v8/upstream/2.0.6/test/mjsunit/integer-to-string.js +35 -0
  573. data/ext/v8/upstream/2.0.6/test/mjsunit/invalid-lhs.js +65 -0
  574. data/ext/v8/upstream/2.0.6/test/mjsunit/invalid-source-element.js +31 -0
  575. data/ext/v8/upstream/2.0.6/test/mjsunit/json.js +207 -0
  576. data/ext/v8/upstream/2.0.6/test/mjsunit/keyed-ic.js +236 -0
  577. data/ext/v8/upstream/2.0.6/test/mjsunit/keyed-storage-extend.js +55 -0
  578. data/ext/v8/upstream/2.0.6/test/mjsunit/large-object-allocation.js +300 -0
  579. data/ext/v8/upstream/2.0.6/test/mjsunit/large-object-literal.js +56 -0
  580. data/ext/v8/upstream/2.0.6/test/mjsunit/lazy-load.js +34 -0
  581. data/ext/v8/upstream/2.0.6/test/mjsunit/leakcheck.js +53 -0
  582. data/ext/v8/upstream/2.0.6/test/mjsunit/length.js +78 -0
  583. data/ext/v8/upstream/2.0.6/test/mjsunit/local-load-from-eval.js +39 -0
  584. data/ext/v8/upstream/2.0.6/test/mjsunit/math-min-max.js +105 -0
  585. data/ext/v8/upstream/2.0.6/test/mjsunit/megamorphic-callbacks.js +70 -0
  586. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-array.js +138 -0
  587. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-boolean.js +59 -0
  588. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-date.js +77 -0
  589. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-error.js +94 -0
  590. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-function.js +90 -0
  591. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-null.js +50 -0
  592. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-number.js +77 -0
  593. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-object.js +227 -0
  594. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-regexp.js +110 -0
  595. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-script.js +100 -0
  596. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-string.js +89 -0
  597. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-undefined.js +50 -0
  598. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-unresolved-function.js +81 -0
  599. data/ext/v8/upstream/2.0.6/test/mjsunit/mjsunit.js +203 -0
  600. data/ext/v8/upstream/2.0.6/test/mjsunit/mjsunit.status +66 -0
  601. data/ext/v8/upstream/2.0.6/test/mjsunit/mul-exhaustive.js +4511 -0
  602. data/ext/v8/upstream/2.0.6/test/mjsunit/multiple-return.js +62 -0
  603. data/ext/v8/upstream/2.0.6/test/mjsunit/negate-zero.js +42 -0
  604. data/ext/v8/upstream/2.0.6/test/mjsunit/negate.js +59 -0
  605. data/ext/v8/upstream/2.0.6/test/mjsunit/new.js +56 -0
  606. data/ext/v8/upstream/2.0.6/test/mjsunit/newline-in-string.js +46 -0
  607. data/ext/v8/upstream/2.0.6/test/mjsunit/no-branch-elimination.js +36 -0
  608. data/ext/v8/upstream/2.0.6/test/mjsunit/no-octal-constants-above-256.js +32 -0
  609. data/ext/v8/upstream/2.0.6/test/mjsunit/no-semicolon.js +45 -0
  610. data/ext/v8/upstream/2.0.6/test/mjsunit/non-ascii-replace.js +30 -0
  611. data/ext/v8/upstream/2.0.6/test/mjsunit/nul-characters.js +38 -0
  612. data/ext/v8/upstream/2.0.6/test/mjsunit/number-limits.js +47 -0
  613. data/ext/v8/upstream/2.0.6/test/mjsunit/number-string-index-call.js +32 -0
  614. data/ext/v8/upstream/2.0.6/test/mjsunit/number-tostring-small.js +395 -0
  615. data/ext/v8/upstream/2.0.6/test/mjsunit/number-tostring.js +338 -0
  616. data/ext/v8/upstream/2.0.6/test/mjsunit/obj-construct.js +46 -0
  617. data/ext/v8/upstream/2.0.6/test/mjsunit/object-create.js +250 -0
  618. data/ext/v8/upstream/2.0.6/test/mjsunit/object-literal-gc.js +66 -0
  619. data/ext/v8/upstream/2.0.6/test/mjsunit/object-literal.js +105 -0
  620. data/ext/v8/upstream/2.0.6/test/mjsunit/override-read-only-property.js +64 -0
  621. data/ext/v8/upstream/2.0.6/test/mjsunit/parse-int-float.js +85 -0
  622. data/ext/v8/upstream/2.0.6/test/mjsunit/property-load-across-eval.js +85 -0
  623. data/ext/v8/upstream/2.0.6/test/mjsunit/property-object-key.js +36 -0
  624. data/ext/v8/upstream/2.0.6/test/mjsunit/proto.js +33 -0
  625. data/ext/v8/upstream/2.0.6/test/mjsunit/prototype.js +93 -0
  626. data/ext/v8/upstream/2.0.6/test/mjsunit/receiver-in-with-calls.js +47 -0
  627. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-UC16.js +47 -0
  628. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-call-as-function.js +36 -0
  629. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-capture.js +57 -0
  630. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-captures.js +31 -0
  631. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-indexof.js +77 -0
  632. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-lookahead.js +166 -0
  633. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-loop-capture.js +29 -0
  634. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-multiline-stack-trace.js +116 -0
  635. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-multiline.js +112 -0
  636. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-standalones.js +78 -0
  637. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-static.js +167 -0
  638. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-string-methods.js +51 -0
  639. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp.js +390 -0
  640. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1030466.js +45 -0
  641. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1036894.js +38 -0
  642. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1039610.js +29 -0
  643. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1050043.js +51 -0
  644. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1062422.js +30 -0
  645. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1066899.js +37 -0
  646. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1081309.js +110 -0
  647. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1102760.js +35 -0
  648. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1110164.js +46 -0
  649. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1112051.js +33 -0
  650. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1114040.js +58 -0
  651. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1134697.js +31 -0
  652. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-114.js +43 -0
  653. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-116.js +40 -0
  654. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1170187.js +80 -0
  655. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1173979.js +48 -0
  656. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1175390.js +30 -0
  657. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1177518.js +39 -0
  658. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1177809.js +31 -0
  659. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1178598.js +90 -0
  660. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1182832.js +38 -0
  661. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1187524.js +34 -0
  662. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1199401.js +75 -0
  663. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1199637.js +78 -0
  664. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1200351.js +2032 -0
  665. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1201933.js +40 -0
  666. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1203459.js +29 -0
  667. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1207276.js +36 -0
  668. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1213516.js +40 -0
  669. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1213575.js +41 -0
  670. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1215653.js +365 -0
  671. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-124.js +57 -0
  672. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1254366.js +38 -0
  673. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1327557.js +36 -0
  674. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1341167.js +33 -0
  675. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1346700.js +29 -0
  676. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-137.js +46 -0
  677. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1439135.js +40 -0
  678. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-149.js +28 -0
  679. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1493017.js +52 -0
  680. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-155924.js +46 -0
  681. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-171.js +41 -0
  682. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-176.js +50 -0
  683. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-186.js +72 -0
  684. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-187.js +30 -0
  685. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-189.js +36 -0
  686. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-191.js +42 -0
  687. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1919169.js +40 -0
  688. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-192.js +38 -0
  689. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-193.js +44 -0
  690. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-20070207.js +42 -0
  691. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-201.js +37 -0
  692. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-219.js +176 -0
  693. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-220.js +31 -0
  694. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-221.js +34 -0
  695. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-2249423.js +40 -0
  696. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-225.js +32 -0
  697. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-227.js +33 -0
  698. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-231.js +92 -0
  699. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-233.js +39 -0
  700. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-244.js +67 -0
  701. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-246.js +31 -0
  702. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-253.js +31 -0
  703. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-254.js +58 -0
  704. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-259.js +33 -0
  705. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-260.js +33 -0
  706. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-263.js +38 -0
  707. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-265.js +64 -0
  708. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-267.js +35 -0
  709. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-269.js +49 -0
  710. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-279.js +62 -0
  711. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-284.js +50 -0
  712. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-286.js +36 -0
  713. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-294.js +43 -0
  714. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-312.js +31 -0
  715. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-317.js +31 -0
  716. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-318.js +35 -0
  717. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-326.js +40 -0
  718. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-334.js +90 -0
  719. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-341.js +36 -0
  720. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-345.js +51 -0
  721. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-349.js +32 -0
  722. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-35.js +33 -0
  723. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-351.js +31 -0
  724. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-386.js +47 -0
  725. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-392.js +34 -0
  726. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-394.js +47 -0
  727. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-396.js +39 -0
  728. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-397.js +34 -0
  729. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-399.js +32 -0
  730. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-406.js +69 -0
  731. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-416.js +38 -0
  732. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-475.js +28 -0
  733. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-483.js +35 -0
  734. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-485.js +64 -0
  735. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-486.js +30 -0
  736. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-490.js +48 -0
  737. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-491.js +47 -0
  738. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-492.js +52 -0
  739. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-496.js +39 -0
  740. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-502.js +38 -0
  741. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-503.js +63 -0
  742. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-515.js +40 -0
  743. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-524.js +32 -0
  744. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-526.js +32 -0
  745. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-540.js +47 -0
  746. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-545.js +47 -0
  747. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-57.js +32 -0
  748. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-580.js +55 -0
  749. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-588599.js +31 -0
  750. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-6-9-regexp.js +30 -0
  751. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-662254.js +40 -0
  752. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-666721.js +53 -0
  753. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-667061.js +90 -0
  754. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-670147.js +34 -0
  755. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-674753.js +87 -0
  756. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-676025.js +31 -0
  757. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-678525.js +59 -0
  758. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-682649.js +30 -0
  759. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-69.js +43 -0
  760. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-734862.js +37 -0
  761. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-737588.js +34 -0
  762. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-74.js +41 -0
  763. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-780423.js +39 -0
  764. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-799761.js +92 -0
  765. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-806473.js +60 -0
  766. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-842017.js +60 -0
  767. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-86.js +46 -0
  768. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-87.js +58 -0
  769. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-874178.js +32 -0
  770. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-875031.js +37 -0
  771. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-877615.js +37 -0
  772. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-892742.js +50 -0
  773. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-900055.js +42 -0
  774. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-900966.js +38 -0
  775. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-91.js +38 -0
  776. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-925537.js +42 -0
  777. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-937896.js +50 -0
  778. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-990205.js +35 -0
  779. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-992733.js +35 -0
  780. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-996542.js +40 -0
  781. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-998565.js +51 -0
  782. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-crbug-18639.js +34 -0
  783. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-r3391.js +77 -0
  784. data/ext/v8/upstream/2.0.6/test/mjsunit/scanner.js +30 -0
  785. data/ext/v8/upstream/2.0.6/test/mjsunit/short-circuit-boolean.js +46 -0
  786. data/ext/v8/upstream/2.0.6/test/mjsunit/simple-constructor.js +140 -0
  787. data/ext/v8/upstream/2.0.6/test/mjsunit/sin-cos.js +45 -0
  788. data/ext/v8/upstream/2.0.6/test/mjsunit/smi-negative-zero.js +100 -0
  789. data/ext/v8/upstream/2.0.6/test/mjsunit/smi-ops.js +671 -0
  790. data/ext/v8/upstream/2.0.6/test/mjsunit/sparse-array-reverse.js +131 -0
  791. data/ext/v8/upstream/2.0.6/test/mjsunit/sparse-array.js +41 -0
  792. data/ext/v8/upstream/2.0.6/test/mjsunit/stack-traces.js +204 -0
  793. data/ext/v8/upstream/2.0.6/test/mjsunit/str-to-num.js +158 -0
  794. data/ext/v8/upstream/2.0.6/test/mjsunit/stress-array-push.js +34 -0
  795. data/ext/v8/upstream/2.0.6/test/mjsunit/strict-equals.js +90 -0
  796. data/ext/v8/upstream/2.0.6/test/mjsunit/string-add.js +195 -0
  797. data/ext/v8/upstream/2.0.6/test/mjsunit/string-case.js +28 -0
  798. data/ext/v8/upstream/2.0.6/test/mjsunit/string-charat.js +53 -0
  799. data/ext/v8/upstream/2.0.6/test/mjsunit/string-charcodeat.js +192 -0
  800. data/ext/v8/upstream/2.0.6/test/mjsunit/string-compare-alignment.js +47 -0
  801. data/ext/v8/upstream/2.0.6/test/mjsunit/string-flatten.js +37 -0
  802. data/ext/v8/upstream/2.0.6/test/mjsunit/string-index.js +154 -0
  803. data/ext/v8/upstream/2.0.6/test/mjsunit/string-indexof-1.js +99 -0
  804. data/ext/v8/upstream/2.0.6/test/mjsunit/string-indexof-2.js +68 -0
  805. data/ext/v8/upstream/2.0.6/test/mjsunit/string-lastindexof.js +88 -0
  806. data/ext/v8/upstream/2.0.6/test/mjsunit/string-localecompare.js +40 -0
  807. data/ext/v8/upstream/2.0.6/test/mjsunit/string-match.js +149 -0
  808. data/ext/v8/upstream/2.0.6/test/mjsunit/string-replace-gc.js +57 -0
  809. data/ext/v8/upstream/2.0.6/test/mjsunit/string-replace.js +182 -0
  810. data/ext/v8/upstream/2.0.6/test/mjsunit/string-search.js +30 -0
  811. data/ext/v8/upstream/2.0.6/test/mjsunit/string-split.js +126 -0
  812. data/ext/v8/upstream/2.0.6/test/mjsunit/substr.js +65 -0
  813. data/ext/v8/upstream/2.0.6/test/mjsunit/switch.js +289 -0
  814. data/ext/v8/upstream/2.0.6/test/mjsunit/testcfg.py +137 -0
  815. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/array-isarray.js +48 -0
  816. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/array-splice-webkit.js +62 -0
  817. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/object-keys.js +68 -0
  818. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/regexp-pcre.js +6603 -0
  819. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/string-trim.js +107 -0
  820. data/ext/v8/upstream/2.0.6/test/mjsunit/this-in-callbacks.js +47 -0
  821. data/ext/v8/upstream/2.0.6/test/mjsunit/this.js +46 -0
  822. data/ext/v8/upstream/2.0.6/test/mjsunit/throw-and-catch-function.js +50 -0
  823. data/ext/v8/upstream/2.0.6/test/mjsunit/throw-exception-for-null-access.js +37 -0
  824. data/ext/v8/upstream/2.0.6/test/mjsunit/to-precision.js +82 -0
  825. data/ext/v8/upstream/2.0.6/test/mjsunit/to_number_order.js +129 -0
  826. data/ext/v8/upstream/2.0.6/test/mjsunit/tobool.js +36 -0
  827. data/ext/v8/upstream/2.0.6/test/mjsunit/toint32.js +129 -0
  828. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/codemap.js +180 -0
  829. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/consarray.js +60 -0
  830. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/csvparser.js +79 -0
  831. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/logreader.js +98 -0
  832. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/profile.js +348 -0
  833. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/profile_view.js +95 -0
  834. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/splaytree.js +166 -0
  835. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.default +55 -0
  836. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.gc-state +21 -0
  837. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.ignore-unknown +51 -0
  838. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.separate-ic +61 -0
  839. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor.js +409 -0
  840. data/ext/v8/upstream/2.0.6/test/mjsunit/top-level-assignments.js +107 -0
  841. data/ext/v8/upstream/2.0.6/test/mjsunit/touint32.js +72 -0
  842. data/ext/v8/upstream/2.0.6/test/mjsunit/transcendentals.js +49 -0
  843. data/ext/v8/upstream/2.0.6/test/mjsunit/try-catch-extension-object.js +58 -0
  844. data/ext/v8/upstream/2.0.6/test/mjsunit/try-catch-scopes.js +42 -0
  845. data/ext/v8/upstream/2.0.6/test/mjsunit/try-finally-nested.js +46 -0
  846. data/ext/v8/upstream/2.0.6/test/mjsunit/try.js +394 -0
  847. data/ext/v8/upstream/2.0.6/test/mjsunit/typeof.js +40 -0
  848. data/ext/v8/upstream/2.0.6/test/mjsunit/undeletable-functions.js +181 -0
  849. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-case-overoptimization.js +35 -0
  850. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-string-to-number.js +46 -0
  851. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-test.js +9169 -0
  852. data/ext/v8/upstream/2.0.6/test/mjsunit/unusual-constructor.js +38 -0
  853. data/ext/v8/upstream/2.0.6/test/mjsunit/uri.js +78 -0
  854. data/ext/v8/upstream/2.0.6/test/mjsunit/value-callic-prototype-change.js +94 -0
  855. data/ext/v8/upstream/2.0.6/test/mjsunit/var.js +37 -0
  856. data/ext/v8/upstream/2.0.6/test/mjsunit/with-function-expression.js +36 -0
  857. data/ext/v8/upstream/2.0.6/test/mjsunit/with-leave.js +61 -0
  858. data/ext/v8/upstream/2.0.6/test/mjsunit/with-parameter-access.js +47 -0
  859. data/ext/v8/upstream/2.0.6/test/mjsunit/with-prototype.js +44 -0
  860. data/ext/v8/upstream/2.0.6/test/mjsunit/with-value.js +38 -0
  861. data/ext/v8/upstream/2.0.6/test/mozilla/mozilla-shell-emulation.js +37 -0
  862. data/ext/v8/upstream/2.0.6/test/mozilla/mozilla.status +815 -0
  863. data/ext/v8/upstream/2.0.6/test/mozilla/testcfg.py +138 -0
  864. data/ext/v8/upstream/2.0.6/test/sputnik/README +6 -0
  865. data/ext/v8/upstream/2.0.6/test/sputnik/sputnik.status +318 -0
  866. data/ext/v8/upstream/2.0.6/test/sputnik/testcfg.py +112 -0
  867. data/ext/v8/upstream/2.0.6/tools/codemap.js +258 -0
  868. data/ext/v8/upstream/2.0.6/tools/consarray.js +93 -0
  869. data/ext/v8/upstream/2.0.6/tools/csvparser.js +98 -0
  870. data/ext/v8/upstream/2.0.6/tools/gyp/v8.gyp +620 -0
  871. data/ext/v8/upstream/2.0.6/tools/js2c.py +376 -0
  872. data/ext/v8/upstream/2.0.6/tools/js2c.pyc +0 -0
  873. data/ext/v8/upstream/2.0.6/tools/jsmin.py +280 -0
  874. data/ext/v8/upstream/2.0.6/tools/jsmin.pyc +0 -0
  875. data/ext/v8/upstream/2.0.6/tools/linux-tick-processor +24 -0
  876. data/ext/v8/upstream/2.0.6/tools/linux-tick-processor.py +78 -0
  877. data/ext/v8/upstream/2.0.6/tools/logreader.js +320 -0
  878. data/ext/v8/upstream/2.0.6/tools/mac-nm +18 -0
  879. data/ext/v8/upstream/2.0.6/tools/mac-tick-processor +6 -0
  880. data/ext/v8/upstream/2.0.6/tools/oprofile/annotate +7 -0
  881. data/ext/v8/upstream/2.0.6/tools/oprofile/common +19 -0
  882. data/ext/v8/upstream/2.0.6/tools/oprofile/dump +7 -0
  883. data/ext/v8/upstream/2.0.6/tools/oprofile/report +7 -0
  884. data/ext/v8/upstream/2.0.6/tools/oprofile/reset +7 -0
  885. data/ext/v8/upstream/2.0.6/tools/oprofile/run +14 -0
  886. data/ext/v8/upstream/2.0.6/tools/oprofile/shutdown +7 -0
  887. data/ext/v8/upstream/2.0.6/tools/oprofile/start +7 -0
  888. data/ext/v8/upstream/2.0.6/tools/presubmit.py +299 -0
  889. data/ext/v8/upstream/2.0.6/tools/process-heap-prof.py +120 -0
  890. data/ext/v8/upstream/2.0.6/tools/profile.js +621 -0
  891. data/ext/v8/upstream/2.0.6/tools/profile_view.js +224 -0
  892. data/ext/v8/upstream/2.0.6/tools/run-valgrind.py +77 -0
  893. data/ext/v8/upstream/2.0.6/tools/splaytree.js +322 -0
  894. data/ext/v8/upstream/2.0.6/tools/splaytree.py +226 -0
  895. data/ext/v8/upstream/2.0.6/tools/stats-viewer.py +456 -0
  896. data/ext/v8/upstream/2.0.6/tools/test.py +1370 -0
  897. data/ext/v8/upstream/2.0.6/tools/tickprocessor-driver.js +53 -0
  898. data/ext/v8/upstream/2.0.6/tools/tickprocessor.js +731 -0
  899. data/ext/v8/upstream/2.0.6/tools/tickprocessor.py +535 -0
  900. data/ext/v8/upstream/2.0.6/tools/utils.py +82 -0
  901. data/ext/v8/upstream/2.0.6/tools/utils.pyc +0 -0
  902. data/ext/v8/upstream/2.0.6/tools/visual_studio/README.txt +71 -0
  903. data/ext/v8/upstream/2.0.6/tools/visual_studio/arm.vsprops +14 -0
  904. data/ext/v8/upstream/2.0.6/tools/visual_studio/common.vsprops +35 -0
  905. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8.vcproj +199 -0
  906. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8_arm.vcproj +199 -0
  907. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8_x64.vcproj +201 -0
  908. data/ext/v8/upstream/2.0.6/tools/visual_studio/d8js2c.cmd +6 -0
  909. data/ext/v8/upstream/2.0.6/tools/visual_studio/debug.vsprops +17 -0
  910. data/ext/v8/upstream/2.0.6/tools/visual_studio/ia32.vsprops +13 -0
  911. data/ext/v8/upstream/2.0.6/tools/visual_studio/js2c.cmd +6 -0
  912. data/ext/v8/upstream/2.0.6/tools/visual_studio/release.vsprops +24 -0
  913. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8.sln +101 -0
  914. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8.vcproj +223 -0
  915. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_arm.sln +74 -0
  916. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_arm.vcproj +223 -0
  917. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base.vcproj +971 -0
  918. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base_arm.vcproj +983 -0
  919. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_base_x64.vcproj +959 -0
  920. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest.vcproj +255 -0
  921. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest_arm.vcproj +243 -0
  922. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_cctest_x64.vcproj +257 -0
  923. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_mksnapshot.vcproj +151 -0
  924. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_mksnapshot_x64.vcproj +151 -0
  925. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample.vcproj +151 -0
  926. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample_arm.vcproj +151 -0
  927. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_process_sample_x64.vcproj +151 -0
  928. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample.vcproj +151 -0
  929. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample_arm.vcproj +151 -0
  930. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_shell_sample_x64.vcproj +153 -0
  931. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot.vcproj +142 -0
  932. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_cc.vcproj +92 -0
  933. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_cc_x64.vcproj +92 -0
  934. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_snapshot_x64.vcproj +142 -0
  935. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_x64.sln +101 -0
  936. data/ext/v8/upstream/2.0.6/tools/visual_studio/v8_x64.vcproj +223 -0
  937. data/ext/v8/upstream/2.0.6/tools/visual_studio/x64.vsprops +13 -0
  938. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.bat +5 -0
  939. data/ext/v8/upstream/2.0.6/tools/windows-tick-processor.py +137 -0
  940. data/ext/v8/upstream/scons/CHANGES.txt +5183 -0
  941. data/ext/v8/upstream/scons/LICENSE.txt +20 -0
  942. data/ext/v8/upstream/scons/MANIFEST +202 -0
  943. data/ext/v8/upstream/scons/PKG-INFO +13 -0
  944. data/ext/v8/upstream/scons/README.txt +273 -0
  945. data/ext/v8/upstream/scons/RELEASE.txt +1040 -0
  946. data/ext/v8/upstream/scons/engine/SCons/Action.py +1256 -0
  947. data/ext/v8/upstream/scons/engine/SCons/Builder.py +868 -0
  948. data/ext/v8/upstream/scons/engine/SCons/CacheDir.py +217 -0
  949. data/ext/v8/upstream/scons/engine/SCons/Conftest.py +794 -0
  950. data/ext/v8/upstream/scons/engine/SCons/Debug.py +237 -0
  951. data/ext/v8/upstream/scons/engine/SCons/Defaults.py +485 -0
  952. data/ext/v8/upstream/scons/engine/SCons/Environment.py +2327 -0
  953. data/ext/v8/upstream/scons/engine/SCons/Errors.py +207 -0
  954. data/ext/v8/upstream/scons/engine/SCons/Executor.py +636 -0
  955. data/ext/v8/upstream/scons/engine/SCons/Job.py +435 -0
  956. data/ext/v8/upstream/scons/engine/SCons/Memoize.py +292 -0
  957. data/ext/v8/upstream/scons/engine/SCons/Node/Alias.py +153 -0
  958. data/ext/v8/upstream/scons/engine/SCons/Node/FS.py +3220 -0
  959. data/ext/v8/upstream/scons/engine/SCons/Node/Python.py +128 -0
  960. data/ext/v8/upstream/scons/engine/SCons/Node/__init__.py +1341 -0
  961. data/ext/v8/upstream/scons/engine/SCons/Options/BoolOption.py +50 -0
  962. data/ext/v8/upstream/scons/engine/SCons/Options/EnumOption.py +50 -0
  963. data/ext/v8/upstream/scons/engine/SCons/Options/ListOption.py +50 -0
  964. data/ext/v8/upstream/scons/engine/SCons/Options/PackageOption.py +50 -0
  965. data/ext/v8/upstream/scons/engine/SCons/Options/PathOption.py +76 -0
  966. data/ext/v8/upstream/scons/engine/SCons/Options/__init__.py +74 -0
  967. data/ext/v8/upstream/scons/engine/SCons/PathList.py +232 -0
  968. data/ext/v8/upstream/scons/engine/SCons/Platform/__init__.py +236 -0
  969. data/ext/v8/upstream/scons/engine/SCons/Platform/aix.py +70 -0
  970. data/ext/v8/upstream/scons/engine/SCons/Platform/cygwin.py +55 -0
  971. data/ext/v8/upstream/scons/engine/SCons/Platform/darwin.py +46 -0
  972. data/ext/v8/upstream/scons/engine/SCons/Platform/hpux.py +46 -0
  973. data/ext/v8/upstream/scons/engine/SCons/Platform/irix.py +44 -0
  974. data/ext/v8/upstream/scons/engine/SCons/Platform/os2.py +58 -0
  975. data/ext/v8/upstream/scons/engine/SCons/Platform/posix.py +264 -0
  976. data/ext/v8/upstream/scons/engine/SCons/Platform/sunos.py +50 -0
  977. data/ext/v8/upstream/scons/engine/SCons/Platform/win32.py +386 -0
  978. data/ext/v8/upstream/scons/engine/SCons/SConf.py +1038 -0
  979. data/ext/v8/upstream/scons/engine/SCons/SConsign.py +381 -0
  980. data/ext/v8/upstream/scons/engine/SCons/Scanner/C.py +132 -0
  981. data/ext/v8/upstream/scons/engine/SCons/Scanner/D.py +74 -0
  982. data/ext/v8/upstream/scons/engine/SCons/Scanner/Dir.py +111 -0
  983. data/ext/v8/upstream/scons/engine/SCons/Scanner/Fortran.py +320 -0
  984. data/ext/v8/upstream/scons/engine/SCons/Scanner/IDL.py +48 -0
  985. data/ext/v8/upstream/scons/engine/SCons/Scanner/LaTeX.py +378 -0
  986. data/ext/v8/upstream/scons/engine/SCons/Scanner/Prog.py +103 -0
  987. data/ext/v8/upstream/scons/engine/SCons/Scanner/RC.py +55 -0
  988. data/ext/v8/upstream/scons/engine/SCons/Scanner/__init__.py +415 -0
  989. data/ext/v8/upstream/scons/engine/SCons/Script/Interactive.py +386 -0
  990. data/ext/v8/upstream/scons/engine/SCons/Script/Main.py +1360 -0
  991. data/ext/v8/upstream/scons/engine/SCons/Script/SConsOptions.py +944 -0
  992. data/ext/v8/upstream/scons/engine/SCons/Script/SConscript.py +642 -0
  993. data/ext/v8/upstream/scons/engine/SCons/Script/__init__.py +414 -0
  994. data/ext/v8/upstream/scons/engine/SCons/Sig.py +63 -0
  995. data/ext/v8/upstream/scons/engine/SCons/Subst.py +911 -0
  996. data/ext/v8/upstream/scons/engine/SCons/Taskmaster.py +1030 -0
  997. data/ext/v8/upstream/scons/engine/SCons/Tool/386asm.py +61 -0
  998. data/ext/v8/upstream/scons/engine/SCons/Tool/BitKeeper.py +65 -0
  999. data/ext/v8/upstream/scons/engine/SCons/Tool/CVS.py +73 -0
  1000. data/ext/v8/upstream/scons/engine/SCons/Tool/FortranCommon.py +247 -0
  1001. data/ext/v8/upstream/scons/engine/SCons/Tool/JavaCommon.py +324 -0
  1002. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/__init__.py +56 -0
  1003. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/arch.py +61 -0
  1004. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/common.py +210 -0
  1005. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/netframework.py +84 -0
  1006. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/sdk.py +321 -0
  1007. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vc.py +367 -0
  1008. data/ext/v8/upstream/scons/engine/SCons/Tool/MSCommon/vs.py +497 -0
  1009. data/ext/v8/upstream/scons/engine/SCons/Tool/Perforce.py +104 -0
  1010. data/ext/v8/upstream/scons/engine/SCons/Tool/PharLapCommon.py +138 -0
  1011. data/ext/v8/upstream/scons/engine/SCons/Tool/RCS.py +64 -0
  1012. data/ext/v8/upstream/scons/engine/SCons/Tool/SCCS.py +64 -0
  1013. data/ext/v8/upstream/scons/engine/SCons/Tool/Subversion.py +71 -0
  1014. data/ext/v8/upstream/scons/engine/SCons/Tool/__init__.py +675 -0
  1015. data/ext/v8/upstream/scons/engine/SCons/Tool/aixc++.py +82 -0
  1016. data/ext/v8/upstream/scons/engine/SCons/Tool/aixcc.py +74 -0
  1017. data/ext/v8/upstream/scons/engine/SCons/Tool/aixf77.py +80 -0
  1018. data/ext/v8/upstream/scons/engine/SCons/Tool/aixlink.py +76 -0
  1019. data/ext/v8/upstream/scons/engine/SCons/Tool/applelink.py +71 -0
  1020. data/ext/v8/upstream/scons/engine/SCons/Tool/ar.py +63 -0
  1021. data/ext/v8/upstream/scons/engine/SCons/Tool/as.py +78 -0
  1022. data/ext/v8/upstream/scons/engine/SCons/Tool/bcc32.py +82 -0
  1023. data/ext/v8/upstream/scons/engine/SCons/Tool/c++.py +99 -0
  1024. data/ext/v8/upstream/scons/engine/SCons/Tool/cc.py +114 -0
  1025. data/ext/v8/upstream/scons/engine/SCons/Tool/cvf.py +58 -0
  1026. data/ext/v8/upstream/scons/engine/SCons/Tool/default.py +50 -0
  1027. data/ext/v8/upstream/scons/engine/SCons/Tool/dmd.py +224 -0
  1028. data/ext/v8/upstream/scons/engine/SCons/Tool/dvi.py +64 -0
  1029. data/ext/v8/upstream/scons/engine/SCons/Tool/dvipdf.py +125 -0
  1030. data/ext/v8/upstream/scons/engine/SCons/Tool/dvips.py +94 -0
  1031. data/ext/v8/upstream/scons/engine/SCons/Tool/f77.py +62 -0
  1032. data/ext/v8/upstream/scons/engine/SCons/Tool/f90.py +62 -0
  1033. data/ext/v8/upstream/scons/engine/SCons/Tool/f95.py +63 -0
  1034. data/ext/v8/upstream/scons/engine/SCons/Tool/filesystem.py +98 -0
  1035. data/ext/v8/upstream/scons/engine/SCons/Tool/fortran.py +63 -0
  1036. data/ext/v8/upstream/scons/engine/SCons/Tool/g++.py +90 -0
  1037. data/ext/v8/upstream/scons/engine/SCons/Tool/g77.py +73 -0
  1038. data/ext/v8/upstream/scons/engine/SCons/Tool/gas.py +53 -0
  1039. data/ext/v8/upstream/scons/engine/SCons/Tool/gcc.py +80 -0
  1040. data/ext/v8/upstream/scons/engine/SCons/Tool/gfortran.py +64 -0
  1041. data/ext/v8/upstream/scons/engine/SCons/Tool/gnulink.py +63 -0
  1042. data/ext/v8/upstream/scons/engine/SCons/Tool/gs.py +81 -0
  1043. data/ext/v8/upstream/scons/engine/SCons/Tool/hpc++.py +85 -0
  1044. data/ext/v8/upstream/scons/engine/SCons/Tool/hpcc.py +53 -0
  1045. data/ext/v8/upstream/scons/engine/SCons/Tool/hplink.py +77 -0
  1046. data/ext/v8/upstream/scons/engine/SCons/Tool/icc.py +59 -0
  1047. data/ext/v8/upstream/scons/engine/SCons/Tool/icl.py +52 -0
  1048. data/ext/v8/upstream/scons/engine/SCons/Tool/ifl.py +72 -0
  1049. data/ext/v8/upstream/scons/engine/SCons/Tool/ifort.py +90 -0
  1050. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink.py +59 -0
  1051. data/ext/v8/upstream/scons/engine/SCons/Tool/ilink32.py +60 -0
  1052. data/ext/v8/upstream/scons/engine/SCons/Tool/install.py +229 -0
  1053. data/ext/v8/upstream/scons/engine/SCons/Tool/intelc.py +490 -0
  1054. data/ext/v8/upstream/scons/engine/SCons/Tool/ipkg.py +71 -0
  1055. data/ext/v8/upstream/scons/engine/SCons/Tool/jar.py +110 -0
  1056. data/ext/v8/upstream/scons/engine/SCons/Tool/javac.py +234 -0
  1057. data/ext/v8/upstream/scons/engine/SCons/Tool/javah.py +138 -0
  1058. data/ext/v8/upstream/scons/engine/SCons/Tool/latex.py +79 -0
  1059. data/ext/v8/upstream/scons/engine/SCons/Tool/lex.py +99 -0
  1060. data/ext/v8/upstream/scons/engine/SCons/Tool/link.py +121 -0
  1061. data/ext/v8/upstream/scons/engine/SCons/Tool/linkloc.py +112 -0
  1062. data/ext/v8/upstream/scons/engine/SCons/Tool/m4.py +63 -0
  1063. data/ext/v8/upstream/scons/engine/SCons/Tool/masm.py +77 -0
  1064. data/ext/v8/upstream/scons/engine/SCons/Tool/midl.py +90 -0
  1065. data/ext/v8/upstream/scons/engine/SCons/Tool/mingw.py +159 -0
  1066. data/ext/v8/upstream/scons/engine/SCons/Tool/mslib.py +64 -0
  1067. data/ext/v8/upstream/scons/engine/SCons/Tool/mslink.py +266 -0
  1068. data/ext/v8/upstream/scons/engine/SCons/Tool/mssdk.py +50 -0
  1069. data/ext/v8/upstream/scons/engine/SCons/Tool/msvc.py +269 -0
  1070. data/ext/v8/upstream/scons/engine/SCons/Tool/msvs.py +1439 -0
  1071. data/ext/v8/upstream/scons/engine/SCons/Tool/mwcc.py +208 -0
  1072. data/ext/v8/upstream/scons/engine/SCons/Tool/mwld.py +107 -0
  1073. data/ext/v8/upstream/scons/engine/SCons/Tool/nasm.py +72 -0
  1074. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/__init__.py +314 -0
  1075. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/ipk.py +185 -0
  1076. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/msi.py +526 -0
  1077. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/rpm.py +367 -0
  1078. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_tarbz2.py +43 -0
  1079. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_targz.py +43 -0
  1080. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/src_zip.py +43 -0
  1081. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/tarbz2.py +44 -0
  1082. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/targz.py +44 -0
  1083. data/ext/v8/upstream/scons/engine/SCons/Tool/packaging/zip.py +44 -0
  1084. data/ext/v8/upstream/scons/engine/SCons/Tool/pdf.py +78 -0
  1085. data/ext/v8/upstream/scons/engine/SCons/Tool/pdflatex.py +83 -0
  1086. data/ext/v8/upstream/scons/engine/SCons/Tool/pdftex.py +108 -0
  1087. data/ext/v8/upstream/scons/engine/SCons/Tool/qt.py +336 -0
  1088. data/ext/v8/upstream/scons/engine/SCons/Tool/rmic.py +121 -0
  1089. data/ext/v8/upstream/scons/engine/SCons/Tool/rpcgen.py +70 -0
  1090. data/ext/v8/upstream/scons/engine/SCons/Tool/rpm.py +132 -0
  1091. data/ext/v8/upstream/scons/engine/SCons/Tool/sgiar.py +68 -0
  1092. data/ext/v8/upstream/scons/engine/SCons/Tool/sgic++.py +58 -0
  1093. data/ext/v8/upstream/scons/engine/SCons/Tool/sgicc.py +53 -0
  1094. data/ext/v8/upstream/scons/engine/SCons/Tool/sgilink.py +63 -0
  1095. data/ext/v8/upstream/scons/engine/SCons/Tool/sunar.py +67 -0
  1096. data/ext/v8/upstream/scons/engine/SCons/Tool/sunc++.py +142 -0
  1097. data/ext/v8/upstream/scons/engine/SCons/Tool/suncc.py +58 -0
  1098. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf77.py +63 -0
  1099. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf90.py +64 -0
  1100. data/ext/v8/upstream/scons/engine/SCons/Tool/sunf95.py +64 -0
  1101. data/ext/v8/upstream/scons/engine/SCons/Tool/sunlink.py +77 -0
  1102. data/ext/v8/upstream/scons/engine/SCons/Tool/swig.py +186 -0
  1103. data/ext/v8/upstream/scons/engine/SCons/Tool/tar.py +73 -0
  1104. data/ext/v8/upstream/scons/engine/SCons/Tool/tex.py +805 -0
  1105. data/ext/v8/upstream/scons/engine/SCons/Tool/textfile.py +175 -0
  1106. data/ext/v8/upstream/scons/engine/SCons/Tool/tlib.py +53 -0
  1107. data/ext/v8/upstream/scons/engine/SCons/Tool/wix.py +100 -0
  1108. data/ext/v8/upstream/scons/engine/SCons/Tool/yacc.py +131 -0
  1109. data/ext/v8/upstream/scons/engine/SCons/Tool/zip.py +100 -0
  1110. data/ext/v8/upstream/scons/engine/SCons/Util.py +1645 -0
  1111. data/ext/v8/upstream/scons/engine/SCons/Variables/BoolVariable.py +91 -0
  1112. data/ext/v8/upstream/scons/engine/SCons/Variables/EnumVariable.py +107 -0
  1113. data/ext/v8/upstream/scons/engine/SCons/Variables/ListVariable.py +139 -0
  1114. data/ext/v8/upstream/scons/engine/SCons/Variables/PackageVariable.py +109 -0
  1115. data/ext/v8/upstream/scons/engine/SCons/Variables/PathVariable.py +147 -0
  1116. data/ext/v8/upstream/scons/engine/SCons/Variables/__init__.py +317 -0
  1117. data/ext/v8/upstream/scons/engine/SCons/Warnings.py +228 -0
  1118. data/ext/v8/upstream/scons/engine/SCons/__init__.py +49 -0
  1119. data/ext/v8/upstream/scons/engine/SCons/compat/__init__.py +302 -0
  1120. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_UserString.py +98 -0
  1121. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_hashlib.py +91 -0
  1122. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_itertools.py +124 -0
  1123. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_optparse.py +1725 -0
  1124. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets.py +583 -0
  1125. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_sets15.py +176 -0
  1126. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_shlex.py +325 -0
  1127. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_subprocess.py +1296 -0
  1128. data/ext/v8/upstream/scons/engine/SCons/compat/_scons_textwrap.py +382 -0
  1129. data/ext/v8/upstream/scons/engine/SCons/compat/builtins.py +187 -0
  1130. data/ext/v8/upstream/scons/engine/SCons/cpp.py +598 -0
  1131. data/ext/v8/upstream/scons/engine/SCons/dblite.py +248 -0
  1132. data/ext/v8/upstream/scons/engine/SCons/exitfuncs.py +77 -0
  1133. data/ext/v8/upstream/scons/os_spawnv_fix.diff +83 -0
  1134. data/ext/v8/upstream/scons/scons-time.1 +1017 -0
  1135. data/ext/v8/upstream/scons/scons.1 +15179 -0
  1136. data/ext/v8/upstream/scons/sconsign.1 +208 -0
  1137. data/ext/v8/upstream/scons/script/scons +184 -0
  1138. data/ext/v8/upstream/scons/script/scons-time +1529 -0
  1139. data/ext/v8/upstream/scons/script/scons.bat +31 -0
  1140. data/ext/v8/upstream/scons/script/sconsign +508 -0
  1141. data/ext/v8/upstream/scons/setup.cfg +6 -0
  1142. data/ext/v8/upstream/scons/setup.py +427 -0
  1143. data/ext/v8/v8_cxt.cpp +3 -0
  1144. data/ext/v8/v8_cxt.h +9 -0
  1145. data/lib/v8.rb +1 -1
  1146. data/spec/redjs/jsapi_spec.rb +6 -0
  1147. data/therubyracer.gemspec +4 -4
  1148. metadata +1146 -2
@@ -0,0 +1,80 @@
1
+ // Copyright 2006-2008 the V8 project authors. All rights reserved.
2
+ //
3
+ // Tests of the TokenLock class from lock.h
4
+
5
+ #include <pthread.h>
6
+ #include <stdlib.h>
7
+ #include <unistd.h> // for usleep()
8
+
9
+ #include "v8.h"
10
+
11
+ #include "platform.h"
12
+ #include "cctest.h"
13
+
14
+ using namespace ::v8::internal;
15
+
16
+
17
+ static void yield() {
18
+ usleep(1);
19
+ }
20
+
21
+ static const int kLockCounterLimit = 50;
22
+ static int busy_lock_counter = 0;
23
+
24
+
25
+ static void LoopIncrement(Mutex* mutex, int rem) {
26
+ while (true) {
27
+ int count = 0;
28
+ int last_count = -1;
29
+ do {
30
+ CHECK_EQ(0, mutex->Lock());
31
+ count = busy_lock_counter;
32
+ CHECK_EQ(0, mutex->Unlock());
33
+ yield();
34
+ } while (count % 2 == rem && count < kLockCounterLimit);
35
+ if (count >= kLockCounterLimit) break;
36
+ CHECK_EQ(0, mutex->Lock());
37
+ CHECK_EQ(count, busy_lock_counter);
38
+ CHECK(last_count == -1 || count == last_count + 1);
39
+ busy_lock_counter++;
40
+ last_count = count;
41
+ CHECK_EQ(0, mutex->Unlock());
42
+ yield();
43
+ }
44
+ }
45
+
46
+
47
+ static void* RunTestBusyLock(void* arg) {
48
+ LoopIncrement(static_cast<Mutex*>(arg), 0);
49
+ return 0;
50
+ }
51
+
52
+
53
+ // Runs two threads that repeatedly acquire the lock and conditionally
54
+ // increment a variable.
55
+ TEST(BusyLock) {
56
+ pthread_t other;
57
+ Mutex* mutex = OS::CreateMutex();
58
+ int thread_created = pthread_create(&other,
59
+ NULL,
60
+ &RunTestBusyLock,
61
+ mutex);
62
+ CHECK_EQ(0, thread_created);
63
+ LoopIncrement(mutex, 1);
64
+ pthread_join(other, NULL);
65
+ delete mutex;
66
+ }
67
+
68
+
69
+ TEST(VirtualMemory) {
70
+ VirtualMemory* vm = new VirtualMemory(1 * MB);
71
+ CHECK(vm->IsReserved());
72
+ void* block_addr = vm->address();
73
+ size_t block_size = 4 * KB;
74
+ CHECK(vm->Commit(block_addr, block_size, false));
75
+ // Check whether we can write to memory.
76
+ int* addr = static_cast<int*>(block_addr);
77
+ addr[KB-1] = 2;
78
+ CHECK(vm->Uncommit(block_addr, block_size));
79
+ delete vm;
80
+ }
@@ -0,0 +1,10 @@
1
+ // Copyright 2006-2008 the V8 project authors. All rights reserved.
2
+ //
3
+ // Tests of the TokenLock class from lock.h
4
+
5
+ #include <stdlib.h>
6
+
7
+ #include "v8.h"
8
+ #include "cctest.h"
9
+
10
+ using namespace ::v8::internal;
@@ -0,0 +1,80 @@
1
+ // Copyright 2006-2008 the V8 project authors. All rights reserved.
2
+ //
3
+ // Tests of the TokenLock class from lock.h
4
+
5
+ #include <pthread.h>
6
+ #include <stdlib.h>
7
+ #include <unistd.h> // for usleep()
8
+
9
+ #include "v8.h"
10
+
11
+ #include "platform.h"
12
+ #include "cctest.h"
13
+
14
+ using namespace ::v8::internal;
15
+
16
+
17
+ static void yield() {
18
+ UNIMPLEMENTED();
19
+ }
20
+
21
+ static const int kLockCounterLimit = 50;
22
+ static int busy_lock_counter = 0;
23
+
24
+
25
+ static void LoopIncrement(Mutex* mutex, int rem) {
26
+ while (true) {
27
+ int count = 0;
28
+ int last_count = -1;
29
+ do {
30
+ CHECK_EQ(0, mutex->Lock());
31
+ count = busy_lock_counter;
32
+ CHECK_EQ(0, mutex->Unlock());
33
+ yield();
34
+ } while (count % 2 == rem && count < kLockCounterLimit);
35
+ if (count >= kLockCounterLimit) break;
36
+ CHECK_EQ(0, mutex->Lock());
37
+ CHECK_EQ(count, busy_lock_counter);
38
+ CHECK(last_count == -1 || count == last_count + 1);
39
+ busy_lock_counter++;
40
+ last_count = count;
41
+ CHECK_EQ(0, mutex->Unlock());
42
+ yield();
43
+ }
44
+ }
45
+
46
+
47
+ static void* RunTestBusyLock(void* arg) {
48
+ LoopIncrement(static_cast<Mutex*>(arg), 0);
49
+ return 0;
50
+ }
51
+
52
+
53
+ // Runs two threads that repeatedly acquire the lock and conditionally
54
+ // increment a variable.
55
+ TEST(BusyLock) {
56
+ pthread_t other;
57
+ Mutex* mutex = OS::CreateMutex();
58
+ int thread_created = pthread_create(&other,
59
+ NULL,
60
+ &RunTestBusyLock,
61
+ mutex);
62
+ CHECK_EQ(0, thread_created);
63
+ LoopIncrement(mutex, 1);
64
+ pthread_join(other, NULL);
65
+ delete mutex;
66
+ }
67
+
68
+
69
+ TEST(VirtualMemory) {
70
+ VirtualMemory* vm = new VirtualMemory(1 * MB);
71
+ CHECK(vm->IsReserved());
72
+ void* block_addr = vm->address();
73
+ size_t block_size = 4 * KB;
74
+ CHECK(vm->Commit(block_addr, block_size, false));
75
+ // Check whether we can write to memory.
76
+ int* addr = static_cast<int*>(block_addr);
77
+ addr[KB-1] = 2;
78
+ CHECK(vm->Uncommit(block_addr, block_size));
79
+ delete vm;
80
+ }
@@ -0,0 +1,26 @@
1
+ // Copyright 2006-2008 the V8 project authors. All rights reserved.
2
+ //
3
+ // Tests of the TokenLock class from lock.h
4
+
5
+ #include <stdlib.h>
6
+
7
+ #include "v8.h"
8
+
9
+ #include "platform.h"
10
+ #include "cctest.h"
11
+
12
+ using namespace ::v8::internal;
13
+
14
+
15
+ TEST(VirtualMemory) {
16
+ VirtualMemory* vm = new VirtualMemory(1 * MB);
17
+ CHECK(vm->IsReserved());
18
+ void* block_addr = vm->address();
19
+ size_t block_size = 4 * KB;
20
+ CHECK(vm->Commit(block_addr, block_size, false));
21
+ // Check whether we can write to memory.
22
+ int* addr = static_cast<int*>(block_addr);
23
+ addr[KB-1] = 2;
24
+ CHECK(vm->Uncommit(block_addr, block_size));
25
+ delete vm;
26
+ }
@@ -0,0 +1,1815 @@
1
+ // Copyright 2008 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+
29
+ #include <stdlib.h>
30
+
31
+ #include "v8.h"
32
+
33
+ #include "string-stream.h"
34
+ #include "cctest.h"
35
+ #include "zone-inl.h"
36
+ #include "parser.h"
37
+ #include "ast.h"
38
+ #include "jsregexp.h"
39
+ #include "regexp-macro-assembler.h"
40
+ #include "regexp-macro-assembler-irregexp.h"
41
+ #ifdef V8_NATIVE_REGEXP
42
+ #ifdef V8_TARGET_ARCH_ARM
43
+ #include "arm/macro-assembler-arm.h"
44
+ #include "arm/regexp-macro-assembler-arm.h"
45
+ #endif
46
+ #ifdef V8_TARGET_ARCH_X64
47
+ #include "x64/macro-assembler-x64.h"
48
+ #include "x64/regexp-macro-assembler-x64.h"
49
+ #endif
50
+ #ifdef V8_TARGET_ARCH_IA32
51
+ #include "ia32/macro-assembler-ia32.h"
52
+ #include "ia32/regexp-macro-assembler-ia32.h"
53
+ #endif
54
+ #else
55
+ #include "interpreter-irregexp.h"
56
+ #endif
57
+
58
+ using namespace v8::internal;
59
+
60
+
61
+ static bool CheckParse(const char* input) {
62
+ V8::Initialize(NULL);
63
+ v8::HandleScope scope;
64
+ ZoneScope zone_scope(DELETE_ON_EXIT);
65
+ FlatStringReader reader(CStrVector(input));
66
+ RegExpCompileData result;
67
+ return v8::internal::ParseRegExp(&reader, false, &result);
68
+ }
69
+
70
+
71
+ static SmartPointer<const char> Parse(const char* input) {
72
+ V8::Initialize(NULL);
73
+ v8::HandleScope scope;
74
+ ZoneScope zone_scope(DELETE_ON_EXIT);
75
+ FlatStringReader reader(CStrVector(input));
76
+ RegExpCompileData result;
77
+ CHECK(v8::internal::ParseRegExp(&reader, false, &result));
78
+ CHECK(result.tree != NULL);
79
+ CHECK(result.error.is_null());
80
+ SmartPointer<const char> output = result.tree->ToString();
81
+ return output;
82
+ }
83
+
84
+ static bool CheckSimple(const char* input) {
85
+ V8::Initialize(NULL);
86
+ v8::HandleScope scope;
87
+ unibrow::Utf8InputBuffer<> buffer(input, StrLength(input));
88
+ ZoneScope zone_scope(DELETE_ON_EXIT);
89
+ FlatStringReader reader(CStrVector(input));
90
+ RegExpCompileData result;
91
+ CHECK(v8::internal::ParseRegExp(&reader, false, &result));
92
+ CHECK(result.tree != NULL);
93
+ CHECK(result.error.is_null());
94
+ return result.simple;
95
+ }
96
+
97
+ struct MinMaxPair {
98
+ int min_match;
99
+ int max_match;
100
+ };
101
+
102
+ static MinMaxPair CheckMinMaxMatch(const char* input) {
103
+ V8::Initialize(NULL);
104
+ v8::HandleScope scope;
105
+ unibrow::Utf8InputBuffer<> buffer(input, StrLength(input));
106
+ ZoneScope zone_scope(DELETE_ON_EXIT);
107
+ FlatStringReader reader(CStrVector(input));
108
+ RegExpCompileData result;
109
+ CHECK(v8::internal::ParseRegExp(&reader, false, &result));
110
+ CHECK(result.tree != NULL);
111
+ CHECK(result.error.is_null());
112
+ int min_match = result.tree->min_match();
113
+ int max_match = result.tree->max_match();
114
+ MinMaxPair pair = { min_match, max_match };
115
+ return pair;
116
+ }
117
+
118
+
119
+ #define CHECK_PARSE_ERROR(input) CHECK(!CheckParse(input))
120
+ #define CHECK_PARSE_EQ(input, expected) CHECK_EQ(expected, *Parse(input))
121
+ #define CHECK_SIMPLE(input, simple) CHECK_EQ(simple, CheckSimple(input));
122
+ #define CHECK_MIN_MAX(input, min, max) \
123
+ { MinMaxPair min_max = CheckMinMaxMatch(input); \
124
+ CHECK_EQ(min, min_max.min_match); \
125
+ CHECK_EQ(max, min_max.max_match); \
126
+ }
127
+
128
+ TEST(Parser) {
129
+ V8::Initialize(NULL);
130
+
131
+ CHECK_PARSE_ERROR("?");
132
+
133
+ CHECK_PARSE_EQ("abc", "'abc'");
134
+ CHECK_PARSE_EQ("", "%");
135
+ CHECK_PARSE_EQ("abc|def", "(| 'abc' 'def')");
136
+ CHECK_PARSE_EQ("abc|def|ghi", "(| 'abc' 'def' 'ghi')");
137
+ CHECK_PARSE_EQ("^xxx$", "(: @^i 'xxx' @$i)");
138
+ CHECK_PARSE_EQ("ab\\b\\d\\bcd", "(: 'ab' @b [0-9] @b 'cd')");
139
+ CHECK_PARSE_EQ("\\w|\\d", "(| [0-9 A-Z _ a-z] [0-9])");
140
+ CHECK_PARSE_EQ("a*", "(# 0 - g 'a')");
141
+ CHECK_PARSE_EQ("a*?", "(# 0 - n 'a')");
142
+ CHECK_PARSE_EQ("abc+", "(: 'ab' (# 1 - g 'c'))");
143
+ CHECK_PARSE_EQ("abc+?", "(: 'ab' (# 1 - n 'c'))");
144
+ CHECK_PARSE_EQ("xyz?", "(: 'xy' (# 0 1 g 'z'))");
145
+ CHECK_PARSE_EQ("xyz??", "(: 'xy' (# 0 1 n 'z'))");
146
+ CHECK_PARSE_EQ("xyz{0,1}", "(: 'xy' (# 0 1 g 'z'))");
147
+ CHECK_PARSE_EQ("xyz{0,1}?", "(: 'xy' (# 0 1 n 'z'))");
148
+ CHECK_PARSE_EQ("xyz{93}", "(: 'xy' (# 93 93 g 'z'))");
149
+ CHECK_PARSE_EQ("xyz{93}?", "(: 'xy' (# 93 93 n 'z'))");
150
+ CHECK_PARSE_EQ("xyz{1,32}", "(: 'xy' (# 1 32 g 'z'))");
151
+ CHECK_PARSE_EQ("xyz{1,32}?", "(: 'xy' (# 1 32 n 'z'))");
152
+ CHECK_PARSE_EQ("xyz{1,}", "(: 'xy' (# 1 - g 'z'))");
153
+ CHECK_PARSE_EQ("xyz{1,}?", "(: 'xy' (# 1 - n 'z'))");
154
+ CHECK_PARSE_EQ("a\\fb\\nc\\rd\\te\\vf", "'a\\x0cb\\x0ac\\x0dd\\x09e\\x0bf'");
155
+ CHECK_PARSE_EQ("a\\nb\\bc", "(: 'a\\x0ab' @b 'c')");
156
+ CHECK_PARSE_EQ("(?:foo)", "'foo'");
157
+ CHECK_PARSE_EQ("(?: foo )", "' foo '");
158
+ CHECK_PARSE_EQ("(foo|bar|baz)", "(^ (| 'foo' 'bar' 'baz'))");
159
+ CHECK_PARSE_EQ("foo|(bar|baz)|quux", "(| 'foo' (^ (| 'bar' 'baz')) 'quux')");
160
+ CHECK_PARSE_EQ("foo(?=bar)baz", "(: 'foo' (-> + 'bar') 'baz')");
161
+ CHECK_PARSE_EQ("foo(?!bar)baz", "(: 'foo' (-> - 'bar') 'baz')");
162
+ CHECK_PARSE_EQ("()", "(^ %)");
163
+ CHECK_PARSE_EQ("(?=)", "(-> + %)");
164
+ CHECK_PARSE_EQ("[]", "^[\\x00-\\uffff]"); // Doesn't compile on windows
165
+ CHECK_PARSE_EQ("[^]", "[\\x00-\\uffff]"); // \uffff isn't in codepage 1252
166
+ CHECK_PARSE_EQ("[x]", "[x]");
167
+ CHECK_PARSE_EQ("[xyz]", "[x y z]");
168
+ CHECK_PARSE_EQ("[a-zA-Z0-9]", "[a-z A-Z 0-9]");
169
+ CHECK_PARSE_EQ("[-123]", "[- 1 2 3]");
170
+ CHECK_PARSE_EQ("[^123]", "^[1 2 3]");
171
+ CHECK_PARSE_EQ("]", "']'");
172
+ CHECK_PARSE_EQ("}", "'}'");
173
+ CHECK_PARSE_EQ("[a-b-c]", "[a-b - c]");
174
+ CHECK_PARSE_EQ("[\\d]", "[0-9]");
175
+ CHECK_PARSE_EQ("[x\\dz]", "[x 0-9 z]");
176
+ CHECK_PARSE_EQ("[\\d-z]", "[0-9 - z]");
177
+ CHECK_PARSE_EQ("[\\d-\\d]", "[0-9 - 0-9]");
178
+ CHECK_PARSE_EQ("[z-\\d]", "[z - 0-9]");
179
+ CHECK_PARSE_EQ("\\cj\\cJ\\ci\\cI\\ck\\cK",
180
+ "'\\x0a\\x0a\\x09\\x09\\x0b\\x0b'");
181
+ CHECK_PARSE_EQ("\\c!", "'c!'");
182
+ CHECK_PARSE_EQ("\\c_", "'c_'");
183
+ CHECK_PARSE_EQ("\\c~", "'c~'");
184
+ CHECK_PARSE_EQ("[a\\]c]", "[a ] c]");
185
+ CHECK_PARSE_EQ("\\[\\]\\{\\}\\(\\)\\%\\^\\#\\ ", "'[]{}()%^# '");
186
+ CHECK_PARSE_EQ("[\\[\\]\\{\\}\\(\\)\\%\\^\\#\\ ]", "[[ ] { } ( ) % ^ # ]");
187
+ CHECK_PARSE_EQ("\\0", "'\\x00'");
188
+ CHECK_PARSE_EQ("\\8", "'8'");
189
+ CHECK_PARSE_EQ("\\9", "'9'");
190
+ CHECK_PARSE_EQ("\\11", "'\\x09'");
191
+ CHECK_PARSE_EQ("\\11a", "'\\x09a'");
192
+ CHECK_PARSE_EQ("\\011", "'\\x09'");
193
+ CHECK_PARSE_EQ("\\00011", "'\\x0011'");
194
+ CHECK_PARSE_EQ("\\118", "'\\x098'");
195
+ CHECK_PARSE_EQ("\\111", "'I'");
196
+ CHECK_PARSE_EQ("\\1111", "'I1'");
197
+ CHECK_PARSE_EQ("(x)(x)(x)\\1", "(: (^ 'x') (^ 'x') (^ 'x') (<- 1))");
198
+ CHECK_PARSE_EQ("(x)(x)(x)\\2", "(: (^ 'x') (^ 'x') (^ 'x') (<- 2))");
199
+ CHECK_PARSE_EQ("(x)(x)(x)\\3", "(: (^ 'x') (^ 'x') (^ 'x') (<- 3))");
200
+ CHECK_PARSE_EQ("(x)(x)(x)\\4", "(: (^ 'x') (^ 'x') (^ 'x') '\\x04')");
201
+ CHECK_PARSE_EQ("(x)(x)(x)\\1*", "(: (^ 'x') (^ 'x') (^ 'x')"
202
+ " (# 0 - g (<- 1)))");
203
+ CHECK_PARSE_EQ("(x)(x)(x)\\2*", "(: (^ 'x') (^ 'x') (^ 'x')"
204
+ " (# 0 - g (<- 2)))");
205
+ CHECK_PARSE_EQ("(x)(x)(x)\\3*", "(: (^ 'x') (^ 'x') (^ 'x')"
206
+ " (# 0 - g (<- 3)))");
207
+ CHECK_PARSE_EQ("(x)(x)(x)\\4*", "(: (^ 'x') (^ 'x') (^ 'x')"
208
+ " (# 0 - g '\\x04'))");
209
+ CHECK_PARSE_EQ("(x)(x)(x)(x)(x)(x)(x)(x)(x)(x)\\10",
210
+ "(: (^ 'x') (^ 'x') (^ 'x') (^ 'x') (^ 'x') (^ 'x')"
211
+ " (^ 'x') (^ 'x') (^ 'x') (^ 'x') (<- 10))");
212
+ CHECK_PARSE_EQ("(x)(x)(x)(x)(x)(x)(x)(x)(x)(x)\\11",
213
+ "(: (^ 'x') (^ 'x') (^ 'x') (^ 'x') (^ 'x') (^ 'x')"
214
+ " (^ 'x') (^ 'x') (^ 'x') (^ 'x') '\\x09')");
215
+ CHECK_PARSE_EQ("(a)\\1", "(: (^ 'a') (<- 1))");
216
+ CHECK_PARSE_EQ("(a\\1)", "(^ 'a')");
217
+ CHECK_PARSE_EQ("(\\1a)", "(^ 'a')");
218
+ CHECK_PARSE_EQ("(?=a)?a", "'a'");
219
+ CHECK_PARSE_EQ("(?=a){0,10}a", "'a'");
220
+ CHECK_PARSE_EQ("(?=a){1,10}a", "(: (-> + 'a') 'a')");
221
+ CHECK_PARSE_EQ("(?=a){9,10}a", "(: (-> + 'a') 'a')");
222
+ CHECK_PARSE_EQ("(?!a)?a", "'a'");
223
+ CHECK_PARSE_EQ("\\1(a)", "(^ 'a')");
224
+ CHECK_PARSE_EQ("(?!(a))\\1", "(: (-> - (^ 'a')) (<- 1))");
225
+ CHECK_PARSE_EQ("(?!\\1(a\\1)\\1)\\1", "(: (-> - (: (^ 'a') (<- 1))) (<- 1))");
226
+ CHECK_PARSE_EQ("[\\0]", "[\\x00]");
227
+ CHECK_PARSE_EQ("[\\11]", "[\\x09]");
228
+ CHECK_PARSE_EQ("[\\11a]", "[\\x09 a]");
229
+ CHECK_PARSE_EQ("[\\011]", "[\\x09]");
230
+ CHECK_PARSE_EQ("[\\00011]", "[\\x00 1 1]");
231
+ CHECK_PARSE_EQ("[\\118]", "[\\x09 8]");
232
+ CHECK_PARSE_EQ("[\\111]", "[I]");
233
+ CHECK_PARSE_EQ("[\\1111]", "[I 1]");
234
+ CHECK_PARSE_EQ("\\x34", "'\x34'");
235
+ CHECK_PARSE_EQ("\\x60", "'\x60'");
236
+ CHECK_PARSE_EQ("\\x3z", "'x3z'");
237
+ CHECK_PARSE_EQ("\\c", "'c'");
238
+ CHECK_PARSE_EQ("\\u0034", "'\x34'");
239
+ CHECK_PARSE_EQ("\\u003z", "'u003z'");
240
+ CHECK_PARSE_EQ("foo[z]*", "(: 'foo' (# 0 - g [z]))");
241
+
242
+ CHECK_SIMPLE("a", true);
243
+ CHECK_SIMPLE("a|b", false);
244
+ CHECK_SIMPLE("a\\n", false);
245
+ CHECK_SIMPLE("^a", false);
246
+ CHECK_SIMPLE("a$", false);
247
+ CHECK_SIMPLE("a\\b!", false);
248
+ CHECK_SIMPLE("a\\Bb", false);
249
+ CHECK_SIMPLE("a*", false);
250
+ CHECK_SIMPLE("a*?", false);
251
+ CHECK_SIMPLE("a?", false);
252
+ CHECK_SIMPLE("a??", false);
253
+ CHECK_SIMPLE("a{0,1}?", false);
254
+ CHECK_SIMPLE("a{1,1}?", false);
255
+ CHECK_SIMPLE("a{1,2}?", false);
256
+ CHECK_SIMPLE("a+?", false);
257
+ CHECK_SIMPLE("(a)", false);
258
+ CHECK_SIMPLE("(a)\\1", false);
259
+ CHECK_SIMPLE("(\\1a)", false);
260
+ CHECK_SIMPLE("\\1(a)", false);
261
+ CHECK_SIMPLE("a\\s", false);
262
+ CHECK_SIMPLE("a\\S", false);
263
+ CHECK_SIMPLE("a\\d", false);
264
+ CHECK_SIMPLE("a\\D", false);
265
+ CHECK_SIMPLE("a\\w", false);
266
+ CHECK_SIMPLE("a\\W", false);
267
+ CHECK_SIMPLE("a.", false);
268
+ CHECK_SIMPLE("a\\q", false);
269
+ CHECK_SIMPLE("a[a]", false);
270
+ CHECK_SIMPLE("a[^a]", false);
271
+ CHECK_SIMPLE("a[a-z]", false);
272
+ CHECK_SIMPLE("a[\\q]", false);
273
+ CHECK_SIMPLE("a(?:b)", false);
274
+ CHECK_SIMPLE("a(?=b)", false);
275
+ CHECK_SIMPLE("a(?!b)", false);
276
+ CHECK_SIMPLE("\\x60", false);
277
+ CHECK_SIMPLE("\\u0060", false);
278
+ CHECK_SIMPLE("\\cA", false);
279
+ CHECK_SIMPLE("\\q", false);
280
+ CHECK_SIMPLE("\\1112", false);
281
+ CHECK_SIMPLE("\\0", false);
282
+ CHECK_SIMPLE("(a)\\1", false);
283
+ CHECK_SIMPLE("(?=a)?a", false);
284
+ CHECK_SIMPLE("(?!a)?a\\1", false);
285
+ CHECK_SIMPLE("(?:(?=a))a\\1", false);
286
+
287
+ CHECK_PARSE_EQ("a{}", "'a{}'");
288
+ CHECK_PARSE_EQ("a{,}", "'a{,}'");
289
+ CHECK_PARSE_EQ("a{", "'a{'");
290
+ CHECK_PARSE_EQ("a{z}", "'a{z}'");
291
+ CHECK_PARSE_EQ("a{1z}", "'a{1z}'");
292
+ CHECK_PARSE_EQ("a{12z}", "'a{12z}'");
293
+ CHECK_PARSE_EQ("a{12,", "'a{12,'");
294
+ CHECK_PARSE_EQ("a{12,3b", "'a{12,3b'");
295
+ CHECK_PARSE_EQ("{}", "'{}'");
296
+ CHECK_PARSE_EQ("{,}", "'{,}'");
297
+ CHECK_PARSE_EQ("{", "'{'");
298
+ CHECK_PARSE_EQ("{z}", "'{z}'");
299
+ CHECK_PARSE_EQ("{1z}", "'{1z}'");
300
+ CHECK_PARSE_EQ("{12z}", "'{12z}'");
301
+ CHECK_PARSE_EQ("{12,", "'{12,'");
302
+ CHECK_PARSE_EQ("{12,3b", "'{12,3b'");
303
+
304
+ CHECK_MIN_MAX("a", 1, 1);
305
+ CHECK_MIN_MAX("abc", 3, 3);
306
+ CHECK_MIN_MAX("a[bc]d", 3, 3);
307
+ CHECK_MIN_MAX("a|bc", 1, 2);
308
+ CHECK_MIN_MAX("ab|c", 1, 2);
309
+ CHECK_MIN_MAX("a||bc", 0, 2);
310
+ CHECK_MIN_MAX("|", 0, 0);
311
+ CHECK_MIN_MAX("(?:ab)", 2, 2);
312
+ CHECK_MIN_MAX("(?:ab|cde)", 2, 3);
313
+ CHECK_MIN_MAX("(?:ab)|cde", 2, 3);
314
+ CHECK_MIN_MAX("(ab)", 2, 2);
315
+ CHECK_MIN_MAX("(ab|cde)", 2, 3);
316
+ CHECK_MIN_MAX("(ab)\\1", 2, 4);
317
+ CHECK_MIN_MAX("(ab|cde)\\1", 2, 6);
318
+ CHECK_MIN_MAX("(?:ab)?", 0, 2);
319
+ CHECK_MIN_MAX("(?:ab)*", 0, RegExpTree::kInfinity);
320
+ CHECK_MIN_MAX("(?:ab)+", 2, RegExpTree::kInfinity);
321
+ CHECK_MIN_MAX("a?", 0, 1);
322
+ CHECK_MIN_MAX("a*", 0, RegExpTree::kInfinity);
323
+ CHECK_MIN_MAX("a+", 1, RegExpTree::kInfinity);
324
+ CHECK_MIN_MAX("a??", 0, 1);
325
+ CHECK_MIN_MAX("a*?", 0, RegExpTree::kInfinity);
326
+ CHECK_MIN_MAX("a+?", 1, RegExpTree::kInfinity);
327
+ CHECK_MIN_MAX("(?:a?)?", 0, 1);
328
+ CHECK_MIN_MAX("(?:a*)?", 0, RegExpTree::kInfinity);
329
+ CHECK_MIN_MAX("(?:a+)?", 0, RegExpTree::kInfinity);
330
+ CHECK_MIN_MAX("(?:a?)+", 0, RegExpTree::kInfinity);
331
+ CHECK_MIN_MAX("(?:a*)+", 0, RegExpTree::kInfinity);
332
+ CHECK_MIN_MAX("(?:a+)+", 1, RegExpTree::kInfinity);
333
+ CHECK_MIN_MAX("(?:a?)*", 0, RegExpTree::kInfinity);
334
+ CHECK_MIN_MAX("(?:a*)*", 0, RegExpTree::kInfinity);
335
+ CHECK_MIN_MAX("(?:a+)*", 0, RegExpTree::kInfinity);
336
+ CHECK_MIN_MAX("a{0}", 0, 0);
337
+ CHECK_MIN_MAX("(?:a+){0}", 0, 0);
338
+ CHECK_MIN_MAX("(?:a+){0,0}", 0, 0);
339
+ CHECK_MIN_MAX("a*b", 1, RegExpTree::kInfinity);
340
+ CHECK_MIN_MAX("a+b", 2, RegExpTree::kInfinity);
341
+ CHECK_MIN_MAX("a*b|c", 1, RegExpTree::kInfinity);
342
+ CHECK_MIN_MAX("a+b|c", 1, RegExpTree::kInfinity);
343
+ CHECK_MIN_MAX("(?:a{5,1000000}){3,1000000}", 15, RegExpTree::kInfinity);
344
+ CHECK_MIN_MAX("(?:ab){4,7}", 8, 14);
345
+ CHECK_MIN_MAX("a\\bc", 2, 2);
346
+ CHECK_MIN_MAX("a\\Bc", 2, 2);
347
+ CHECK_MIN_MAX("a\\sc", 3, 3);
348
+ CHECK_MIN_MAX("a\\Sc", 3, 3);
349
+ CHECK_MIN_MAX("a(?=b)c", 2, 2);
350
+ CHECK_MIN_MAX("a(?=bbb|bb)c", 2, 2);
351
+ CHECK_MIN_MAX("a(?!bbb|bb)c", 2, 2);
352
+ }
353
+
354
+ TEST(ParserRegression) {
355
+ CHECK_PARSE_EQ("[A-Z$-][x]", "(! [A-Z $ -] [x])");
356
+ CHECK_PARSE_EQ("a{3,4*}", "(: 'a{3,' (# 0 - g '4') '}')");
357
+ CHECK_PARSE_EQ("{", "'{'");
358
+ CHECK_PARSE_EQ("a|", "(| 'a' %)");
359
+ }
360
+
361
+ static void ExpectError(const char* input,
362
+ const char* expected) {
363
+ V8::Initialize(NULL);
364
+ v8::HandleScope scope;
365
+ ZoneScope zone_scope(DELETE_ON_EXIT);
366
+ FlatStringReader reader(CStrVector(input));
367
+ RegExpCompileData result;
368
+ CHECK_EQ(false, v8::internal::ParseRegExp(&reader, false, &result));
369
+ CHECK(result.tree == NULL);
370
+ CHECK(!result.error.is_null());
371
+ SmartPointer<char> str = result.error->ToCString(ALLOW_NULLS);
372
+ CHECK_EQ(expected, *str);
373
+ }
374
+
375
+
376
+ TEST(Errors) {
377
+ V8::Initialize(NULL);
378
+ const char* kEndBackslash = "\\ at end of pattern";
379
+ ExpectError("\\", kEndBackslash);
380
+ const char* kUnterminatedGroup = "Unterminated group";
381
+ ExpectError("(foo", kUnterminatedGroup);
382
+ const char* kInvalidGroup = "Invalid group";
383
+ ExpectError("(?", kInvalidGroup);
384
+ const char* kUnterminatedCharacterClass = "Unterminated character class";
385
+ ExpectError("[", kUnterminatedCharacterClass);
386
+ ExpectError("[a-", kUnterminatedCharacterClass);
387
+ const char* kNothingToRepeat = "Nothing to repeat";
388
+ ExpectError("*", kNothingToRepeat);
389
+ ExpectError("?", kNothingToRepeat);
390
+ ExpectError("+", kNothingToRepeat);
391
+ ExpectError("{1}", kNothingToRepeat);
392
+ ExpectError("{1,2}", kNothingToRepeat);
393
+ ExpectError("{1,}", kNothingToRepeat);
394
+
395
+ // Check that we don't allow more than kMaxCapture captures
396
+ const int kMaxCaptures = 1 << 16; // Must match RegExpParser::kMaxCaptures.
397
+ const char* kTooManyCaptures = "Too many captures";
398
+ HeapStringAllocator allocator;
399
+ StringStream accumulator(&allocator);
400
+ for (int i = 0; i <= kMaxCaptures; i++) {
401
+ accumulator.Add("()");
402
+ }
403
+ SmartPointer<const char> many_captures(accumulator.ToCString());
404
+ ExpectError(*many_captures, kTooManyCaptures);
405
+ }
406
+
407
+
408
+ static bool IsDigit(uc16 c) {
409
+ return ('0' <= c && c <= '9');
410
+ }
411
+
412
+
413
+ static bool NotDigit(uc16 c) {
414
+ return !IsDigit(c);
415
+ }
416
+
417
+
418
+ static bool IsWhiteSpace(uc16 c) {
419
+ switch (c) {
420
+ case 0x09:
421
+ case 0x0A:
422
+ case 0x0B:
423
+ case 0x0C:
424
+ case 0x0d:
425
+ case 0x20:
426
+ case 0xA0:
427
+ case 0x2028:
428
+ case 0x2029:
429
+ return true;
430
+ default:
431
+ return unibrow::Space::Is(c);
432
+ }
433
+ }
434
+
435
+
436
+ static bool NotWhiteSpace(uc16 c) {
437
+ return !IsWhiteSpace(c);
438
+ }
439
+
440
+
441
+ static bool NotWord(uc16 c) {
442
+ return !IsRegExpWord(c);
443
+ }
444
+
445
+
446
+ static void TestCharacterClassEscapes(uc16 c, bool (pred)(uc16 c)) {
447
+ ZoneScope scope(DELETE_ON_EXIT);
448
+ ZoneList<CharacterRange>* ranges = new ZoneList<CharacterRange>(2);
449
+ CharacterRange::AddClassEscape(c, ranges);
450
+ for (unsigned i = 0; i < (1 << 16); i++) {
451
+ bool in_class = false;
452
+ for (int j = 0; !in_class && j < ranges->length(); j++) {
453
+ CharacterRange& range = ranges->at(j);
454
+ in_class = (range.from() <= i && i <= range.to());
455
+ }
456
+ CHECK_EQ(pred(i), in_class);
457
+ }
458
+ }
459
+
460
+
461
+ TEST(CharacterClassEscapes) {
462
+ TestCharacterClassEscapes('.', IsRegExpNewline);
463
+ TestCharacterClassEscapes('d', IsDigit);
464
+ TestCharacterClassEscapes('D', NotDigit);
465
+ TestCharacterClassEscapes('s', IsWhiteSpace);
466
+ TestCharacterClassEscapes('S', NotWhiteSpace);
467
+ TestCharacterClassEscapes('w', IsRegExpWord);
468
+ TestCharacterClassEscapes('W', NotWord);
469
+ }
470
+
471
+
472
+ static RegExpNode* Compile(const char* input, bool multiline, bool is_ascii) {
473
+ V8::Initialize(NULL);
474
+ FlatStringReader reader(CStrVector(input));
475
+ RegExpCompileData compile_data;
476
+ if (!v8::internal::ParseRegExp(&reader, multiline, &compile_data))
477
+ return NULL;
478
+ Handle<String> pattern = Factory::NewStringFromUtf8(CStrVector(input));
479
+ RegExpEngine::Compile(&compile_data, false, multiline, pattern, is_ascii);
480
+ return compile_data.node;
481
+ }
482
+
483
+
484
+ static void Execute(const char* input,
485
+ bool multiline,
486
+ bool is_ascii,
487
+ bool dot_output = false) {
488
+ v8::HandleScope scope;
489
+ ZoneScope zone_scope(DELETE_ON_EXIT);
490
+ RegExpNode* node = Compile(input, multiline, is_ascii);
491
+ USE(node);
492
+ #ifdef DEBUG
493
+ if (dot_output) {
494
+ RegExpEngine::DotPrint(input, node, false);
495
+ exit(0);
496
+ }
497
+ #endif // DEBUG
498
+ }
499
+
500
+
501
+ class TestConfig {
502
+ public:
503
+ typedef int Key;
504
+ typedef int Value;
505
+ static const int kNoKey;
506
+ static const int kNoValue;
507
+ static inline int Compare(int a, int b) {
508
+ if (a < b)
509
+ return -1;
510
+ else if (a > b)
511
+ return 1;
512
+ else
513
+ return 0;
514
+ }
515
+ };
516
+
517
+
518
+ const int TestConfig::kNoKey = 0;
519
+ const int TestConfig::kNoValue = 0;
520
+
521
+
522
+ static unsigned PseudoRandom(int i, int j) {
523
+ return ~(~((i * 781) ^ (j * 329)));
524
+ }
525
+
526
+
527
+ TEST(SplayTreeSimple) {
528
+ static const unsigned kLimit = 1000;
529
+ ZoneScope zone_scope(DELETE_ON_EXIT);
530
+ ZoneSplayTree<TestConfig> tree;
531
+ bool seen[kLimit];
532
+ for (unsigned i = 0; i < kLimit; i++) seen[i] = false;
533
+ #define CHECK_MAPS_EQUAL() do { \
534
+ for (unsigned k = 0; k < kLimit; k++) \
535
+ CHECK_EQ(seen[k], tree.Find(k, &loc)); \
536
+ } while (false)
537
+ for (int i = 0; i < 50; i++) {
538
+ for (int j = 0; j < 50; j++) {
539
+ unsigned next = PseudoRandom(i, j) % kLimit;
540
+ if (seen[next]) {
541
+ // We've already seen this one. Check the value and remove
542
+ // it.
543
+ ZoneSplayTree<TestConfig>::Locator loc;
544
+ CHECK(tree.Find(next, &loc));
545
+ CHECK_EQ(next, loc.key());
546
+ CHECK_EQ(3 * next, loc.value());
547
+ tree.Remove(next);
548
+ seen[next] = false;
549
+ CHECK_MAPS_EQUAL();
550
+ } else {
551
+ // Check that it wasn't there already and then add it.
552
+ ZoneSplayTree<TestConfig>::Locator loc;
553
+ CHECK(!tree.Find(next, &loc));
554
+ CHECK(tree.Insert(next, &loc));
555
+ CHECK_EQ(next, loc.key());
556
+ loc.set_value(3 * next);
557
+ seen[next] = true;
558
+ CHECK_MAPS_EQUAL();
559
+ }
560
+ int val = PseudoRandom(j, i) % kLimit;
561
+ if (seen[val]) {
562
+ ZoneSplayTree<TestConfig>::Locator loc;
563
+ CHECK(tree.FindGreatestLessThan(val, &loc));
564
+ CHECK_EQ(loc.key(), val);
565
+ break;
566
+ }
567
+ val = PseudoRandom(i + j, i - j) % kLimit;
568
+ if (seen[val]) {
569
+ ZoneSplayTree<TestConfig>::Locator loc;
570
+ CHECK(tree.FindLeastGreaterThan(val, &loc));
571
+ CHECK_EQ(loc.key(), val);
572
+ break;
573
+ }
574
+ }
575
+ }
576
+ }
577
+
578
+
579
+ TEST(DispatchTableConstruction) {
580
+ // Initialize test data.
581
+ static const int kLimit = 1000;
582
+ static const int kRangeCount = 8;
583
+ static const int kRangeSize = 16;
584
+ uc16 ranges[kRangeCount][2 * kRangeSize];
585
+ for (int i = 0; i < kRangeCount; i++) {
586
+ Vector<uc16> range(ranges[i], 2 * kRangeSize);
587
+ for (int j = 0; j < 2 * kRangeSize; j++) {
588
+ range[j] = PseudoRandom(i + 25, j + 87) % kLimit;
589
+ }
590
+ range.Sort();
591
+ for (int j = 1; j < 2 * kRangeSize; j++) {
592
+ CHECK(range[j-1] <= range[j]);
593
+ }
594
+ }
595
+ // Enter test data into dispatch table.
596
+ ZoneScope zone_scope(DELETE_ON_EXIT);
597
+ DispatchTable table;
598
+ for (int i = 0; i < kRangeCount; i++) {
599
+ uc16* range = ranges[i];
600
+ for (int j = 0; j < 2 * kRangeSize; j += 2)
601
+ table.AddRange(CharacterRange(range[j], range[j + 1]), i);
602
+ }
603
+ // Check that the table looks as we would expect
604
+ for (int p = 0; p < kLimit; p++) {
605
+ OutSet* outs = table.Get(p);
606
+ for (int j = 0; j < kRangeCount; j++) {
607
+ uc16* range = ranges[j];
608
+ bool is_on = false;
609
+ for (int k = 0; !is_on && (k < 2 * kRangeSize); k += 2)
610
+ is_on = (range[k] <= p && p <= range[k + 1]);
611
+ CHECK_EQ(is_on, outs->Get(j));
612
+ }
613
+ }
614
+ }
615
+
616
+ // Test of debug-only syntax.
617
+ #ifdef DEBUG
618
+
619
+ TEST(ParsePossessiveRepetition) {
620
+ bool old_flag_value = FLAG_regexp_possessive_quantifier;
621
+
622
+ // Enable possessive quantifier syntax.
623
+ FLAG_regexp_possessive_quantifier = true;
624
+
625
+ CHECK_PARSE_EQ("a*+", "(# 0 - p 'a')");
626
+ CHECK_PARSE_EQ("a++", "(# 1 - p 'a')");
627
+ CHECK_PARSE_EQ("a?+", "(# 0 1 p 'a')");
628
+ CHECK_PARSE_EQ("a{10,20}+", "(# 10 20 p 'a')");
629
+ CHECK_PARSE_EQ("za{10,20}+b", "(: 'z' (# 10 20 p 'a') 'b')");
630
+
631
+ // Disable possessive quantifier syntax.
632
+ FLAG_regexp_possessive_quantifier = false;
633
+
634
+ CHECK_PARSE_ERROR("a*+");
635
+ CHECK_PARSE_ERROR("a++");
636
+ CHECK_PARSE_ERROR("a?+");
637
+ CHECK_PARSE_ERROR("a{10,20}+");
638
+ CHECK_PARSE_ERROR("a{10,20}+b");
639
+
640
+ FLAG_regexp_possessive_quantifier = old_flag_value;
641
+ }
642
+
643
+ #endif
644
+
645
+ // Tests of interpreter.
646
+
647
+
648
+ #ifdef V8_NATIVE_REGEXP
649
+
650
+ #if V8_TARGET_ARCH_IA32
651
+ typedef RegExpMacroAssemblerIA32 ArchRegExpMacroAssembler;
652
+ #elif V8_TARGET_ARCH_X64
653
+ typedef RegExpMacroAssemblerX64 ArchRegExpMacroAssembler;
654
+ #elif V8_TARGET_ARCH_ARM
655
+ typedef RegExpMacroAssemblerARM ArchRegExpMacroAssembler;
656
+ #endif
657
+
658
+ class ContextInitializer {
659
+ public:
660
+ ContextInitializer()
661
+ : env_(), scope_(), zone_(DELETE_ON_EXIT), stack_guard_() {
662
+ env_ = v8::Context::New();
663
+ env_->Enter();
664
+ }
665
+ ~ContextInitializer() {
666
+ env_->Exit();
667
+ env_.Dispose();
668
+ }
669
+ private:
670
+ v8::Persistent<v8::Context> env_;
671
+ v8::HandleScope scope_;
672
+ v8::internal::ZoneScope zone_;
673
+ v8::internal::StackGuard stack_guard_;
674
+ };
675
+
676
+
677
+ static ArchRegExpMacroAssembler::Result Execute(Code* code,
678
+ String* input,
679
+ int start_offset,
680
+ const byte* input_start,
681
+ const byte* input_end,
682
+ int* captures,
683
+ bool at_start) {
684
+ return NativeRegExpMacroAssembler::Execute(
685
+ code,
686
+ input,
687
+ start_offset,
688
+ input_start,
689
+ input_end,
690
+ captures,
691
+ at_start);
692
+ }
693
+
694
+
695
+ TEST(MacroAssemblerNativeSuccess) {
696
+ v8::V8::Initialize();
697
+ ContextInitializer initializer;
698
+
699
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4);
700
+
701
+ m.Succeed();
702
+
703
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector(""));
704
+ Handle<Object> code_object = m.GetCode(source);
705
+ Handle<Code> code = Handle<Code>::cast(code_object);
706
+
707
+ int captures[4] = {42, 37, 87, 117};
708
+ Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo"));
709
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
710
+ const byte* start_adr =
711
+ reinterpret_cast<const byte*>(seq_input->GetCharsAddress());
712
+
713
+ NativeRegExpMacroAssembler::Result result =
714
+ Execute(*code,
715
+ *input,
716
+ 0,
717
+ start_adr,
718
+ start_adr + seq_input->length(),
719
+ captures,
720
+ true);
721
+
722
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
723
+ CHECK_EQ(-1, captures[0]);
724
+ CHECK_EQ(-1, captures[1]);
725
+ CHECK_EQ(-1, captures[2]);
726
+ CHECK_EQ(-1, captures[3]);
727
+ }
728
+
729
+
730
+ TEST(MacroAssemblerNativeSimple) {
731
+ v8::V8::Initialize();
732
+ ContextInitializer initializer;
733
+
734
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4);
735
+
736
+ uc16 foo_chars[3] = {'f', 'o', 'o'};
737
+ Vector<const uc16> foo(foo_chars, 3);
738
+
739
+ Label fail;
740
+ m.CheckCharacters(foo, 0, &fail, true);
741
+ m.WriteCurrentPositionToRegister(0, 0);
742
+ m.AdvanceCurrentPosition(3);
743
+ m.WriteCurrentPositionToRegister(1, 0);
744
+ m.Succeed();
745
+ m.Bind(&fail);
746
+ m.Fail();
747
+
748
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("^foo"));
749
+ Handle<Object> code_object = m.GetCode(source);
750
+ Handle<Code> code = Handle<Code>::cast(code_object);
751
+
752
+ int captures[4] = {42, 37, 87, 117};
753
+ Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo"));
754
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
755
+ Address start_adr = seq_input->GetCharsAddress();
756
+
757
+ NativeRegExpMacroAssembler::Result result =
758
+ Execute(*code,
759
+ *input,
760
+ 0,
761
+ start_adr,
762
+ start_adr + input->length(),
763
+ captures,
764
+ true);
765
+
766
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
767
+ CHECK_EQ(0, captures[0]);
768
+ CHECK_EQ(3, captures[1]);
769
+ CHECK_EQ(-1, captures[2]);
770
+ CHECK_EQ(-1, captures[3]);
771
+
772
+ input = Factory::NewStringFromAscii(CStrVector("barbarbar"));
773
+ seq_input = Handle<SeqAsciiString>::cast(input);
774
+ start_adr = seq_input->GetCharsAddress();
775
+
776
+ result = Execute(*code,
777
+ *input,
778
+ 0,
779
+ start_adr,
780
+ start_adr + input->length(),
781
+ captures,
782
+ true);
783
+
784
+ CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result);
785
+ }
786
+
787
+
788
+ TEST(MacroAssemblerNativeSimpleUC16) {
789
+ v8::V8::Initialize();
790
+ ContextInitializer initializer;
791
+
792
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4);
793
+
794
+ uc16 foo_chars[3] = {'f', 'o', 'o'};
795
+ Vector<const uc16> foo(foo_chars, 3);
796
+
797
+ Label fail;
798
+ m.CheckCharacters(foo, 0, &fail, true);
799
+ m.WriteCurrentPositionToRegister(0, 0);
800
+ m.AdvanceCurrentPosition(3);
801
+ m.WriteCurrentPositionToRegister(1, 0);
802
+ m.Succeed();
803
+ m.Bind(&fail);
804
+ m.Fail();
805
+
806
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("^foo"));
807
+ Handle<Object> code_object = m.GetCode(source);
808
+ Handle<Code> code = Handle<Code>::cast(code_object);
809
+
810
+ int captures[4] = {42, 37, 87, 117};
811
+ const uc16 input_data[6] = {'f', 'o', 'o', 'f', 'o', '\xa0'};
812
+ Handle<String> input =
813
+ Factory::NewStringFromTwoByte(Vector<const uc16>(input_data, 6));
814
+ Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input);
815
+ Address start_adr = seq_input->GetCharsAddress();
816
+
817
+ NativeRegExpMacroAssembler::Result result =
818
+ Execute(*code,
819
+ *input,
820
+ 0,
821
+ start_adr,
822
+ start_adr + input->length(),
823
+ captures,
824
+ true);
825
+
826
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
827
+ CHECK_EQ(0, captures[0]);
828
+ CHECK_EQ(3, captures[1]);
829
+ CHECK_EQ(-1, captures[2]);
830
+ CHECK_EQ(-1, captures[3]);
831
+
832
+ const uc16 input_data2[9] = {'b', 'a', 'r', 'b', 'a', 'r', 'b', 'a', '\xa0'};
833
+ input = Factory::NewStringFromTwoByte(Vector<const uc16>(input_data2, 9));
834
+ seq_input = Handle<SeqTwoByteString>::cast(input);
835
+ start_adr = seq_input->GetCharsAddress();
836
+
837
+ result = Execute(*code,
838
+ *input,
839
+ 0,
840
+ start_adr,
841
+ start_adr + input->length() * 2,
842
+ captures,
843
+ true);
844
+
845
+ CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result);
846
+ }
847
+
848
+
849
+ TEST(MacroAssemblerNativeBacktrack) {
850
+ v8::V8::Initialize();
851
+ ContextInitializer initializer;
852
+
853
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0);
854
+
855
+ Label fail;
856
+ Label backtrack;
857
+ m.LoadCurrentCharacter(10, &fail);
858
+ m.Succeed();
859
+ m.Bind(&fail);
860
+ m.PushBacktrack(&backtrack);
861
+ m.LoadCurrentCharacter(10, NULL);
862
+ m.Succeed();
863
+ m.Bind(&backtrack);
864
+ m.Fail();
865
+
866
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector(".........."));
867
+ Handle<Object> code_object = m.GetCode(source);
868
+ Handle<Code> code = Handle<Code>::cast(code_object);
869
+
870
+ Handle<String> input = Factory::NewStringFromAscii(CStrVector("foofoo"));
871
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
872
+ Address start_adr = seq_input->GetCharsAddress();
873
+
874
+ NativeRegExpMacroAssembler::Result result =
875
+ Execute(*code,
876
+ *input,
877
+ 0,
878
+ start_adr,
879
+ start_adr + input->length(),
880
+ NULL,
881
+ true);
882
+
883
+ CHECK_EQ(NativeRegExpMacroAssembler::FAILURE, result);
884
+ }
885
+
886
+
887
+ TEST(MacroAssemblerNativeBackReferenceASCII) {
888
+ v8::V8::Initialize();
889
+ ContextInitializer initializer;
890
+
891
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4);
892
+
893
+ m.WriteCurrentPositionToRegister(0, 0);
894
+ m.AdvanceCurrentPosition(2);
895
+ m.WriteCurrentPositionToRegister(1, 0);
896
+ Label nomatch;
897
+ m.CheckNotBackReference(0, &nomatch);
898
+ m.Fail();
899
+ m.Bind(&nomatch);
900
+ m.AdvanceCurrentPosition(2);
901
+ Label missing_match;
902
+ m.CheckNotBackReference(0, &missing_match);
903
+ m.WriteCurrentPositionToRegister(2, 0);
904
+ m.Succeed();
905
+ m.Bind(&missing_match);
906
+ m.Fail();
907
+
908
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("^(..)..\1"));
909
+ Handle<Object> code_object = m.GetCode(source);
910
+ Handle<Code> code = Handle<Code>::cast(code_object);
911
+
912
+ Handle<String> input = Factory::NewStringFromAscii(CStrVector("fooofo"));
913
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
914
+ Address start_adr = seq_input->GetCharsAddress();
915
+
916
+ int output[4];
917
+ NativeRegExpMacroAssembler::Result result =
918
+ Execute(*code,
919
+ *input,
920
+ 0,
921
+ start_adr,
922
+ start_adr + input->length(),
923
+ output,
924
+ true);
925
+
926
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
927
+ CHECK_EQ(0, output[0]);
928
+ CHECK_EQ(2, output[1]);
929
+ CHECK_EQ(6, output[2]);
930
+ CHECK_EQ(-1, output[3]);
931
+ }
932
+
933
+
934
+ TEST(MacroAssemblerNativeBackReferenceUC16) {
935
+ v8::V8::Initialize();
936
+ ContextInitializer initializer;
937
+
938
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::UC16, 4);
939
+
940
+ m.WriteCurrentPositionToRegister(0, 0);
941
+ m.AdvanceCurrentPosition(2);
942
+ m.WriteCurrentPositionToRegister(1, 0);
943
+ Label nomatch;
944
+ m.CheckNotBackReference(0, &nomatch);
945
+ m.Fail();
946
+ m.Bind(&nomatch);
947
+ m.AdvanceCurrentPosition(2);
948
+ Label missing_match;
949
+ m.CheckNotBackReference(0, &missing_match);
950
+ m.WriteCurrentPositionToRegister(2, 0);
951
+ m.Succeed();
952
+ m.Bind(&missing_match);
953
+ m.Fail();
954
+
955
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("^(..)..\1"));
956
+ Handle<Object> code_object = m.GetCode(source);
957
+ Handle<Code> code = Handle<Code>::cast(code_object);
958
+
959
+ const uc16 input_data[6] = {'f', 0x2028, 'o', 'o', 'f', 0x2028};
960
+ Handle<String> input =
961
+ Factory::NewStringFromTwoByte(Vector<const uc16>(input_data, 6));
962
+ Handle<SeqTwoByteString> seq_input = Handle<SeqTwoByteString>::cast(input);
963
+ Address start_adr = seq_input->GetCharsAddress();
964
+
965
+ int output[4];
966
+ NativeRegExpMacroAssembler::Result result =
967
+ Execute(*code,
968
+ *input,
969
+ 0,
970
+ start_adr,
971
+ start_adr + input->length() * 2,
972
+ output,
973
+ true);
974
+
975
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
976
+ CHECK_EQ(0, output[0]);
977
+ CHECK_EQ(2, output[1]);
978
+ CHECK_EQ(6, output[2]);
979
+ CHECK_EQ(-1, output[3]);
980
+ }
981
+
982
+
983
+
984
+ TEST(MacroAssemblernativeAtStart) {
985
+ v8::V8::Initialize();
986
+ ContextInitializer initializer;
987
+
988
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0);
989
+
990
+ Label not_at_start, newline, fail;
991
+ m.CheckNotAtStart(&not_at_start);
992
+ // Check that prevchar = '\n' and current = 'f'.
993
+ m.CheckCharacter('\n', &newline);
994
+ m.Bind(&fail);
995
+ m.Fail();
996
+ m.Bind(&newline);
997
+ m.LoadCurrentCharacter(0, &fail);
998
+ m.CheckNotCharacter('f', &fail);
999
+ m.Succeed();
1000
+
1001
+ m.Bind(&not_at_start);
1002
+ // Check that prevchar = 'o' and current = 'b'.
1003
+ Label prevo;
1004
+ m.CheckCharacter('o', &prevo);
1005
+ m.Fail();
1006
+ m.Bind(&prevo);
1007
+ m.LoadCurrentCharacter(0, &fail);
1008
+ m.CheckNotCharacter('b', &fail);
1009
+ m.Succeed();
1010
+
1011
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("(^f|ob)"));
1012
+ Handle<Object> code_object = m.GetCode(source);
1013
+ Handle<Code> code = Handle<Code>::cast(code_object);
1014
+
1015
+ Handle<String> input = Factory::NewStringFromAscii(CStrVector("foobar"));
1016
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
1017
+ Address start_adr = seq_input->GetCharsAddress();
1018
+
1019
+ NativeRegExpMacroAssembler::Result result =
1020
+ Execute(*code,
1021
+ *input,
1022
+ 0,
1023
+ start_adr,
1024
+ start_adr + input->length(),
1025
+ NULL,
1026
+ true);
1027
+
1028
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1029
+
1030
+ result = Execute(*code,
1031
+ *input,
1032
+ 3,
1033
+ start_adr + 3,
1034
+ start_adr + input->length(),
1035
+ NULL,
1036
+ false);
1037
+
1038
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1039
+ }
1040
+
1041
+
1042
+ TEST(MacroAssemblerNativeBackRefNoCase) {
1043
+ v8::V8::Initialize();
1044
+ ContextInitializer initializer;
1045
+
1046
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 4);
1047
+
1048
+ Label fail, succ;
1049
+
1050
+ m.WriteCurrentPositionToRegister(0, 0);
1051
+ m.WriteCurrentPositionToRegister(2, 0);
1052
+ m.AdvanceCurrentPosition(3);
1053
+ m.WriteCurrentPositionToRegister(3, 0);
1054
+ m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "AbC".
1055
+ m.CheckNotBackReferenceIgnoreCase(2, &fail); // Match "ABC".
1056
+ Label expected_fail;
1057
+ m.CheckNotBackReferenceIgnoreCase(2, &expected_fail);
1058
+ m.Bind(&fail);
1059
+ m.Fail();
1060
+
1061
+ m.Bind(&expected_fail);
1062
+ m.AdvanceCurrentPosition(3); // Skip "xYz"
1063
+ m.CheckNotBackReferenceIgnoreCase(2, &succ);
1064
+ m.Fail();
1065
+
1066
+ m.Bind(&succ);
1067
+ m.WriteCurrentPositionToRegister(1, 0);
1068
+ m.Succeed();
1069
+
1070
+ Handle<String> source =
1071
+ Factory::NewStringFromAscii(CStrVector("^(abc)\1\1(?!\1)...(?!\1)"));
1072
+ Handle<Object> code_object = m.GetCode(source);
1073
+ Handle<Code> code = Handle<Code>::cast(code_object);
1074
+
1075
+ Handle<String> input =
1076
+ Factory::NewStringFromAscii(CStrVector("aBcAbCABCxYzab"));
1077
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
1078
+ Address start_adr = seq_input->GetCharsAddress();
1079
+
1080
+ int output[4];
1081
+ NativeRegExpMacroAssembler::Result result =
1082
+ Execute(*code,
1083
+ *input,
1084
+ 0,
1085
+ start_adr,
1086
+ start_adr + input->length(),
1087
+ output,
1088
+ true);
1089
+
1090
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1091
+ CHECK_EQ(0, output[0]);
1092
+ CHECK_EQ(12, output[1]);
1093
+ CHECK_EQ(0, output[2]);
1094
+ CHECK_EQ(3, output[3]);
1095
+ }
1096
+
1097
+
1098
+
1099
+ TEST(MacroAssemblerNativeRegisters) {
1100
+ v8::V8::Initialize();
1101
+ ContextInitializer initializer;
1102
+
1103
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 6);
1104
+
1105
+ uc16 foo_chars[3] = {'f', 'o', 'o'};
1106
+ Vector<const uc16> foo(foo_chars, 3);
1107
+
1108
+ enum registers { out1, out2, out3, out4, out5, out6, sp, loop_cnt };
1109
+ Label fail;
1110
+ Label backtrack;
1111
+ m.WriteCurrentPositionToRegister(out1, 0); // Output: [0]
1112
+ m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck);
1113
+ m.PushBacktrack(&backtrack);
1114
+ m.WriteStackPointerToRegister(sp);
1115
+ // Fill stack and registers
1116
+ m.AdvanceCurrentPosition(2);
1117
+ m.WriteCurrentPositionToRegister(out1, 0);
1118
+ m.PushRegister(out1, RegExpMacroAssembler::kNoStackLimitCheck);
1119
+ m.PushBacktrack(&fail);
1120
+ // Drop backtrack stack frames.
1121
+ m.ReadStackPointerFromRegister(sp);
1122
+ // And take the first backtrack (to &backtrack)
1123
+ m.Backtrack();
1124
+
1125
+ m.PushCurrentPosition();
1126
+ m.AdvanceCurrentPosition(2);
1127
+ m.PopCurrentPosition();
1128
+
1129
+ m.Bind(&backtrack);
1130
+ m.PopRegister(out1);
1131
+ m.ReadCurrentPositionFromRegister(out1);
1132
+ m.AdvanceCurrentPosition(3);
1133
+ m.WriteCurrentPositionToRegister(out2, 0); // [0,3]
1134
+
1135
+ Label loop;
1136
+ m.SetRegister(loop_cnt, 0); // loop counter
1137
+ m.Bind(&loop);
1138
+ m.AdvanceRegister(loop_cnt, 1);
1139
+ m.AdvanceCurrentPosition(1);
1140
+ m.IfRegisterLT(loop_cnt, 3, &loop);
1141
+ m.WriteCurrentPositionToRegister(out3, 0); // [0,3,6]
1142
+
1143
+ Label loop2;
1144
+ m.SetRegister(loop_cnt, 2); // loop counter
1145
+ m.Bind(&loop2);
1146
+ m.AdvanceRegister(loop_cnt, -1);
1147
+ m.AdvanceCurrentPosition(1);
1148
+ m.IfRegisterGE(loop_cnt, 0, &loop2);
1149
+ m.WriteCurrentPositionToRegister(out4, 0); // [0,3,6,9]
1150
+
1151
+ Label loop3;
1152
+ Label exit_loop3;
1153
+ m.PushRegister(out4, RegExpMacroAssembler::kNoStackLimitCheck);
1154
+ m.PushRegister(out4, RegExpMacroAssembler::kNoStackLimitCheck);
1155
+ m.ReadCurrentPositionFromRegister(out3);
1156
+ m.Bind(&loop3);
1157
+ m.AdvanceCurrentPosition(1);
1158
+ m.CheckGreedyLoop(&exit_loop3);
1159
+ m.GoTo(&loop3);
1160
+ m.Bind(&exit_loop3);
1161
+ m.PopCurrentPosition();
1162
+ m.WriteCurrentPositionToRegister(out5, 0); // [0,3,6,9,9,-1]
1163
+
1164
+ m.Succeed();
1165
+
1166
+ m.Bind(&fail);
1167
+ m.Fail();
1168
+
1169
+ Handle<String> source =
1170
+ Factory::NewStringFromAscii(CStrVector("<loop test>"));
1171
+ Handle<Object> code_object = m.GetCode(source);
1172
+ Handle<Code> code = Handle<Code>::cast(code_object);
1173
+
1174
+ // String long enough for test (content doesn't matter).
1175
+ Handle<String> input =
1176
+ Factory::NewStringFromAscii(CStrVector("foofoofoofoofoo"));
1177
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
1178
+ Address start_adr = seq_input->GetCharsAddress();
1179
+
1180
+ int output[6];
1181
+ NativeRegExpMacroAssembler::Result result =
1182
+ Execute(*code,
1183
+ *input,
1184
+ 0,
1185
+ start_adr,
1186
+ start_adr + input->length(),
1187
+ output,
1188
+ true);
1189
+
1190
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1191
+ CHECK_EQ(0, output[0]);
1192
+ CHECK_EQ(3, output[1]);
1193
+ CHECK_EQ(6, output[2]);
1194
+ CHECK_EQ(9, output[3]);
1195
+ CHECK_EQ(9, output[4]);
1196
+ CHECK_EQ(-1, output[5]);
1197
+ }
1198
+
1199
+
1200
+ TEST(MacroAssemblerStackOverflow) {
1201
+ v8::V8::Initialize();
1202
+ ContextInitializer initializer;
1203
+
1204
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 0);
1205
+
1206
+ Label loop;
1207
+ m.Bind(&loop);
1208
+ m.PushBacktrack(&loop);
1209
+ m.GoTo(&loop);
1210
+
1211
+ Handle<String> source =
1212
+ Factory::NewStringFromAscii(CStrVector("<stack overflow test>"));
1213
+ Handle<Object> code_object = m.GetCode(source);
1214
+ Handle<Code> code = Handle<Code>::cast(code_object);
1215
+
1216
+ // String long enough for test (content doesn't matter).
1217
+ Handle<String> input =
1218
+ Factory::NewStringFromAscii(CStrVector("dummy"));
1219
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
1220
+ Address start_adr = seq_input->GetCharsAddress();
1221
+
1222
+ NativeRegExpMacroAssembler::Result result =
1223
+ Execute(*code,
1224
+ *input,
1225
+ 0,
1226
+ start_adr,
1227
+ start_adr + input->length(),
1228
+ NULL,
1229
+ true);
1230
+
1231
+ CHECK_EQ(NativeRegExpMacroAssembler::EXCEPTION, result);
1232
+ CHECK(Top::has_pending_exception());
1233
+ Top::clear_pending_exception();
1234
+ }
1235
+
1236
+
1237
+ TEST(MacroAssemblerNativeLotsOfRegisters) {
1238
+ v8::V8::Initialize();
1239
+ ContextInitializer initializer;
1240
+
1241
+ ArchRegExpMacroAssembler m(NativeRegExpMacroAssembler::ASCII, 2);
1242
+
1243
+ // At least 2048, to ensure the allocated space for registers
1244
+ // span one full page.
1245
+ const int large_number = 8000;
1246
+ m.WriteCurrentPositionToRegister(large_number, 42);
1247
+ m.WriteCurrentPositionToRegister(0, 0);
1248
+ m.WriteCurrentPositionToRegister(1, 1);
1249
+ Label done;
1250
+ m.CheckNotBackReference(0, &done); // Performs a system-stack push.
1251
+ m.Bind(&done);
1252
+ m.PushRegister(large_number, RegExpMacroAssembler::kNoStackLimitCheck);
1253
+ m.PopRegister(1);
1254
+ m.Succeed();
1255
+
1256
+ Handle<String> source =
1257
+ Factory::NewStringFromAscii(CStrVector("<huge register space test>"));
1258
+ Handle<Object> code_object = m.GetCode(source);
1259
+ Handle<Code> code = Handle<Code>::cast(code_object);
1260
+
1261
+ // String long enough for test (content doesn't matter).
1262
+ Handle<String> input =
1263
+ Factory::NewStringFromAscii(CStrVector("sample text"));
1264
+ Handle<SeqAsciiString> seq_input = Handle<SeqAsciiString>::cast(input);
1265
+ Address start_adr = seq_input->GetCharsAddress();
1266
+
1267
+ int captures[2];
1268
+ NativeRegExpMacroAssembler::Result result =
1269
+ Execute(*code,
1270
+ *input,
1271
+ 0,
1272
+ start_adr,
1273
+ start_adr + input->length(),
1274
+ captures,
1275
+ true);
1276
+
1277
+ CHECK_EQ(NativeRegExpMacroAssembler::SUCCESS, result);
1278
+ CHECK_EQ(0, captures[0]);
1279
+ CHECK_EQ(42, captures[1]);
1280
+
1281
+ Top::clear_pending_exception();
1282
+ }
1283
+
1284
+ #else // ! V8_REGEX_NATIVE
1285
+
1286
+ TEST(MacroAssembler) {
1287
+ V8::Initialize(NULL);
1288
+ byte codes[1024];
1289
+ RegExpMacroAssemblerIrregexp m(Vector<byte>(codes, 1024));
1290
+ // ^f(o)o.
1291
+ Label fail, fail2, start;
1292
+ uc16 foo_chars[3];
1293
+ foo_chars[0] = 'f';
1294
+ foo_chars[1] = 'o';
1295
+ foo_chars[2] = 'o';
1296
+ Vector<const uc16> foo(foo_chars, 3);
1297
+ m.SetRegister(4, 42);
1298
+ m.PushRegister(4, RegExpMacroAssembler::kNoStackLimitCheck);
1299
+ m.AdvanceRegister(4, 42);
1300
+ m.GoTo(&start);
1301
+ m.Fail();
1302
+ m.Bind(&start);
1303
+ m.PushBacktrack(&fail2);
1304
+ m.CheckCharacters(foo, 0, &fail, true);
1305
+ m.WriteCurrentPositionToRegister(0, 0);
1306
+ m.PushCurrentPosition();
1307
+ m.AdvanceCurrentPosition(3);
1308
+ m.WriteCurrentPositionToRegister(1, 0);
1309
+ m.PopCurrentPosition();
1310
+ m.AdvanceCurrentPosition(1);
1311
+ m.WriteCurrentPositionToRegister(2, 0);
1312
+ m.AdvanceCurrentPosition(1);
1313
+ m.WriteCurrentPositionToRegister(3, 0);
1314
+ m.Succeed();
1315
+
1316
+ m.Bind(&fail);
1317
+ m.Backtrack();
1318
+ m.Succeed();
1319
+
1320
+ m.Bind(&fail2);
1321
+ m.PopRegister(0);
1322
+ m.Fail();
1323
+
1324
+ v8::HandleScope scope;
1325
+
1326
+ Handle<String> source = Factory::NewStringFromAscii(CStrVector("^f(o)o"));
1327
+ Handle<ByteArray> array = Handle<ByteArray>::cast(m.GetCode(source));
1328
+ int captures[5];
1329
+
1330
+ const uc16 str1[] = {'f', 'o', 'o', 'b', 'a', 'r'};
1331
+ Handle<String> f1_16 =
1332
+ Factory::NewStringFromTwoByte(Vector<const uc16>(str1, 6));
1333
+
1334
+ CHECK(IrregexpInterpreter::Match(array, f1_16, captures, 0));
1335
+ CHECK_EQ(0, captures[0]);
1336
+ CHECK_EQ(3, captures[1]);
1337
+ CHECK_EQ(1, captures[2]);
1338
+ CHECK_EQ(2, captures[3]);
1339
+ CHECK_EQ(84, captures[4]);
1340
+
1341
+ const uc16 str2[] = {'b', 'a', 'r', 'f', 'o', 'o'};
1342
+ Handle<String> f2_16 =
1343
+ Factory::NewStringFromTwoByte(Vector<const uc16>(str2, 6));
1344
+
1345
+ CHECK(!IrregexpInterpreter::Match(array, f2_16, captures, 0));
1346
+ CHECK_EQ(42, captures[0]);
1347
+ }
1348
+
1349
+ #endif // ! V8_REGEXP_NATIVE
1350
+
1351
+
1352
+ TEST(AddInverseToTable) {
1353
+ static const int kLimit = 1000;
1354
+ static const int kRangeCount = 16;
1355
+ for (int t = 0; t < 10; t++) {
1356
+ ZoneScope zone_scope(DELETE_ON_EXIT);
1357
+ ZoneList<CharacterRange>* ranges =
1358
+ new ZoneList<CharacterRange>(kRangeCount);
1359
+ for (int i = 0; i < kRangeCount; i++) {
1360
+ int from = PseudoRandom(t + 87, i + 25) % kLimit;
1361
+ int to = from + (PseudoRandom(i + 87, t + 25) % (kLimit / 20));
1362
+ if (to > kLimit) to = kLimit;
1363
+ ranges->Add(CharacterRange(from, to));
1364
+ }
1365
+ DispatchTable table;
1366
+ DispatchTableConstructor cons(&table, false);
1367
+ cons.set_choice_index(0);
1368
+ cons.AddInverse(ranges);
1369
+ for (int i = 0; i < kLimit; i++) {
1370
+ bool is_on = false;
1371
+ for (int j = 0; !is_on && j < kRangeCount; j++)
1372
+ is_on = ranges->at(j).Contains(i);
1373
+ OutSet* set = table.Get(i);
1374
+ CHECK_EQ(is_on, set->Get(0) == false);
1375
+ }
1376
+ }
1377
+ ZoneScope zone_scope(DELETE_ON_EXIT);
1378
+ ZoneList<CharacterRange>* ranges =
1379
+ new ZoneList<CharacterRange>(1);
1380
+ ranges->Add(CharacterRange(0xFFF0, 0xFFFE));
1381
+ DispatchTable table;
1382
+ DispatchTableConstructor cons(&table, false);
1383
+ cons.set_choice_index(0);
1384
+ cons.AddInverse(ranges);
1385
+ CHECK(!table.Get(0xFFFE)->Get(0));
1386
+ CHECK(table.Get(0xFFFF)->Get(0));
1387
+ }
1388
+
1389
+
1390
+ static uc32 canonicalize(uc32 c) {
1391
+ unibrow::uchar canon[unibrow::Ecma262Canonicalize::kMaxWidth];
1392
+ int count = unibrow::Ecma262Canonicalize::Convert(c, '\0', canon, NULL);
1393
+ if (count == 0) {
1394
+ return c;
1395
+ } else {
1396
+ CHECK_EQ(1, count);
1397
+ return canon[0];
1398
+ }
1399
+ }
1400
+
1401
+
1402
+ TEST(LatinCanonicalize) {
1403
+ unibrow::Mapping<unibrow::Ecma262UnCanonicalize> un_canonicalize;
1404
+ for (char lower = 'a'; lower <= 'z'; lower++) {
1405
+ char upper = lower + ('A' - 'a');
1406
+ CHECK_EQ(canonicalize(lower), canonicalize(upper));
1407
+ unibrow::uchar uncanon[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1408
+ int length = un_canonicalize.get(lower, '\0', uncanon);
1409
+ CHECK_EQ(2, length);
1410
+ CHECK_EQ(upper, uncanon[0]);
1411
+ CHECK_EQ(lower, uncanon[1]);
1412
+ }
1413
+ for (uc32 c = 128; c < (1 << 21); c++)
1414
+ CHECK_GE(canonicalize(c), 128);
1415
+ unibrow::Mapping<unibrow::ToUppercase> to_upper;
1416
+ for (uc32 c = 0; c < (1 << 21); c++) {
1417
+ unibrow::uchar upper[unibrow::ToUppercase::kMaxWidth];
1418
+ int length = to_upper.get(c, '\0', upper);
1419
+ if (length == 0) {
1420
+ length = 1;
1421
+ upper[0] = c;
1422
+ }
1423
+ uc32 u = upper[0];
1424
+ if (length > 1 || (c >= 128 && u < 128))
1425
+ u = c;
1426
+ CHECK_EQ(u, canonicalize(c));
1427
+ }
1428
+ }
1429
+
1430
+
1431
+ static uc32 CanonRange(uc32 c) {
1432
+ unibrow::uchar canon[unibrow::CanonicalizationRange::kMaxWidth];
1433
+ int count = unibrow::CanonicalizationRange::Convert(c, '\0', canon, NULL);
1434
+ if (count == 0) {
1435
+ return c;
1436
+ } else {
1437
+ CHECK_EQ(1, count);
1438
+ return canon[0];
1439
+ }
1440
+ }
1441
+
1442
+
1443
+ TEST(RangeCanonicalization) {
1444
+ CHECK_NE(CanonRange(0) & CharacterRange::kStartMarker, 0);
1445
+ // Check that we arrive at the same result when using the basic
1446
+ // range canonicalization primitives as when using immediate
1447
+ // canonicalization.
1448
+ unibrow::Mapping<unibrow::Ecma262UnCanonicalize> un_canonicalize;
1449
+ for (int i = 0; i < CharacterRange::kRangeCanonicalizeMax; i++) {
1450
+ int range = CanonRange(i);
1451
+ int indirect_length = 0;
1452
+ unibrow::uchar indirect[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1453
+ if ((range & CharacterRange::kStartMarker) == 0) {
1454
+ indirect_length = un_canonicalize.get(i - range, '\0', indirect);
1455
+ for (int i = 0; i < indirect_length; i++)
1456
+ indirect[i] += range;
1457
+ } else {
1458
+ indirect_length = un_canonicalize.get(i, '\0', indirect);
1459
+ }
1460
+ unibrow::uchar direct[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1461
+ int direct_length = un_canonicalize.get(i, '\0', direct);
1462
+ CHECK_EQ(direct_length, indirect_length);
1463
+ }
1464
+ // Check that we arrive at the same results when skipping over
1465
+ // canonicalization ranges.
1466
+ int next_block = 0;
1467
+ while (next_block < CharacterRange::kRangeCanonicalizeMax) {
1468
+ uc32 start = CanonRange(next_block);
1469
+ CHECK_NE((start & CharacterRange::kStartMarker), 0);
1470
+ unsigned dist = start & CharacterRange::kPayloadMask;
1471
+ unibrow::uchar first[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1472
+ int first_length = un_canonicalize.get(next_block, '\0', first);
1473
+ for (unsigned i = 1; i < dist; i++) {
1474
+ CHECK_EQ(i, CanonRange(next_block + i));
1475
+ unibrow::uchar succ[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1476
+ int succ_length = un_canonicalize.get(next_block + i, '\0', succ);
1477
+ CHECK_EQ(first_length, succ_length);
1478
+ for (int j = 0; j < succ_length; j++) {
1479
+ int calc = first[j] + i;
1480
+ int found = succ[j];
1481
+ CHECK_EQ(calc, found);
1482
+ }
1483
+ }
1484
+ next_block = next_block + dist;
1485
+ }
1486
+ }
1487
+
1488
+
1489
+ TEST(UncanonicalizeEquivalence) {
1490
+ unibrow::Mapping<unibrow::Ecma262UnCanonicalize> un_canonicalize;
1491
+ unibrow::uchar chars[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1492
+ for (int i = 0; i < (1 << 16); i++) {
1493
+ int length = un_canonicalize.get(i, '\0', chars);
1494
+ for (int j = 0; j < length; j++) {
1495
+ unibrow::uchar chars2[unibrow::Ecma262UnCanonicalize::kMaxWidth];
1496
+ int length2 = un_canonicalize.get(chars[j], '\0', chars2);
1497
+ CHECK_EQ(length, length2);
1498
+ for (int k = 0; k < length; k++)
1499
+ CHECK_EQ(static_cast<int>(chars[k]), static_cast<int>(chars2[k]));
1500
+ }
1501
+ }
1502
+ }
1503
+
1504
+
1505
+ static void TestRangeCaseIndependence(CharacterRange input,
1506
+ Vector<CharacterRange> expected) {
1507
+ ZoneScope zone_scope(DELETE_ON_EXIT);
1508
+ int count = expected.length();
1509
+ ZoneList<CharacterRange>* list = new ZoneList<CharacterRange>(count);
1510
+ input.AddCaseEquivalents(list, false);
1511
+ CHECK_EQ(count, list->length());
1512
+ for (int i = 0; i < list->length(); i++) {
1513
+ CHECK_EQ(expected[i].from(), list->at(i).from());
1514
+ CHECK_EQ(expected[i].to(), list->at(i).to());
1515
+ }
1516
+ }
1517
+
1518
+
1519
+ static void TestSimpleRangeCaseIndependence(CharacterRange input,
1520
+ CharacterRange expected) {
1521
+ EmbeddedVector<CharacterRange, 1> vector;
1522
+ vector[0] = expected;
1523
+ TestRangeCaseIndependence(input, vector);
1524
+ }
1525
+
1526
+
1527
+ TEST(CharacterRangeCaseIndependence) {
1528
+ TestSimpleRangeCaseIndependence(CharacterRange::Singleton('a'),
1529
+ CharacterRange::Singleton('A'));
1530
+ TestSimpleRangeCaseIndependence(CharacterRange::Singleton('z'),
1531
+ CharacterRange::Singleton('Z'));
1532
+ TestSimpleRangeCaseIndependence(CharacterRange('a', 'z'),
1533
+ CharacterRange('A', 'Z'));
1534
+ TestSimpleRangeCaseIndependence(CharacterRange('c', 'f'),
1535
+ CharacterRange('C', 'F'));
1536
+ TestSimpleRangeCaseIndependence(CharacterRange('a', 'b'),
1537
+ CharacterRange('A', 'B'));
1538
+ TestSimpleRangeCaseIndependence(CharacterRange('y', 'z'),
1539
+ CharacterRange('Y', 'Z'));
1540
+ TestSimpleRangeCaseIndependence(CharacterRange('a' - 1, 'z' + 1),
1541
+ CharacterRange('A', 'Z'));
1542
+ TestSimpleRangeCaseIndependence(CharacterRange('A', 'Z'),
1543
+ CharacterRange('a', 'z'));
1544
+ TestSimpleRangeCaseIndependence(CharacterRange('C', 'F'),
1545
+ CharacterRange('c', 'f'));
1546
+ TestSimpleRangeCaseIndependence(CharacterRange('A' - 1, 'Z' + 1),
1547
+ CharacterRange('a', 'z'));
1548
+ // Here we need to add [l-z] to complete the case independence of
1549
+ // [A-Za-z] but we expect [a-z] to be added since we always add a
1550
+ // whole block at a time.
1551
+ TestSimpleRangeCaseIndependence(CharacterRange('A', 'k'),
1552
+ CharacterRange('a', 'z'));
1553
+ }
1554
+
1555
+
1556
+ static bool InClass(uc16 c, ZoneList<CharacterRange>* ranges) {
1557
+ if (ranges == NULL)
1558
+ return false;
1559
+ for (int i = 0; i < ranges->length(); i++) {
1560
+ CharacterRange range = ranges->at(i);
1561
+ if (range.from() <= c && c <= range.to())
1562
+ return true;
1563
+ }
1564
+ return false;
1565
+ }
1566
+
1567
+
1568
+ TEST(CharClassDifference) {
1569
+ ZoneScope zone_scope(DELETE_ON_EXIT);
1570
+ ZoneList<CharacterRange>* base = new ZoneList<CharacterRange>(1);
1571
+ base->Add(CharacterRange::Everything());
1572
+ Vector<const uc16> overlay = CharacterRange::GetWordBounds();
1573
+ ZoneList<CharacterRange>* included = NULL;
1574
+ ZoneList<CharacterRange>* excluded = NULL;
1575
+ CharacterRange::Split(base, overlay, &included, &excluded);
1576
+ for (int i = 0; i < (1 << 16); i++) {
1577
+ bool in_base = InClass(i, base);
1578
+ if (in_base) {
1579
+ bool in_overlay = false;
1580
+ for (int j = 0; !in_overlay && j < overlay.length(); j += 2) {
1581
+ if (overlay[j] <= i && i <= overlay[j+1])
1582
+ in_overlay = true;
1583
+ }
1584
+ CHECK_EQ(in_overlay, InClass(i, included));
1585
+ CHECK_EQ(!in_overlay, InClass(i, excluded));
1586
+ } else {
1587
+ CHECK(!InClass(i, included));
1588
+ CHECK(!InClass(i, excluded));
1589
+ }
1590
+ }
1591
+ }
1592
+
1593
+
1594
+ TEST(CanonicalizeCharacterSets) {
1595
+ ZoneScope scope(DELETE_ON_EXIT);
1596
+ ZoneList<CharacterRange>* list = new ZoneList<CharacterRange>(4);
1597
+ CharacterSet set(list);
1598
+
1599
+ list->Add(CharacterRange(10, 20));
1600
+ list->Add(CharacterRange(30, 40));
1601
+ list->Add(CharacterRange(50, 60));
1602
+ set.Canonicalize();
1603
+ ASSERT_EQ(3, list->length());
1604
+ ASSERT_EQ(10, list->at(0).from());
1605
+ ASSERT_EQ(20, list->at(0).to());
1606
+ ASSERT_EQ(30, list->at(1).from());
1607
+ ASSERT_EQ(40, list->at(1).to());
1608
+ ASSERT_EQ(50, list->at(2).from());
1609
+ ASSERT_EQ(60, list->at(2).to());
1610
+
1611
+ list->Rewind(0);
1612
+ list->Add(CharacterRange(10, 20));
1613
+ list->Add(CharacterRange(50, 60));
1614
+ list->Add(CharacterRange(30, 40));
1615
+ set.Canonicalize();
1616
+ ASSERT_EQ(3, list->length());
1617
+ ASSERT_EQ(10, list->at(0).from());
1618
+ ASSERT_EQ(20, list->at(0).to());
1619
+ ASSERT_EQ(30, list->at(1).from());
1620
+ ASSERT_EQ(40, list->at(1).to());
1621
+ ASSERT_EQ(50, list->at(2).from());
1622
+ ASSERT_EQ(60, list->at(2).to());
1623
+
1624
+ list->Rewind(0);
1625
+ list->Add(CharacterRange(30, 40));
1626
+ list->Add(CharacterRange(10, 20));
1627
+ list->Add(CharacterRange(25, 25));
1628
+ list->Add(CharacterRange(100, 100));
1629
+ list->Add(CharacterRange(1, 1));
1630
+ set.Canonicalize();
1631
+ ASSERT_EQ(5, list->length());
1632
+ ASSERT_EQ(1, list->at(0).from());
1633
+ ASSERT_EQ(1, list->at(0).to());
1634
+ ASSERT_EQ(10, list->at(1).from());
1635
+ ASSERT_EQ(20, list->at(1).to());
1636
+ ASSERT_EQ(25, list->at(2).from());
1637
+ ASSERT_EQ(25, list->at(2).to());
1638
+ ASSERT_EQ(30, list->at(3).from());
1639
+ ASSERT_EQ(40, list->at(3).to());
1640
+ ASSERT_EQ(100, list->at(4).from());
1641
+ ASSERT_EQ(100, list->at(4).to());
1642
+
1643
+ list->Rewind(0);
1644
+ list->Add(CharacterRange(10, 19));
1645
+ list->Add(CharacterRange(21, 30));
1646
+ list->Add(CharacterRange(20, 20));
1647
+ set.Canonicalize();
1648
+ ASSERT_EQ(1, list->length());
1649
+ ASSERT_EQ(10, list->at(0).from());
1650
+ ASSERT_EQ(30, list->at(0).to());
1651
+ }
1652
+
1653
+ // Checks whether a character is in the set represented by a list of ranges.
1654
+ static bool CharacterInSet(ZoneList<CharacterRange>* set, uc16 value) {
1655
+ for (int i = 0; i < set->length(); i++) {
1656
+ CharacterRange range = set->at(i);
1657
+ if (range.from() <= value && value <= range.to()) {
1658
+ return true;
1659
+ }
1660
+ }
1661
+ return false;
1662
+ }
1663
+
1664
+ TEST(CharacterRangeMerge) {
1665
+ ZoneScope zone_scope(DELETE_ON_EXIT);
1666
+ ZoneList<CharacterRange> l1(4);
1667
+ ZoneList<CharacterRange> l2(4);
1668
+ // Create all combinations of intersections of ranges, both singletons and
1669
+ // longer.
1670
+
1671
+ int offset = 0;
1672
+
1673
+ // The five kinds of singleton intersections:
1674
+ // X
1675
+ // Y - outside before
1676
+ // Y - outside touching start
1677
+ // Y - overlap
1678
+ // Y - outside touching end
1679
+ // Y - outside after
1680
+
1681
+ for (int i = 0; i < 5; i++) {
1682
+ l1.Add(CharacterRange::Singleton(offset + 2));
1683
+ l2.Add(CharacterRange::Singleton(offset + i));
1684
+ offset += 6;
1685
+ }
1686
+
1687
+ // The seven kinds of singleton/non-singleton intersections:
1688
+ // XXX
1689
+ // Y - outside before
1690
+ // Y - outside touching start
1691
+ // Y - inside touching start
1692
+ // Y - entirely inside
1693
+ // Y - inside touching end
1694
+ // Y - outside touching end
1695
+ // Y - disjoint after
1696
+
1697
+ for (int i = 0; i < 7; i++) {
1698
+ l1.Add(CharacterRange::Range(offset + 2, offset + 4));
1699
+ l2.Add(CharacterRange::Singleton(offset + i));
1700
+ offset += 8;
1701
+ }
1702
+
1703
+ // The eleven kinds of non-singleton intersections:
1704
+ //
1705
+ // XXXXXXXX
1706
+ // YYYY - outside before.
1707
+ // YYYY - outside touching start.
1708
+ // YYYY - overlapping start
1709
+ // YYYY - inside touching start
1710
+ // YYYY - entirely inside
1711
+ // YYYY - inside touching end
1712
+ // YYYY - overlapping end
1713
+ // YYYY - outside touching end
1714
+ // YYYY - outside after
1715
+ // YYYYYYYY - identical
1716
+ // YYYYYYYYYYYY - containing entirely.
1717
+
1718
+ for (int i = 0; i < 9; i++) {
1719
+ l1.Add(CharacterRange::Range(offset + 6, offset + 15)); // Length 8.
1720
+ l2.Add(CharacterRange::Range(offset + 2 * i, offset + 2 * i + 3));
1721
+ offset += 22;
1722
+ }
1723
+ l1.Add(CharacterRange::Range(offset + 6, offset + 15));
1724
+ l2.Add(CharacterRange::Range(offset + 6, offset + 15));
1725
+ offset += 22;
1726
+ l1.Add(CharacterRange::Range(offset + 6, offset + 15));
1727
+ l2.Add(CharacterRange::Range(offset + 4, offset + 17));
1728
+ offset += 22;
1729
+
1730
+ // Different kinds of multi-range overlap:
1731
+ // XXXXXXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXX
1732
+ // YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y YYYY Y
1733
+
1734
+ l1.Add(CharacterRange::Range(offset, offset + 21));
1735
+ l1.Add(CharacterRange::Range(offset + 31, offset + 52));
1736
+ for (int i = 0; i < 6; i++) {
1737
+ l2.Add(CharacterRange::Range(offset + 2, offset + 5));
1738
+ l2.Add(CharacterRange::Singleton(offset + 8));
1739
+ offset += 9;
1740
+ }
1741
+
1742
+ ASSERT(CharacterRange::IsCanonical(&l1));
1743
+ ASSERT(CharacterRange::IsCanonical(&l2));
1744
+
1745
+ ZoneList<CharacterRange> first_only(4);
1746
+ ZoneList<CharacterRange> second_only(4);
1747
+ ZoneList<CharacterRange> both(4);
1748
+
1749
+ // Merge one direction.
1750
+ CharacterRange::Merge(&l1, &l2, &first_only, &second_only, &both);
1751
+
1752
+ CHECK(CharacterRange::IsCanonical(&first_only));
1753
+ CHECK(CharacterRange::IsCanonical(&second_only));
1754
+ CHECK(CharacterRange::IsCanonical(&both));
1755
+
1756
+ for (uc16 i = 0; i < offset; i++) {
1757
+ bool in_first = CharacterInSet(&l1, i);
1758
+ bool in_second = CharacterInSet(&l2, i);
1759
+ CHECK((in_first && !in_second) == CharacterInSet(&first_only, i));
1760
+ CHECK((!in_first && in_second) == CharacterInSet(&second_only, i));
1761
+ CHECK((in_first && in_second) == CharacterInSet(&both, i));
1762
+ }
1763
+
1764
+ first_only.Clear();
1765
+ second_only.Clear();
1766
+ both.Clear();
1767
+
1768
+ // Merge other direction.
1769
+ CharacterRange::Merge(&l2, &l1, &second_only, &first_only, &both);
1770
+
1771
+ CHECK(CharacterRange::IsCanonical(&first_only));
1772
+ CHECK(CharacterRange::IsCanonical(&second_only));
1773
+ CHECK(CharacterRange::IsCanonical(&both));
1774
+
1775
+ for (uc16 i = 0; i < offset; i++) {
1776
+ bool in_first = CharacterInSet(&l1, i);
1777
+ bool in_second = CharacterInSet(&l2, i);
1778
+ CHECK((in_first && !in_second) == CharacterInSet(&first_only, i));
1779
+ CHECK((!in_first && in_second) == CharacterInSet(&second_only, i));
1780
+ CHECK((in_first && in_second) == CharacterInSet(&both, i));
1781
+ }
1782
+
1783
+ first_only.Clear();
1784
+ second_only.Clear();
1785
+ both.Clear();
1786
+
1787
+ // Merge but don't record all combinations.
1788
+ CharacterRange::Merge(&l1, &l2, NULL, NULL, &both);
1789
+
1790
+ CHECK(CharacterRange::IsCanonical(&both));
1791
+
1792
+ for (uc16 i = 0; i < offset; i++) {
1793
+ bool in_first = CharacterInSet(&l1, i);
1794
+ bool in_second = CharacterInSet(&l2, i);
1795
+ CHECK((in_first && in_second) == CharacterInSet(&both, i));
1796
+ }
1797
+
1798
+ // Merge into same set.
1799
+ ZoneList<CharacterRange> all(4);
1800
+ CharacterRange::Merge(&l1, &l2, &all, &all, &all);
1801
+
1802
+ CHECK(CharacterRange::IsCanonical(&all));
1803
+
1804
+ for (uc16 i = 0; i < offset; i++) {
1805
+ bool in_first = CharacterInSet(&l1, i);
1806
+ bool in_second = CharacterInSet(&l2, i);
1807
+ CHECK((in_first || in_second) == CharacterInSet(&all, i));
1808
+ }
1809
+ }
1810
+
1811
+
1812
+ TEST(Graph) {
1813
+ V8::Initialize(NULL);
1814
+ Execute("\\b\\w+\\b", false, true, true);
1815
+ }