therubyracer 0.4.8-x86-darwin-10 → 0.4.9-x86-darwin-10

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 (579) hide show
  1. data/.gitignore +11 -0
  2. data/.gitmodules +3 -0
  3. data/History.txt +5 -1
  4. data/Rakefile +35 -38
  5. data/ext/v8/callbacks.cpp +1 -1
  6. data/ext/v8/convert_ruby.h +1 -1
  7. data/ext/v8/convert_string.h +3 -3
  8. data/ext/v8/extconf.rb +9 -17
  9. data/ext/v8/upstream/2.0.6/.gitignore +26 -0
  10. data/ext/v8/upstream/Makefile +31 -0
  11. data/ext/v8/upstream/no-strict-aliasing.patch +13 -0
  12. data/ext/v8/v8_str.cpp +1 -1
  13. data/ext/v8/v8_template.cpp +1 -1
  14. data/lib/v8.rb +1 -1
  15. data/lib/v8/v8.bundle +0 -0
  16. data/spec/ext/obj_spec.rb +1 -1
  17. data/therubyracer.gemspec +658 -12
  18. metadata +611 -1182
  19. data/Manifest.txt +0 -1191
  20. data/ext/v8/upstream/2.0.6/.sconsign.dblite +0 -0
  21. data/ext/v8/upstream/2.0.6/benchmarks/README.txt +0 -63
  22. data/ext/v8/upstream/2.0.6/benchmarks/base.js +0 -264
  23. data/ext/v8/upstream/2.0.6/benchmarks/crypto.js +0 -1698
  24. data/ext/v8/upstream/2.0.6/benchmarks/deltablue.js +0 -880
  25. data/ext/v8/upstream/2.0.6/benchmarks/earley-boyer.js +0 -4684
  26. data/ext/v8/upstream/2.0.6/benchmarks/raytrace.js +0 -935
  27. data/ext/v8/upstream/2.0.6/benchmarks/regexp.js +0 -1614
  28. data/ext/v8/upstream/2.0.6/benchmarks/revisions.html +0 -86
  29. data/ext/v8/upstream/2.0.6/benchmarks/richards.js +0 -539
  30. data/ext/v8/upstream/2.0.6/benchmarks/run.html +0 -141
  31. data/ext/v8/upstream/2.0.6/benchmarks/run.js +0 -61
  32. data/ext/v8/upstream/2.0.6/benchmarks/splay.js +0 -378
  33. data/ext/v8/upstream/2.0.6/benchmarks/style.css +0 -77
  34. data/ext/v8/upstream/2.0.6/benchmarks/v8-logo.png +0 -0
  35. data/ext/v8/upstream/2.0.6/samples/SConscript +0 -38
  36. data/ext/v8/upstream/2.0.6/samples/count-hosts.js +0 -42
  37. data/ext/v8/upstream/2.0.6/samples/process.cc +0 -622
  38. data/ext/v8/upstream/2.0.6/samples/shell.cc +0 -303
  39. data/ext/v8/upstream/2.0.6/test/cctest/SConscript +0 -95
  40. data/ext/v8/upstream/2.0.6/test/cctest/cctest.cc +0 -126
  41. data/ext/v8/upstream/2.0.6/test/cctest/cctest.h +0 -211
  42. data/ext/v8/upstream/2.0.6/test/cctest/cctest.status +0 -54
  43. data/ext/v8/upstream/2.0.6/test/cctest/test-accessors.cc +0 -450
  44. data/ext/v8/upstream/2.0.6/test/cctest/test-alloc.cc +0 -215
  45. data/ext/v8/upstream/2.0.6/test/cctest/test-api.cc +0 -8699
  46. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-arm.cc +0 -227
  47. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-ia32.cc +0 -395
  48. data/ext/v8/upstream/2.0.6/test/cctest/test-assembler-x64.cc +0 -292
  49. data/ext/v8/upstream/2.0.6/test/cctest/test-ast.cc +0 -97
  50. data/ext/v8/upstream/2.0.6/test/cctest/test-compiler.cc +0 -318
  51. data/ext/v8/upstream/2.0.6/test/cctest/test-conversions.cc +0 -130
  52. data/ext/v8/upstream/2.0.6/test/cctest/test-debug.cc +0 -5788
  53. data/ext/v8/upstream/2.0.6/test/cctest/test-decls.cc +0 -593
  54. data/ext/v8/upstream/2.0.6/test/cctest/test-disasm-arm.cc +0 -281
  55. data/ext/v8/upstream/2.0.6/test/cctest/test-disasm-ia32.cc +0 -418
  56. data/ext/v8/upstream/2.0.6/test/cctest/test-flags.cc +0 -234
  57. data/ext/v8/upstream/2.0.6/test/cctest/test-func-name-inference.cc +0 -267
  58. data/ext/v8/upstream/2.0.6/test/cctest/test-hashmap.cc +0 -176
  59. data/ext/v8/upstream/2.0.6/test/cctest/test-heap-profiler.cc +0 -396
  60. data/ext/v8/upstream/2.0.6/test/cctest/test-heap.cc +0 -796
  61. data/ext/v8/upstream/2.0.6/test/cctest/test-list.cc +0 -101
  62. data/ext/v8/upstream/2.0.6/test/cctest/test-lock.cc +0 -63
  63. data/ext/v8/upstream/2.0.6/test/cctest/test-log-stack-tracer.cc +0 -372
  64. data/ext/v8/upstream/2.0.6/test/cctest/test-log-utils.cc +0 -310
  65. data/ext/v8/upstream/2.0.6/test/cctest/test-log.cc +0 -1081
  66. data/ext/v8/upstream/2.0.6/test/cctest/test-macro-assembler-x64.cc +0 -2104
  67. data/ext/v8/upstream/2.0.6/test/cctest/test-mark-compact.cc +0 -341
  68. data/ext/v8/upstream/2.0.6/test/cctest/test-parsing.cc +0 -129
  69. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-linux.cc +0 -80
  70. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-macos.cc +0 -10
  71. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-nullos.cc +0 -80
  72. data/ext/v8/upstream/2.0.6/test/cctest/test-platform-win32.cc +0 -26
  73. data/ext/v8/upstream/2.0.6/test/cctest/test-regexp.cc +0 -1815
  74. data/ext/v8/upstream/2.0.6/test/cctest/test-serialize.cc +0 -438
  75. data/ext/v8/upstream/2.0.6/test/cctest/test-sockets.cc +0 -162
  76. data/ext/v8/upstream/2.0.6/test/cctest/test-spaces.cc +0 -248
  77. data/ext/v8/upstream/2.0.6/test/cctest/test-strings.cc +0 -432
  78. data/ext/v8/upstream/2.0.6/test/cctest/test-thread-termination.cc +0 -290
  79. data/ext/v8/upstream/2.0.6/test/cctest/test-threads.cc +0 -52
  80. data/ext/v8/upstream/2.0.6/test/cctest/test-utils.cc +0 -186
  81. data/ext/v8/upstream/2.0.6/test/cctest/test-version.cc +0 -89
  82. data/ext/v8/upstream/2.0.6/test/cctest/testcfg.py +0 -108
  83. data/ext/v8/upstream/2.0.6/test/es5conform/README +0 -14
  84. data/ext/v8/upstream/2.0.6/test/es5conform/es5conform.status +0 -226
  85. data/ext/v8/upstream/2.0.6/test/es5conform/harness-adapt.js +0 -74
  86. data/ext/v8/upstream/2.0.6/test/es5conform/testcfg.py +0 -108
  87. data/ext/v8/upstream/2.0.6/test/message/message.status +0 -31
  88. data/ext/v8/upstream/2.0.6/test/message/overwritten-builtins.js +0 -31
  89. data/ext/v8/upstream/2.0.6/test/message/overwritten-builtins.out +0 -30
  90. data/ext/v8/upstream/2.0.6/test/message/regress/regress-73.js +0 -33
  91. data/ext/v8/upstream/2.0.6/test/message/regress/regress-73.out +0 -30
  92. data/ext/v8/upstream/2.0.6/test/message/regress/regress-75.js +0 -32
  93. data/ext/v8/upstream/2.0.6/test/message/regress/regress-75.out +0 -30
  94. data/ext/v8/upstream/2.0.6/test/message/simple-throw.js +0 -28
  95. data/ext/v8/upstream/2.0.6/test/message/simple-throw.out +0 -30
  96. data/ext/v8/upstream/2.0.6/test/message/testcfg.py +0 -135
  97. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-no-message.js +0 -51
  98. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-no-message.out +0 -26
  99. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-return-in-finally.js +0 -39
  100. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-return-in-finally.out +0 -28
  101. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch-and-finally.js +0 -34
  102. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch-and-finally.out +0 -30
  103. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch.js +0 -34
  104. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-catch.out +0 -30
  105. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-finally.js +0 -34
  106. data/ext/v8/upstream/2.0.6/test/message/try-catch-finally-throw-in-finally.out +0 -30
  107. data/ext/v8/upstream/2.0.6/test/message/try-finally-return-in-finally.js +0 -37
  108. data/ext/v8/upstream/2.0.6/test/message/try-finally-return-in-finally.out +0 -28
  109. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-finally.js +0 -32
  110. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-finally.out +0 -30
  111. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try-and-finally.js +0 -32
  112. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try-and-finally.out +0 -30
  113. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try.js +0 -32
  114. data/ext/v8/upstream/2.0.6/test/message/try-finally-throw-in-try.out +0 -30
  115. data/ext/v8/upstream/2.0.6/test/mjsunit/api-call-after-bypassed-exception.js +0 -39
  116. data/ext/v8/upstream/2.0.6/test/mjsunit/apply.js +0 -196
  117. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-apply.js +0 -134
  118. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-call-apply.js +0 -41
  119. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-enum.js +0 -52
  120. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-indirect.js +0 -47
  121. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-lazy.js +0 -47
  122. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-opt.js +0 -130
  123. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments-read-and-assignment.js +0 -164
  124. data/ext/v8/upstream/2.0.6/test/mjsunit/arguments.js +0 -97
  125. data/ext/v8/upstream/2.0.6/test/mjsunit/array-concat.js +0 -120
  126. data/ext/v8/upstream/2.0.6/test/mjsunit/array-constructor.js +0 -119
  127. data/ext/v8/upstream/2.0.6/test/mjsunit/array-functions-prototype.js +0 -159
  128. data/ext/v8/upstream/2.0.6/test/mjsunit/array-indexing.js +0 -66
  129. data/ext/v8/upstream/2.0.6/test/mjsunit/array-iteration.js +0 -228
  130. data/ext/v8/upstream/2.0.6/test/mjsunit/array-join.js +0 -45
  131. data/ext/v8/upstream/2.0.6/test/mjsunit/array-length-number-conversion.js +0 -53
  132. data/ext/v8/upstream/2.0.6/test/mjsunit/array-length.js +0 -111
  133. data/ext/v8/upstream/2.0.6/test/mjsunit/array-reduce.js +0 -514
  134. data/ext/v8/upstream/2.0.6/test/mjsunit/array-sort.js +0 -362
  135. data/ext/v8/upstream/2.0.6/test/mjsunit/array-splice.js +0 -314
  136. data/ext/v8/upstream/2.0.6/test/mjsunit/ascii-regexp-subject.js +0 -49
  137. data/ext/v8/upstream/2.0.6/test/mjsunit/big-array-literal.js +0 -111
  138. data/ext/v8/upstream/2.0.6/test/mjsunit/big-object-literal.js +0 -114
  139. data/ext/v8/upstream/2.0.6/test/mjsunit/binary-operation-overwrite.js +0 -36
  140. data/ext/v8/upstream/2.0.6/test/mjsunit/bit-not.js +0 -75
  141. data/ext/v8/upstream/2.0.6/test/mjsunit/bitwise-operations-undefined.js +0 -49
  142. data/ext/v8/upstream/2.0.6/test/mjsunit/body-not-visible.js +0 -39
  143. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-1344252.js +0 -79
  144. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-222.js +0 -42
  145. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-223.js +0 -39
  146. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-900066.js +0 -38
  147. data/ext/v8/upstream/2.0.6/test/mjsunit/bugs/bug-941049.js +0 -100
  148. data/ext/v8/upstream/2.0.6/test/mjsunit/call-non-function-call.js +0 -38
  149. data/ext/v8/upstream/2.0.6/test/mjsunit/call-non-function.js +0 -63
  150. data/ext/v8/upstream/2.0.6/test/mjsunit/call.js +0 -87
  151. data/ext/v8/upstream/2.0.6/test/mjsunit/char-escape.js +0 -53
  152. data/ext/v8/upstream/2.0.6/test/mjsunit/class-of-builtins.js +0 -50
  153. data/ext/v8/upstream/2.0.6/test/mjsunit/closure.js +0 -37
  154. data/ext/v8/upstream/2.0.6/test/mjsunit/codegen-coverage.js +0 -91
  155. data/ext/v8/upstream/2.0.6/test/mjsunit/compare-character.js +0 -50
  156. data/ext/v8/upstream/2.0.6/test/mjsunit/compare-nan.js +0 -66
  157. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/countoperation.js +0 -111
  158. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/function-call.js +0 -52
  159. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/globals.js +0 -65
  160. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/jsnatives.js +0 -33
  161. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/literals-assignment.js +0 -104
  162. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/literals.js +0 -52
  163. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/loops.js +0 -35
  164. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/objectliterals.js +0 -57
  165. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/property-simple.js +0 -39
  166. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/short-circuit.js +0 -102
  167. data/ext/v8/upstream/2.0.6/test/mjsunit/compiler/thisfunction.js +0 -35
  168. data/ext/v8/upstream/2.0.6/test/mjsunit/const-declaration.js +0 -172
  169. data/ext/v8/upstream/2.0.6/test/mjsunit/const-eval-init.js +0 -111
  170. data/ext/v8/upstream/2.0.6/test/mjsunit/const-redecl.js +0 -220
  171. data/ext/v8/upstream/2.0.6/test/mjsunit/const.js +0 -70
  172. data/ext/v8/upstream/2.0.6/test/mjsunit/constant-folding.js +0 -232
  173. data/ext/v8/upstream/2.0.6/test/mjsunit/context-variable-assignments.js +0 -37
  174. data/ext/v8/upstream/2.0.6/test/mjsunit/cyclic-array-to-string.js +0 -65
  175. data/ext/v8/upstream/2.0.6/test/mjsunit/cyrillic.js +0 -199
  176. data/ext/v8/upstream/2.0.6/test/mjsunit/d8-os.js +0 -180
  177. data/ext/v8/upstream/2.0.6/test/mjsunit/date-parse.js +0 -268
  178. data/ext/v8/upstream/2.0.6/test/mjsunit/date.js +0 -149
  179. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-backtrace-text.js +0 -122
  180. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-backtrace.js +0 -272
  181. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-breakpoints.js +0 -120
  182. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-changebreakpoint.js +0 -108
  183. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-clearbreakpoint.js +0 -101
  184. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-clearbreakpointgroup.js +0 -117
  185. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-compile-event.js +0 -126
  186. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-conditional-breakpoints.js +0 -171
  187. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-constructed-by.js +0 -60
  188. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-constructor.js +0 -78
  189. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-continue.js +0 -114
  190. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-enable-disable-breakpoints.js +0 -90
  191. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-arguments.js +0 -93
  192. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-bool-constructor.js +0 -80
  193. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-locals.js +0 -132
  194. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-recursive.js +0 -167
  195. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate-with.js +0 -77
  196. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-evaluate.js +0 -118
  197. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-event-listener.js +0 -73
  198. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-handle.js +0 -252
  199. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-ignore-breakpoints.js +0 -89
  200. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-mirror-cache.js +0 -85
  201. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-multiple-breakpoints.js +0 -105
  202. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-referenced-by.js +0 -112
  203. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-references.js +0 -118
  204. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-scopes.js +0 -761
  205. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-script-breakpoints.js +0 -112
  206. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-script.js +0 -92
  207. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-scripts-request.js +0 -108
  208. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-setbreakpoint.js +0 -165
  209. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-sourceinfo.js +0 -352
  210. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-sourceslice.js +0 -74
  211. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-step-stub-callfunction.js +0 -87
  212. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-step.js +0 -82
  213. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-accessor.js +0 -248
  214. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-builtin.js +0 -78
  215. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-call-function-stub.js +0 -115
  216. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-constructor.js +0 -78
  217. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepin-function-call.js +0 -149
  218. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepnext-do-while.js +0 -79
  219. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepout-recursive-function.js +0 -106
  220. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-stepout-to-builtin.js +0 -84
  221. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-suspend.js +0 -96
  222. data/ext/v8/upstream/2.0.6/test/mjsunit/debug-version.js +0 -90
  223. data/ext/v8/upstream/2.0.6/test/mjsunit/declare-locally.js +0 -43
  224. data/ext/v8/upstream/2.0.6/test/mjsunit/deep-recursion.js +0 -66
  225. data/ext/v8/upstream/2.0.6/test/mjsunit/delay-syntax-error.js +0 -41
  226. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-global-properties.js +0 -37
  227. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-in-eval.js +0 -32
  228. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-in-with.js +0 -34
  229. data/ext/v8/upstream/2.0.6/test/mjsunit/delete-vars-from-eval.js +0 -40
  230. data/ext/v8/upstream/2.0.6/test/mjsunit/delete.js +0 -163
  231. data/ext/v8/upstream/2.0.6/test/mjsunit/div-mod.js +0 -157
  232. data/ext/v8/upstream/2.0.6/test/mjsunit/do-not-strip-fc.js +0 -31
  233. data/ext/v8/upstream/2.0.6/test/mjsunit/dont-enum-array-holes.js +0 -35
  234. data/ext/v8/upstream/2.0.6/test/mjsunit/dont-reinit-global-var.js +0 -47
  235. data/ext/v8/upstream/2.0.6/test/mjsunit/double-equals.js +0 -114
  236. data/ext/v8/upstream/2.0.6/test/mjsunit/dtoa.js +0 -32
  237. data/ext/v8/upstream/2.0.6/test/mjsunit/enumeration-order.js +0 -109
  238. data/ext/v8/upstream/2.0.6/test/mjsunit/error-constructors.js +0 -32
  239. data/ext/v8/upstream/2.0.6/test/mjsunit/escape.js +0 -118
  240. data/ext/v8/upstream/2.0.6/test/mjsunit/eval-enclosing-function-name.js +0 -76
  241. data/ext/v8/upstream/2.0.6/test/mjsunit/eval-typeof-non-existing.js +0 -35
  242. data/ext/v8/upstream/2.0.6/test/mjsunit/eval.js +0 -157
  243. data/ext/v8/upstream/2.0.6/test/mjsunit/execScript-case-insensitive.js +0 -34
  244. data/ext/v8/upstream/2.0.6/test/mjsunit/extra-arguments.js +0 -54
  245. data/ext/v8/upstream/2.0.6/test/mjsunit/extra-commas.js +0 -46
  246. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in-null-or-undefined.js +0 -33
  247. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in-special-cases.js +0 -64
  248. data/ext/v8/upstream/2.0.6/test/mjsunit/for-in.js +0 -86
  249. data/ext/v8/upstream/2.0.6/test/mjsunit/fun-as-prototype.js +0 -36
  250. data/ext/v8/upstream/2.0.6/test/mjsunit/fun-name.js +0 -34
  251. data/ext/v8/upstream/2.0.6/test/mjsunit/function-arguments-null.js +0 -30
  252. data/ext/v8/upstream/2.0.6/test/mjsunit/function-caller.js +0 -48
  253. data/ext/v8/upstream/2.0.6/test/mjsunit/function-names.js +0 -133
  254. data/ext/v8/upstream/2.0.6/test/mjsunit/function-property.js +0 -29
  255. data/ext/v8/upstream/2.0.6/test/mjsunit/function-prototype.js +0 -98
  256. data/ext/v8/upstream/2.0.6/test/mjsunit/function-source.js +0 -49
  257. data/ext/v8/upstream/2.0.6/test/mjsunit/function.js +0 -83
  258. data/ext/v8/upstream/2.0.6/test/mjsunit/fuzz-accessors.js +0 -85
  259. data/ext/v8/upstream/2.0.6/test/mjsunit/fuzz-natives.js +0 -159
  260. data/ext/v8/upstream/2.0.6/test/mjsunit/get-own-property-descriptor.js +0 -51
  261. data/ext/v8/upstream/2.0.6/test/mjsunit/get-prototype-of.js +0 -68
  262. data/ext/v8/upstream/2.0.6/test/mjsunit/getter-in-prototype.js +0 -50
  263. data/ext/v8/upstream/2.0.6/test/mjsunit/getter-in-value-prototype.js +0 -35
  264. data/ext/v8/upstream/2.0.6/test/mjsunit/global-const-var-conflicts.js +0 -57
  265. data/ext/v8/upstream/2.0.6/test/mjsunit/global-deleted-property-ic.js +0 -45
  266. data/ext/v8/upstream/2.0.6/test/mjsunit/global-deleted-property-keyed.js +0 -38
  267. data/ext/v8/upstream/2.0.6/test/mjsunit/global-ic.js +0 -48
  268. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-eval-in-with.js +0 -59
  269. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-eval.js +0 -85
  270. data/ext/v8/upstream/2.0.6/test/mjsunit/global-load-from-nested-eval.js +0 -66
  271. data/ext/v8/upstream/2.0.6/test/mjsunit/global-vars-eval.js +0 -34
  272. data/ext/v8/upstream/2.0.6/test/mjsunit/global-vars-with.js +0 -43
  273. data/ext/v8/upstream/2.0.6/test/mjsunit/greedy.js +0 -60
  274. data/ext/v8/upstream/2.0.6/test/mjsunit/has-own-property.js +0 -38
  275. data/ext/v8/upstream/2.0.6/test/mjsunit/html-comments.js +0 -57
  276. data/ext/v8/upstream/2.0.6/test/mjsunit/html-string-funcs.js +0 -47
  277. data/ext/v8/upstream/2.0.6/test/mjsunit/if-in-undefined.js +0 -36
  278. data/ext/v8/upstream/2.0.6/test/mjsunit/in.js +0 -159
  279. data/ext/v8/upstream/2.0.6/test/mjsunit/indexed-accessors.js +0 -120
  280. data/ext/v8/upstream/2.0.6/test/mjsunit/instanceof.js +0 -93
  281. data/ext/v8/upstream/2.0.6/test/mjsunit/integer-to-string.js +0 -35
  282. data/ext/v8/upstream/2.0.6/test/mjsunit/invalid-lhs.js +0 -65
  283. data/ext/v8/upstream/2.0.6/test/mjsunit/invalid-source-element.js +0 -31
  284. data/ext/v8/upstream/2.0.6/test/mjsunit/json.js +0 -207
  285. data/ext/v8/upstream/2.0.6/test/mjsunit/keyed-ic.js +0 -236
  286. data/ext/v8/upstream/2.0.6/test/mjsunit/keyed-storage-extend.js +0 -55
  287. data/ext/v8/upstream/2.0.6/test/mjsunit/large-object-allocation.js +0 -300
  288. data/ext/v8/upstream/2.0.6/test/mjsunit/large-object-literal.js +0 -56
  289. data/ext/v8/upstream/2.0.6/test/mjsunit/lazy-load.js +0 -34
  290. data/ext/v8/upstream/2.0.6/test/mjsunit/leakcheck.js +0 -53
  291. data/ext/v8/upstream/2.0.6/test/mjsunit/length.js +0 -78
  292. data/ext/v8/upstream/2.0.6/test/mjsunit/local-load-from-eval.js +0 -39
  293. data/ext/v8/upstream/2.0.6/test/mjsunit/math-min-max.js +0 -105
  294. data/ext/v8/upstream/2.0.6/test/mjsunit/megamorphic-callbacks.js +0 -70
  295. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-array.js +0 -138
  296. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-boolean.js +0 -59
  297. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-date.js +0 -77
  298. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-error.js +0 -94
  299. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-function.js +0 -90
  300. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-null.js +0 -50
  301. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-number.js +0 -77
  302. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-object.js +0 -227
  303. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-regexp.js +0 -110
  304. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-script.js +0 -100
  305. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-string.js +0 -89
  306. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-undefined.js +0 -50
  307. data/ext/v8/upstream/2.0.6/test/mjsunit/mirror-unresolved-function.js +0 -81
  308. data/ext/v8/upstream/2.0.6/test/mjsunit/mjsunit.js +0 -203
  309. data/ext/v8/upstream/2.0.6/test/mjsunit/mjsunit.status +0 -66
  310. data/ext/v8/upstream/2.0.6/test/mjsunit/mul-exhaustive.js +0 -4511
  311. data/ext/v8/upstream/2.0.6/test/mjsunit/multiple-return.js +0 -62
  312. data/ext/v8/upstream/2.0.6/test/mjsunit/negate-zero.js +0 -42
  313. data/ext/v8/upstream/2.0.6/test/mjsunit/negate.js +0 -59
  314. data/ext/v8/upstream/2.0.6/test/mjsunit/new.js +0 -56
  315. data/ext/v8/upstream/2.0.6/test/mjsunit/newline-in-string.js +0 -46
  316. data/ext/v8/upstream/2.0.6/test/mjsunit/no-branch-elimination.js +0 -36
  317. data/ext/v8/upstream/2.0.6/test/mjsunit/no-octal-constants-above-256.js +0 -32
  318. data/ext/v8/upstream/2.0.6/test/mjsunit/no-semicolon.js +0 -45
  319. data/ext/v8/upstream/2.0.6/test/mjsunit/non-ascii-replace.js +0 -30
  320. data/ext/v8/upstream/2.0.6/test/mjsunit/nul-characters.js +0 -38
  321. data/ext/v8/upstream/2.0.6/test/mjsunit/number-limits.js +0 -47
  322. data/ext/v8/upstream/2.0.6/test/mjsunit/number-string-index-call.js +0 -32
  323. data/ext/v8/upstream/2.0.6/test/mjsunit/number-tostring-small.js +0 -395
  324. data/ext/v8/upstream/2.0.6/test/mjsunit/number-tostring.js +0 -338
  325. data/ext/v8/upstream/2.0.6/test/mjsunit/obj-construct.js +0 -46
  326. data/ext/v8/upstream/2.0.6/test/mjsunit/object-create.js +0 -250
  327. data/ext/v8/upstream/2.0.6/test/mjsunit/object-literal-gc.js +0 -66
  328. data/ext/v8/upstream/2.0.6/test/mjsunit/object-literal.js +0 -105
  329. data/ext/v8/upstream/2.0.6/test/mjsunit/override-read-only-property.js +0 -64
  330. data/ext/v8/upstream/2.0.6/test/mjsunit/parse-int-float.js +0 -85
  331. data/ext/v8/upstream/2.0.6/test/mjsunit/property-load-across-eval.js +0 -85
  332. data/ext/v8/upstream/2.0.6/test/mjsunit/property-object-key.js +0 -36
  333. data/ext/v8/upstream/2.0.6/test/mjsunit/proto.js +0 -33
  334. data/ext/v8/upstream/2.0.6/test/mjsunit/prototype.js +0 -93
  335. data/ext/v8/upstream/2.0.6/test/mjsunit/receiver-in-with-calls.js +0 -47
  336. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-UC16.js +0 -47
  337. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-call-as-function.js +0 -36
  338. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-capture.js +0 -57
  339. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-captures.js +0 -31
  340. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-indexof.js +0 -77
  341. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-lookahead.js +0 -166
  342. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-loop-capture.js +0 -29
  343. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-multiline-stack-trace.js +0 -116
  344. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-multiline.js +0 -112
  345. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-standalones.js +0 -78
  346. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-static.js +0 -167
  347. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp-string-methods.js +0 -51
  348. data/ext/v8/upstream/2.0.6/test/mjsunit/regexp.js +0 -390
  349. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1030466.js +0 -45
  350. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1036894.js +0 -38
  351. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1039610.js +0 -29
  352. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1050043.js +0 -51
  353. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1062422.js +0 -30
  354. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1066899.js +0 -37
  355. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1081309.js +0 -110
  356. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1102760.js +0 -35
  357. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1110164.js +0 -46
  358. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1112051.js +0 -33
  359. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1114040.js +0 -58
  360. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1134697.js +0 -31
  361. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-114.js +0 -43
  362. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-116.js +0 -40
  363. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1170187.js +0 -80
  364. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1173979.js +0 -48
  365. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1175390.js +0 -30
  366. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1177518.js +0 -39
  367. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1177809.js +0 -31
  368. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1178598.js +0 -90
  369. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1182832.js +0 -38
  370. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1187524.js +0 -34
  371. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1199401.js +0 -75
  372. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1199637.js +0 -78
  373. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1200351.js +0 -2032
  374. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1201933.js +0 -40
  375. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1203459.js +0 -29
  376. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1207276.js +0 -36
  377. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1213516.js +0 -40
  378. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1213575.js +0 -41
  379. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1215653.js +0 -365
  380. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-124.js +0 -57
  381. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1254366.js +0 -38
  382. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1327557.js +0 -36
  383. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1341167.js +0 -33
  384. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1346700.js +0 -29
  385. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-137.js +0 -46
  386. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1439135.js +0 -40
  387. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-149.js +0 -28
  388. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1493017.js +0 -52
  389. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-155924.js +0 -46
  390. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-171.js +0 -41
  391. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-176.js +0 -50
  392. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-186.js +0 -72
  393. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-187.js +0 -30
  394. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-189.js +0 -36
  395. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-191.js +0 -42
  396. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-1919169.js +0 -40
  397. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-192.js +0 -38
  398. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-193.js +0 -44
  399. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-20070207.js +0 -42
  400. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-201.js +0 -37
  401. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-219.js +0 -176
  402. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-220.js +0 -31
  403. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-221.js +0 -34
  404. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-2249423.js +0 -40
  405. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-225.js +0 -32
  406. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-227.js +0 -33
  407. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-231.js +0 -92
  408. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-233.js +0 -39
  409. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-244.js +0 -67
  410. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-246.js +0 -31
  411. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-253.js +0 -31
  412. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-254.js +0 -58
  413. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-259.js +0 -33
  414. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-260.js +0 -33
  415. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-263.js +0 -38
  416. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-265.js +0 -64
  417. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-267.js +0 -35
  418. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-269.js +0 -49
  419. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-279.js +0 -62
  420. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-284.js +0 -50
  421. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-286.js +0 -36
  422. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-294.js +0 -43
  423. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-312.js +0 -31
  424. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-317.js +0 -31
  425. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-318.js +0 -35
  426. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-326.js +0 -40
  427. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-334.js +0 -90
  428. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-341.js +0 -36
  429. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-345.js +0 -51
  430. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-349.js +0 -32
  431. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-35.js +0 -33
  432. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-351.js +0 -31
  433. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-386.js +0 -47
  434. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-392.js +0 -34
  435. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-394.js +0 -47
  436. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-396.js +0 -39
  437. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-397.js +0 -34
  438. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-399.js +0 -32
  439. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-406.js +0 -69
  440. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-416.js +0 -38
  441. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-475.js +0 -28
  442. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-483.js +0 -35
  443. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-485.js +0 -64
  444. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-486.js +0 -30
  445. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-490.js +0 -48
  446. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-491.js +0 -47
  447. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-492.js +0 -52
  448. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-496.js +0 -39
  449. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-502.js +0 -38
  450. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-503.js +0 -63
  451. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-515.js +0 -40
  452. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-524.js +0 -32
  453. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-526.js +0 -32
  454. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-540.js +0 -47
  455. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-545.js +0 -47
  456. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-57.js +0 -32
  457. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-580.js +0 -55
  458. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-588599.js +0 -31
  459. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-6-9-regexp.js +0 -30
  460. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-662254.js +0 -40
  461. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-666721.js +0 -53
  462. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-667061.js +0 -90
  463. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-670147.js +0 -34
  464. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-674753.js +0 -87
  465. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-676025.js +0 -31
  466. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-678525.js +0 -59
  467. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-682649.js +0 -30
  468. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-69.js +0 -43
  469. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-734862.js +0 -37
  470. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-737588.js +0 -34
  471. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-74.js +0 -41
  472. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-780423.js +0 -39
  473. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-799761.js +0 -92
  474. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-806473.js +0 -60
  475. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-842017.js +0 -60
  476. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-86.js +0 -46
  477. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-87.js +0 -58
  478. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-874178.js +0 -32
  479. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-875031.js +0 -37
  480. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-877615.js +0 -37
  481. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-892742.js +0 -50
  482. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-900055.js +0 -42
  483. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-900966.js +0 -38
  484. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-91.js +0 -38
  485. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-925537.js +0 -42
  486. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-937896.js +0 -50
  487. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-990205.js +0 -35
  488. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-992733.js +0 -35
  489. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-996542.js +0 -40
  490. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-998565.js +0 -51
  491. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-crbug-18639.js +0 -34
  492. data/ext/v8/upstream/2.0.6/test/mjsunit/regress/regress-r3391.js +0 -77
  493. data/ext/v8/upstream/2.0.6/test/mjsunit/scanner.js +0 -30
  494. data/ext/v8/upstream/2.0.6/test/mjsunit/short-circuit-boolean.js +0 -46
  495. data/ext/v8/upstream/2.0.6/test/mjsunit/simple-constructor.js +0 -140
  496. data/ext/v8/upstream/2.0.6/test/mjsunit/sin-cos.js +0 -45
  497. data/ext/v8/upstream/2.0.6/test/mjsunit/smi-negative-zero.js +0 -100
  498. data/ext/v8/upstream/2.0.6/test/mjsunit/smi-ops.js +0 -671
  499. data/ext/v8/upstream/2.0.6/test/mjsunit/sparse-array-reverse.js +0 -131
  500. data/ext/v8/upstream/2.0.6/test/mjsunit/sparse-array.js +0 -41
  501. data/ext/v8/upstream/2.0.6/test/mjsunit/stack-traces.js +0 -204
  502. data/ext/v8/upstream/2.0.6/test/mjsunit/str-to-num.js +0 -158
  503. data/ext/v8/upstream/2.0.6/test/mjsunit/stress-array-push.js +0 -34
  504. data/ext/v8/upstream/2.0.6/test/mjsunit/strict-equals.js +0 -90
  505. data/ext/v8/upstream/2.0.6/test/mjsunit/string-add.js +0 -195
  506. data/ext/v8/upstream/2.0.6/test/mjsunit/string-case.js +0 -28
  507. data/ext/v8/upstream/2.0.6/test/mjsunit/string-charat.js +0 -53
  508. data/ext/v8/upstream/2.0.6/test/mjsunit/string-charcodeat.js +0 -192
  509. data/ext/v8/upstream/2.0.6/test/mjsunit/string-compare-alignment.js +0 -47
  510. data/ext/v8/upstream/2.0.6/test/mjsunit/string-flatten.js +0 -37
  511. data/ext/v8/upstream/2.0.6/test/mjsunit/string-index.js +0 -154
  512. data/ext/v8/upstream/2.0.6/test/mjsunit/string-indexof-1.js +0 -99
  513. data/ext/v8/upstream/2.0.6/test/mjsunit/string-indexof-2.js +0 -68
  514. data/ext/v8/upstream/2.0.6/test/mjsunit/string-lastindexof.js +0 -88
  515. data/ext/v8/upstream/2.0.6/test/mjsunit/string-localecompare.js +0 -40
  516. data/ext/v8/upstream/2.0.6/test/mjsunit/string-match.js +0 -149
  517. data/ext/v8/upstream/2.0.6/test/mjsunit/string-replace-gc.js +0 -57
  518. data/ext/v8/upstream/2.0.6/test/mjsunit/string-replace.js +0 -182
  519. data/ext/v8/upstream/2.0.6/test/mjsunit/string-search.js +0 -30
  520. data/ext/v8/upstream/2.0.6/test/mjsunit/string-split.js +0 -126
  521. data/ext/v8/upstream/2.0.6/test/mjsunit/substr.js +0 -65
  522. data/ext/v8/upstream/2.0.6/test/mjsunit/switch.js +0 -289
  523. data/ext/v8/upstream/2.0.6/test/mjsunit/testcfg.py +0 -137
  524. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/array-isarray.js +0 -48
  525. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/array-splice-webkit.js +0 -62
  526. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/object-keys.js +0 -68
  527. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/regexp-pcre.js +0 -6603
  528. data/ext/v8/upstream/2.0.6/test/mjsunit/third_party/string-trim.js +0 -107
  529. data/ext/v8/upstream/2.0.6/test/mjsunit/this-in-callbacks.js +0 -47
  530. data/ext/v8/upstream/2.0.6/test/mjsunit/this.js +0 -46
  531. data/ext/v8/upstream/2.0.6/test/mjsunit/throw-and-catch-function.js +0 -50
  532. data/ext/v8/upstream/2.0.6/test/mjsunit/throw-exception-for-null-access.js +0 -37
  533. data/ext/v8/upstream/2.0.6/test/mjsunit/to-precision.js +0 -82
  534. data/ext/v8/upstream/2.0.6/test/mjsunit/to_number_order.js +0 -129
  535. data/ext/v8/upstream/2.0.6/test/mjsunit/tobool.js +0 -36
  536. data/ext/v8/upstream/2.0.6/test/mjsunit/toint32.js +0 -129
  537. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/codemap.js +0 -180
  538. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/consarray.js +0 -60
  539. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/csvparser.js +0 -79
  540. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/logreader.js +0 -98
  541. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/profile.js +0 -348
  542. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/profile_view.js +0 -95
  543. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/splaytree.js +0 -166
  544. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.default +0 -55
  545. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.gc-state +0 -21
  546. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.ignore-unknown +0 -51
  547. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor-test.separate-ic +0 -61
  548. data/ext/v8/upstream/2.0.6/test/mjsunit/tools/tickprocessor.js +0 -409
  549. data/ext/v8/upstream/2.0.6/test/mjsunit/top-level-assignments.js +0 -107
  550. data/ext/v8/upstream/2.0.6/test/mjsunit/touint32.js +0 -72
  551. data/ext/v8/upstream/2.0.6/test/mjsunit/transcendentals.js +0 -49
  552. data/ext/v8/upstream/2.0.6/test/mjsunit/try-catch-extension-object.js +0 -58
  553. data/ext/v8/upstream/2.0.6/test/mjsunit/try-catch-scopes.js +0 -42
  554. data/ext/v8/upstream/2.0.6/test/mjsunit/try-finally-nested.js +0 -46
  555. data/ext/v8/upstream/2.0.6/test/mjsunit/try.js +0 -394
  556. data/ext/v8/upstream/2.0.6/test/mjsunit/typeof.js +0 -40
  557. data/ext/v8/upstream/2.0.6/test/mjsunit/undeletable-functions.js +0 -181
  558. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-case-overoptimization.js +0 -35
  559. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-string-to-number.js +0 -46
  560. data/ext/v8/upstream/2.0.6/test/mjsunit/unicode-test.js +0 -9169
  561. data/ext/v8/upstream/2.0.6/test/mjsunit/unusual-constructor.js +0 -38
  562. data/ext/v8/upstream/2.0.6/test/mjsunit/uri.js +0 -78
  563. data/ext/v8/upstream/2.0.6/test/mjsunit/value-callic-prototype-change.js +0 -94
  564. data/ext/v8/upstream/2.0.6/test/mjsunit/var.js +0 -37
  565. data/ext/v8/upstream/2.0.6/test/mjsunit/with-function-expression.js +0 -36
  566. data/ext/v8/upstream/2.0.6/test/mjsunit/with-leave.js +0 -61
  567. data/ext/v8/upstream/2.0.6/test/mjsunit/with-parameter-access.js +0 -47
  568. data/ext/v8/upstream/2.0.6/test/mjsunit/with-prototype.js +0 -44
  569. data/ext/v8/upstream/2.0.6/test/mjsunit/with-value.js +0 -38
  570. data/ext/v8/upstream/2.0.6/test/mozilla/mozilla-shell-emulation.js +0 -37
  571. data/ext/v8/upstream/2.0.6/test/mozilla/mozilla.status +0 -815
  572. data/ext/v8/upstream/2.0.6/test/mozilla/testcfg.py +0 -138
  573. data/ext/v8/upstream/2.0.6/test/sputnik/README +0 -6
  574. data/ext/v8/upstream/2.0.6/test/sputnik/sputnik.status +0 -318
  575. data/ext/v8/upstream/2.0.6/test/sputnik/testcfg.py +0 -112
  576. data/ext/v8/upstream/2.0.6/tools/js2c.pyc +0 -0
  577. data/ext/v8/upstream/2.0.6/tools/jsmin.pyc +0 -0
  578. data/ext/v8/upstream/2.0.6/tools/utils.pyc +0 -0
  579. data/spec/redjs/README.txt +0 -8
@@ -1,80 +0,0 @@
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
- }
@@ -1,10 +0,0 @@
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;
@@ -1,80 +0,0 @@
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
- }
@@ -1,26 +0,0 @@
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
- }
@@ -1,1815 +0,0 @@
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
- }