therubyracer 0.4.8 → 0.4.9

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