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