therubyracer 0.8.1.pre2 → 0.8.1

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 (877) hide show
  1. data/Changelog.md +2 -1
  2. data/README.md +6 -3
  3. data/ext/v8/upstream/3.1.8/.gitignore +31 -0
  4. data/ext/v8/upstream/3.1.8/AUTHORS +40 -0
  5. data/ext/v8/upstream/3.1.8/ChangeLog +2566 -0
  6. data/ext/v8/upstream/3.1.8/LICENSE +52 -0
  7. data/ext/v8/upstream/3.1.8/LICENSE.strongtalk +29 -0
  8. data/ext/v8/upstream/3.1.8/LICENSE.v8 +26 -0
  9. data/ext/v8/upstream/3.1.8/LICENSE.valgrind +45 -0
  10. data/ext/v8/upstream/3.1.8/SConstruct +1192 -0
  11. data/ext/v8/upstream/3.1.8/build/README.txt +25 -0
  12. data/ext/v8/upstream/3.1.8/build/all.gyp +18 -0
  13. data/ext/v8/upstream/3.1.8/build/armu.gypi +32 -0
  14. data/ext/v8/upstream/3.1.8/build/common.gypi +82 -0
  15. data/ext/v8/upstream/3.1.8/build/gyp_v8 +145 -0
  16. data/ext/v8/upstream/3.1.8/include/v8-debug.h +384 -0
  17. data/ext/v8/upstream/3.1.8/include/v8-preparser.h +116 -0
  18. data/ext/v8/upstream/3.1.8/include/v8-profiler.h +426 -0
  19. data/ext/v8/upstream/3.1.8/include/v8-testing.h +99 -0
  20. data/ext/v8/upstream/3.1.8/include/v8.h +3846 -0
  21. data/ext/v8/upstream/3.1.8/include/v8stdint.h +53 -0
  22. data/ext/v8/upstream/3.1.8/preparser/preparser-process.cc +206 -0
  23. data/ext/v8/upstream/3.1.8/src/SConscript +356 -0
  24. data/ext/v8/upstream/3.1.8/src/accessors.cc +907 -0
  25. data/ext/v8/upstream/3.1.8/src/accessors.h +121 -0
  26. data/ext/v8/upstream/3.1.8/src/allocation.cc +204 -0
  27. data/ext/v8/upstream/3.1.8/src/allocation.h +176 -0
  28. data/ext/v8/upstream/3.1.8/src/api.cc +5191 -0
  29. data/ext/v8/upstream/3.1.8/src/api.h +508 -0
  30. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/apinatives.js +0 -0
  31. data/ext/v8/upstream/3.1.8/src/apiutils.h +80 -0
  32. data/ext/v8/upstream/3.1.8/src/arguments.h +105 -0
  33. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm-inl.h +352 -0
  34. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm.cc +2756 -0
  35. data/ext/v8/upstream/3.1.8/src/arm/assembler-arm.h +1294 -0
  36. data/ext/v8/upstream/3.1.8/src/arm/builtins-arm.cc +1628 -0
  37. data/ext/v8/upstream/3.1.8/src/arm/code-stubs-arm.cc +6783 -0
  38. data/ext/v8/upstream/3.1.8/src/arm/code-stubs-arm.h +657 -0
  39. data/ext/v8/upstream/3.1.8/src/arm/codegen-arm-inl.h +48 -0
  40. data/ext/v8/upstream/3.1.8/src/arm/codegen-arm.cc +7403 -0
  41. data/ext/v8/upstream/3.1.8/src/arm/codegen-arm.h +595 -0
  42. data/ext/v8/upstream/3.1.8/src/arm/constants-arm.cc +152 -0
  43. data/ext/v8/upstream/3.1.8/src/arm/constants-arm.h +769 -0
  44. data/ext/v8/upstream/3.1.8/src/arm/cpu-arm.cc +147 -0
  45. data/ext/v8/upstream/3.1.8/src/arm/debug-arm.cc +315 -0
  46. data/ext/v8/upstream/3.1.8/src/arm/deoptimizer-arm.cc +700 -0
  47. data/ext/v8/upstream/3.1.8/src/arm/disasm-arm.cc +1439 -0
  48. data/ext/v8/upstream/3.1.8/src/arm/frames-arm.cc +45 -0
  49. data/ext/v8/upstream/3.1.8/src/arm/frames-arm.h +168 -0
  50. data/ext/v8/upstream/3.1.8/src/arm/full-codegen-arm.cc +4230 -0
  51. data/ext/v8/upstream/3.1.8/src/arm/ic-arm.cc +1799 -0
  52. data/ext/v8/upstream/3.1.8/src/arm/jump-target-arm.cc +174 -0
  53. data/ext/v8/upstream/3.1.8/src/arm/lithium-arm.cc +2041 -0
  54. data/ext/v8/upstream/3.1.8/src/arm/lithium-arm.h +2046 -0
  55. data/ext/v8/upstream/3.1.8/src/arm/lithium-codegen-arm.cc +3822 -0
  56. data/ext/v8/upstream/3.1.8/src/arm/lithium-codegen-arm.h +312 -0
  57. data/ext/v8/upstream/3.1.8/src/arm/lithium-gap-resolver-arm.cc +303 -0
  58. data/ext/v8/upstream/3.1.8/src/arm/lithium-gap-resolver-arm.h +84 -0
  59. data/ext/v8/upstream/3.1.8/src/arm/macro-assembler-arm.cc +2701 -0
  60. data/ext/v8/upstream/3.1.8/src/arm/macro-assembler-arm.h +1015 -0
  61. data/ext/v8/upstream/3.1.8/src/arm/regexp-macro-assembler-arm.cc +1280 -0
  62. data/ext/v8/upstream/3.1.8/src/arm/regexp-macro-assembler-arm.h +252 -0
  63. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/arm/register-allocator-arm-inl.h +0 -0
  64. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/arm/register-allocator-arm.cc +0 -0
  65. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/arm/register-allocator-arm.h +0 -0
  66. data/ext/v8/upstream/3.1.8/src/arm/simulator-arm.cc +3165 -0
  67. data/ext/v8/upstream/3.1.8/src/arm/simulator-arm.h +402 -0
  68. data/ext/v8/upstream/3.1.8/src/arm/stub-cache-arm.cc +4077 -0
  69. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/arm/virtual-frame-arm-inl.h +0 -0
  70. data/ext/v8/upstream/3.1.8/src/arm/virtual-frame-arm.cc +843 -0
  71. data/ext/v8/upstream/3.1.8/src/arm/virtual-frame-arm.h +520 -0
  72. data/ext/v8/upstream/3.1.8/src/array.js +1231 -0
  73. data/ext/v8/upstream/3.1.8/src/assembler.cc +973 -0
  74. data/ext/v8/upstream/3.1.8/src/assembler.h +787 -0
  75. data/ext/v8/upstream/3.1.8/src/ast-inl.h +107 -0
  76. data/ext/v8/upstream/3.1.8/src/ast.cc +1067 -0
  77. data/ext/v8/upstream/3.1.8/src/ast.h +2177 -0
  78. data/ext/v8/upstream/3.1.8/src/atomicops.h +165 -0
  79. data/ext/v8/upstream/3.1.8/src/atomicops_internals_arm_gcc.h +145 -0
  80. data/ext/v8/upstream/3.1.8/src/atomicops_internals_x86_gcc.cc +126 -0
  81. data/ext/v8/upstream/3.1.8/src/atomicops_internals_x86_gcc.h +287 -0
  82. data/ext/v8/upstream/3.1.8/src/atomicops_internals_x86_macosx.h +301 -0
  83. data/ext/v8/upstream/3.1.8/src/atomicops_internals_x86_msvc.h +203 -0
  84. data/ext/v8/upstream/3.1.8/src/bignum-dtoa.cc +655 -0
  85. data/ext/v8/upstream/3.1.8/src/bignum-dtoa.h +81 -0
  86. data/ext/v8/upstream/3.1.8/src/bignum.cc +768 -0
  87. data/ext/v8/upstream/3.1.8/src/bignum.h +140 -0
  88. data/ext/v8/upstream/3.1.8/src/bootstrapper.cc +1888 -0
  89. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/bootstrapper.h +0 -0
  90. data/ext/v8/upstream/3.1.8/src/builtins.cc +1586 -0
  91. data/ext/v8/upstream/3.1.8/src/builtins.h +339 -0
  92. data/ext/v8/upstream/3.1.8/src/bytecodes-irregexp.h +105 -0
  93. data/ext/v8/upstream/3.1.8/src/cached-powers.cc +177 -0
  94. data/ext/v8/upstream/3.1.8/src/cached-powers.h +65 -0
  95. data/ext/v8/upstream/3.1.8/src/char-predicates-inl.h +94 -0
  96. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/char-predicates.h +0 -0
  97. data/ext/v8/upstream/3.1.8/src/checks.cc +110 -0
  98. data/ext/v8/upstream/3.1.8/src/checks.h +292 -0
  99. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/circular-queue-inl.h +0 -0
  100. data/ext/v8/upstream/3.1.8/src/circular-queue.cc +122 -0
  101. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/circular-queue.h +0 -0
  102. data/ext/v8/upstream/3.1.8/src/code-stubs.cc +230 -0
  103. data/ext/v8/upstream/3.1.8/src/code-stubs.h +950 -0
  104. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/code.h +0 -0
  105. data/ext/v8/upstream/3.1.8/src/codegen-inl.h +64 -0
  106. data/ext/v8/upstream/3.1.8/src/codegen.cc +495 -0
  107. data/ext/v8/upstream/3.1.8/src/codegen.h +245 -0
  108. data/ext/v8/upstream/3.1.8/src/compilation-cache.cc +654 -0
  109. data/ext/v8/upstream/3.1.8/src/compilation-cache.h +112 -0
  110. data/ext/v8/upstream/3.1.8/src/compiler.cc +806 -0
  111. data/ext/v8/upstream/3.1.8/src/compiler.h +290 -0
  112. data/ext/v8/upstream/3.1.8/src/contexts.cc +320 -0
  113. data/ext/v8/upstream/3.1.8/src/contexts.h +376 -0
  114. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/conversions-inl.h +0 -0
  115. data/ext/v8/upstream/3.1.8/src/conversions.cc +1069 -0
  116. data/ext/v8/upstream/3.1.8/src/conversions.h +122 -0
  117. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/counters.cc +0 -0
  118. data/ext/v8/upstream/3.1.8/src/counters.h +242 -0
  119. data/ext/v8/upstream/3.1.8/src/cpu-profiler-inl.h +100 -0
  120. data/ext/v8/upstream/3.1.8/src/cpu-profiler.cc +554 -0
  121. data/ext/v8/upstream/3.1.8/src/cpu-profiler.h +291 -0
  122. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/cpu.h +0 -0
  123. data/ext/v8/upstream/3.1.8/src/d8-debug.cc +367 -0
  124. data/ext/v8/upstream/3.1.8/src/d8-debug.h +157 -0
  125. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/d8-posix.cc +0 -0
  126. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/d8-readline.cc +0 -0
  127. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/d8-windows.cc +0 -0
  128. data/ext/v8/upstream/3.1.8/src/d8.cc +792 -0
  129. data/ext/v8/upstream/3.1.8/src/d8.gyp +85 -0
  130. data/ext/v8/upstream/3.1.8/src/d8.h +231 -0
  131. data/ext/v8/upstream/3.1.8/src/d8.js +2798 -0
  132. data/ext/v8/upstream/3.1.8/src/data-flow.cc +545 -0
  133. data/ext/v8/upstream/3.1.8/src/data-flow.h +379 -0
  134. data/ext/v8/upstream/3.1.8/src/date.js +1103 -0
  135. data/ext/v8/upstream/3.1.8/src/dateparser-inl.h +125 -0
  136. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/dateparser.cc +0 -0
  137. data/ext/v8/upstream/3.1.8/src/dateparser.h +263 -0
  138. data/ext/v8/upstream/3.1.8/src/debug-agent.cc +446 -0
  139. data/ext/v8/upstream/3.1.8/src/debug-agent.h +131 -0
  140. data/ext/v8/upstream/3.1.8/src/debug-debugger.js +2569 -0
  141. data/ext/v8/upstream/3.1.8/src/debug.cc +3085 -0
  142. data/ext/v8/upstream/3.1.8/src/debug.h +1025 -0
  143. data/ext/v8/upstream/3.1.8/src/deoptimizer.cc +1185 -0
  144. data/ext/v8/upstream/3.1.8/src/deoptimizer.h +529 -0
  145. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/disasm.h +0 -0
  146. data/ext/v8/upstream/3.1.8/src/disassembler.cc +338 -0
  147. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/disassembler.h +0 -0
  148. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/diy-fp.cc +0 -0
  149. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/diy-fp.h +0 -0
  150. data/ext/v8/upstream/3.1.8/src/double.h +238 -0
  151. data/ext/v8/upstream/3.1.8/src/dtoa.cc +103 -0
  152. data/ext/v8/upstream/3.1.8/src/dtoa.h +85 -0
  153. data/ext/v8/upstream/3.1.8/src/execution.cc +735 -0
  154. data/ext/v8/upstream/3.1.8/src/execution.h +322 -0
  155. data/ext/v8/upstream/3.1.8/src/extensions/experimental/experimental.gyp +53 -0
  156. data/ext/v8/upstream/3.1.8/src/extensions/experimental/i18n-extension.cc +264 -0
  157. data/ext/v8/upstream/3.1.8/src/extensions/experimental/i18n-extension.h +64 -0
  158. data/ext/v8/upstream/3.1.8/src/extensions/externalize-string-extension.cc +141 -0
  159. data/ext/v8/upstream/3.1.8/src/extensions/externalize-string-extension.h +50 -0
  160. data/ext/v8/upstream/3.1.8/src/extensions/gc-extension.cc +58 -0
  161. data/ext/v8/upstream/3.1.8/src/extensions/gc-extension.h +49 -0
  162. data/ext/v8/upstream/3.1.8/src/factory.cc +1087 -0
  163. data/ext/v8/upstream/3.1.8/src/factory.h +432 -0
  164. data/ext/v8/upstream/3.1.8/src/fast-dtoa.cc +736 -0
  165. data/ext/v8/upstream/3.1.8/src/fast-dtoa.h +83 -0
  166. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/fixed-dtoa.cc +0 -0
  167. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/fixed-dtoa.h +0 -0
  168. data/ext/v8/upstream/3.1.8/src/flag-definitions.h +552 -0
  169. data/ext/v8/upstream/3.1.8/src/flags.cc +551 -0
  170. data/ext/v8/upstream/3.1.8/src/flags.h +79 -0
  171. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/frame-element.cc +0 -0
  172. data/ext/v8/upstream/3.1.8/src/frame-element.h +277 -0
  173. data/ext/v8/upstream/3.1.8/src/frames-inl.h +210 -0
  174. data/ext/v8/upstream/3.1.8/src/frames.cc +1232 -0
  175. data/ext/v8/upstream/3.1.8/src/frames.h +826 -0
  176. data/ext/v8/upstream/3.1.8/src/full-codegen.cc +1382 -0
  177. data/ext/v8/upstream/3.1.8/src/full-codegen.h +751 -0
  178. data/ext/v8/upstream/3.1.8/src/func-name-inferrer.cc +90 -0
  179. data/ext/v8/upstream/3.1.8/src/func-name-inferrer.h +111 -0
  180. data/ext/v8/upstream/3.1.8/src/gdb-jit.cc +1547 -0
  181. data/ext/v8/upstream/3.1.8/src/gdb-jit.h +138 -0
  182. data/ext/v8/upstream/3.1.8/src/global-handles.cc +534 -0
  183. data/ext/v8/upstream/3.1.8/src/global-handles.h +181 -0
  184. data/ext/v8/upstream/3.1.8/src/globals.h +325 -0
  185. data/ext/v8/upstream/3.1.8/src/handles-inl.h +80 -0
  186. data/ext/v8/upstream/3.1.8/src/handles.cc +910 -0
  187. data/ext/v8/upstream/3.1.8/src/handles.h +424 -0
  188. data/ext/v8/upstream/3.1.8/src/hashmap.cc +230 -0
  189. data/ext/v8/upstream/3.1.8/src/hashmap.h +121 -0
  190. data/ext/v8/upstream/3.1.8/src/heap-inl.h +587 -0
  191. data/ext/v8/upstream/3.1.8/src/heap-profiler.cc +1128 -0
  192. data/ext/v8/upstream/3.1.8/src/heap-profiler.h +381 -0
  193. data/ext/v8/upstream/3.1.8/src/heap.cc +5610 -0
  194. data/ext/v8/upstream/3.1.8/src/heap.h +2218 -0
  195. data/ext/v8/upstream/3.1.8/src/hydrogen-instructions.cc +1490 -0
  196. data/ext/v8/upstream/3.1.8/src/hydrogen-instructions.h +3493 -0
  197. data/ext/v8/upstream/3.1.8/src/hydrogen.cc +6056 -0
  198. data/ext/v8/upstream/3.1.8/src/hydrogen.h +1091 -0
  199. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32-inl.h +429 -0
  200. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32.cc +2800 -0
  201. data/ext/v8/upstream/3.1.8/src/ia32/assembler-ia32.h +1093 -0
  202. data/ext/v8/upstream/3.1.8/src/ia32/builtins-ia32.cc +1590 -0
  203. data/ext/v8/upstream/3.1.8/src/ia32/code-stubs-ia32.cc +6624 -0
  204. data/ext/v8/upstream/3.1.8/src/ia32/code-stubs-ia32.h +536 -0
  205. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/codegen-ia32-inl.h +0 -0
  206. data/ext/v8/upstream/3.1.8/src/ia32/codegen-ia32.cc +10354 -0
  207. data/ext/v8/upstream/3.1.8/src/ia32/codegen-ia32.h +798 -0
  208. data/ext/v8/upstream/3.1.8/src/ia32/cpu-ia32.cc +87 -0
  209. data/ext/v8/upstream/3.1.8/src/ia32/debug-ia32.cc +309 -0
  210. data/ext/v8/upstream/3.1.8/src/ia32/deoptimizer-ia32.cc +664 -0
  211. data/ext/v8/upstream/3.1.8/src/ia32/disasm-ia32.cc +1597 -0
  212. data/ext/v8/upstream/3.1.8/src/ia32/frames-ia32.cc +45 -0
  213. data/ext/v8/upstream/3.1.8/src/ia32/frames-ia32.h +140 -0
  214. data/ext/v8/upstream/3.1.8/src/ia32/full-codegen-ia32.cc +4278 -0
  215. data/ext/v8/upstream/3.1.8/src/ia32/ic-ia32.cc +1786 -0
  216. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/jump-target-ia32.cc +0 -0
  217. data/ext/v8/upstream/3.1.8/src/ia32/lithium-codegen-ia32.cc +3880 -0
  218. data/ext/v8/upstream/3.1.8/src/ia32/lithium-codegen-ia32.h +309 -0
  219. data/ext/v8/upstream/3.1.8/src/ia32/lithium-gap-resolver-ia32.cc +460 -0
  220. data/ext/v8/upstream/3.1.8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
  221. data/ext/v8/upstream/3.1.8/src/ia32/lithium-ia32.cc +2095 -0
  222. data/ext/v8/upstream/3.1.8/src/ia32/lithium-ia32.h +2127 -0
  223. data/ext/v8/upstream/3.1.8/src/ia32/macro-assembler-ia32.cc +2031 -0
  224. data/ext/v8/upstream/3.1.8/src/ia32/macro-assembler-ia32.h +798 -0
  225. data/ext/v8/upstream/3.1.8/src/ia32/regexp-macro-assembler-ia32.cc +1253 -0
  226. data/ext/v8/upstream/3.1.8/src/ia32/regexp-macro-assembler-ia32.h +215 -0
  227. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/register-allocator-ia32-inl.h +0 -0
  228. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/register-allocator-ia32.cc +0 -0
  229. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/register-allocator-ia32.h +0 -0
  230. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/ia32/simulator-ia32.cc +0 -0
  231. data/ext/v8/upstream/3.1.8/src/ia32/simulator-ia32.h +72 -0
  232. data/ext/v8/upstream/3.1.8/src/ia32/stub-cache-ia32.cc +3732 -0
  233. data/ext/v8/upstream/3.1.8/src/ia32/virtual-frame-ia32.cc +1360 -0
  234. data/ext/v8/upstream/3.1.8/src/ia32/virtual-frame-ia32.h +646 -0
  235. data/ext/v8/upstream/3.1.8/src/ic-inl.h +129 -0
  236. data/ext/v8/upstream/3.1.8/src/ic.cc +2333 -0
  237. data/ext/v8/upstream/3.1.8/src/ic.h +639 -0
  238. data/ext/v8/upstream/3.1.8/src/inspector.cc +63 -0
  239. data/ext/v8/upstream/3.1.8/src/inspector.h +62 -0
  240. data/ext/v8/upstream/3.1.8/src/interpreter-irregexp.cc +655 -0
  241. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/interpreter-irregexp.h +0 -0
  242. data/ext/v8/upstream/3.1.8/src/json.js +342 -0
  243. data/ext/v8/upstream/3.1.8/src/jsregexp.cc +5340 -0
  244. data/ext/v8/upstream/3.1.8/src/jsregexp.h +1484 -0
  245. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/jump-target-heavy-inl.h +0 -0
  246. data/ext/v8/upstream/3.1.8/src/jump-target-heavy.cc +430 -0
  247. data/ext/v8/upstream/3.1.8/src/jump-target-heavy.h +244 -0
  248. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/jump-target-inl.h +0 -0
  249. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/jump-target-light-inl.h +0 -0
  250. data/ext/v8/upstream/3.1.8/src/jump-target-light.cc +111 -0
  251. data/ext/v8/upstream/3.1.8/src/jump-target-light.h +193 -0
  252. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/jump-target.cc +0 -0
  253. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/jump-target.h +0 -0
  254. data/ext/v8/upstream/3.1.8/src/list-inl.h +206 -0
  255. data/ext/v8/upstream/3.1.8/src/list.h +164 -0
  256. data/ext/v8/upstream/3.1.8/src/lithium-allocator-inl.h +140 -0
  257. data/ext/v8/upstream/3.1.8/src/lithium-allocator.cc +2093 -0
  258. data/ext/v8/upstream/3.1.8/src/lithium-allocator.h +644 -0
  259. data/ext/v8/upstream/3.1.8/src/lithium.cc +168 -0
  260. data/ext/v8/upstream/3.1.8/src/lithium.h +592 -0
  261. data/ext/v8/upstream/3.1.8/src/liveedit-debugger.js +1082 -0
  262. data/ext/v8/upstream/3.1.8/src/liveedit.cc +1650 -0
  263. data/ext/v8/upstream/3.1.8/src/liveedit.h +174 -0
  264. data/ext/v8/upstream/3.1.8/src/liveobjectlist-inl.h +126 -0
  265. data/ext/v8/upstream/3.1.8/src/liveobjectlist.cc +2527 -0
  266. data/ext/v8/upstream/3.1.8/src/liveobjectlist.h +322 -0
  267. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/log-inl.h +0 -0
  268. data/ext/v8/upstream/3.1.8/src/log-utils.cc +336 -0
  269. data/ext/v8/upstream/3.1.8/src/log-utils.h +232 -0
  270. data/ext/v8/upstream/3.1.8/src/log.cc +1608 -0
  271. data/ext/v8/upstream/3.1.8/src/log.h +379 -0
  272. data/ext/v8/upstream/3.1.8/src/macro-assembler.h +120 -0
  273. data/ext/v8/upstream/3.1.8/src/macros.py +178 -0
  274. data/ext/v8/upstream/3.1.8/src/mark-compact.cc +2957 -0
  275. data/ext/v8/upstream/3.1.8/src/mark-compact.h +433 -0
  276. data/ext/v8/upstream/3.1.8/src/math.js +264 -0
  277. data/ext/v8/upstream/3.1.8/src/memory.h +82 -0
  278. data/ext/v8/upstream/3.1.8/src/messages.cc +164 -0
  279. data/ext/v8/upstream/3.1.8/src/messages.h +114 -0
  280. data/ext/v8/upstream/3.1.8/src/messages.js +1071 -0
  281. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/assembler-mips-inl.h +0 -0
  282. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/assembler-mips.cc +0 -0
  283. data/ext/v8/upstream/3.1.8/src/mips/assembler-mips.h +667 -0
  284. data/ext/v8/upstream/3.1.8/src/mips/builtins-mips.cc +205 -0
  285. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/codegen-mips-inl.h +0 -0
  286. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/codegen-mips.cc +0 -0
  287. data/ext/v8/upstream/3.1.8/src/mips/codegen-mips.h +431 -0
  288. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/constants-mips.cc +0 -0
  289. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/constants-mips.h +0 -0
  290. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/cpu-mips.cc +0 -0
  291. data/ext/v8/upstream/3.1.8/src/mips/debug-mips.cc +127 -0
  292. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/disasm-mips.cc +0 -0
  293. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/fast-codegen-mips.cc +0 -0
  294. data/ext/v8/upstream/3.1.8/src/mips/frames-mips.cc +96 -0
  295. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/frames-mips.h +0 -0
  296. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/full-codegen-mips.cc +0 -0
  297. data/ext/v8/upstream/3.1.8/src/mips/ic-mips.cc +208 -0
  298. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/jump-target-mips.cc +0 -0
  299. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/macro-assembler-mips.cc +0 -0
  300. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/macro-assembler-mips.h +0 -0
  301. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/register-allocator-mips-inl.h +0 -0
  302. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/register-allocator-mips.cc +0 -0
  303. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/register-allocator-mips.h +0 -0
  304. data/ext/v8/upstream/3.1.8/src/mips/simulator-mips.cc +1650 -0
  305. data/ext/v8/upstream/3.1.8/src/mips/simulator-mips.h +311 -0
  306. data/ext/v8/upstream/3.1.8/src/mips/stub-cache-mips.cc +418 -0
  307. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/virtual-frame-mips.cc +0 -0
  308. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mips/virtual-frame-mips.h +0 -0
  309. data/ext/v8/upstream/3.1.8/src/mirror-debugger.js +2380 -0
  310. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/mksnapshot.cc +0 -0
  311. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/natives.h +0 -0
  312. data/ext/v8/upstream/3.1.8/src/objects-debug.cc +722 -0
  313. data/ext/v8/upstream/3.1.8/src/objects-inl.h +3946 -0
  314. data/ext/v8/upstream/3.1.8/src/objects-printer.cc +801 -0
  315. data/ext/v8/upstream/3.1.8/src/objects-visiting.cc +142 -0
  316. data/ext/v8/upstream/3.1.8/src/objects-visiting.h +401 -0
  317. data/ext/v8/upstream/3.1.8/src/objects.cc +10044 -0
  318. data/ext/v8/upstream/3.1.8/src/objects.h +6571 -0
  319. data/ext/v8/upstream/3.1.8/src/parser.cc +5165 -0
  320. data/ext/v8/upstream/3.1.8/src/parser.h +802 -0
  321. data/ext/v8/upstream/3.1.8/src/platform-cygwin.cc +745 -0
  322. data/ext/v8/upstream/3.1.8/src/platform-freebsd.cc +702 -0
  323. data/ext/v8/upstream/3.1.8/src/platform-linux.cc +981 -0
  324. data/ext/v8/upstream/3.1.8/src/platform-macos.cc +732 -0
  325. data/ext/v8/upstream/3.1.8/src/platform-nullos.cc +498 -0
  326. data/ext/v8/upstream/3.1.8/src/platform-openbsd.cc +657 -0
  327. data/ext/v8/upstream/3.1.8/src/platform-posix.cc +399 -0
  328. data/ext/v8/upstream/3.1.8/src/platform-solaris.cc +714 -0
  329. data/ext/v8/upstream/3.1.8/src/platform-win32.cc +1974 -0
  330. data/ext/v8/upstream/3.1.8/src/platform.h +636 -0
  331. data/ext/v8/upstream/3.1.8/src/preparse-data.cc +183 -0
  332. data/ext/v8/upstream/3.1.8/src/preparse-data.h +249 -0
  333. data/ext/v8/upstream/3.1.8/src/preparser-api.cc +213 -0
  334. data/ext/v8/upstream/3.1.8/src/preparser.cc +1205 -0
  335. data/ext/v8/upstream/3.1.8/src/preparser.h +278 -0
  336. data/ext/v8/upstream/3.1.8/src/prettyprinter.cc +1539 -0
  337. data/ext/v8/upstream/3.1.8/src/prettyprinter.h +223 -0
  338. data/ext/v8/upstream/3.1.8/src/profile-generator-inl.h +128 -0
  339. data/ext/v8/upstream/3.1.8/src/profile-generator.cc +2899 -0
  340. data/ext/v8/upstream/3.1.8/src/profile-generator.h +1151 -0
  341. data/ext/v8/upstream/3.1.8/src/property.cc +96 -0
  342. data/ext/v8/upstream/3.1.8/src/property.h +337 -0
  343. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/regexp-macro-assembler-irregexp-inl.h +0 -0
  344. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler-irregexp.cc +470 -0
  345. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler-irregexp.h +142 -0
  346. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler-tracer.cc +373 -0
  347. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler-tracer.h +104 -0
  348. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler.cc +257 -0
  349. data/ext/v8/upstream/3.1.8/src/regexp-macro-assembler.h +231 -0
  350. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/regexp-stack.cc +0 -0
  351. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/regexp-stack.h +0 -0
  352. data/ext/v8/upstream/3.1.8/src/regexp.js +483 -0
  353. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/register-allocator-inl.h +0 -0
  354. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/register-allocator.cc +0 -0
  355. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/register-allocator.h +0 -0
  356. data/ext/v8/upstream/3.1.8/src/rewriter.cc +1023 -0
  357. data/ext/v8/upstream/3.1.8/src/rewriter.h +59 -0
  358. data/ext/v8/upstream/3.1.8/src/runtime-profiler.cc +443 -0
  359. data/ext/v8/upstream/3.1.8/src/runtime-profiler.h +77 -0
  360. data/ext/v8/upstream/3.1.8/src/runtime.cc +11592 -0
  361. data/ext/v8/upstream/3.1.8/src/runtime.h +582 -0
  362. data/ext/v8/upstream/3.1.8/src/runtime.js +643 -0
  363. data/ext/v8/upstream/3.1.8/src/safepoint-table.cc +253 -0
  364. data/ext/v8/upstream/3.1.8/src/safepoint-table.h +263 -0
  365. data/ext/v8/upstream/3.1.8/src/scanner-base.cc +971 -0
  366. data/ext/v8/upstream/3.1.8/src/scanner-base.h +653 -0
  367. data/ext/v8/upstream/3.1.8/src/scanner.cc +586 -0
  368. data/ext/v8/upstream/3.1.8/src/scanner.h +194 -0
  369. data/ext/v8/upstream/3.1.8/src/scopeinfo.cc +636 -0
  370. data/ext/v8/upstream/3.1.8/src/scopeinfo.h +238 -0
  371. data/ext/v8/upstream/3.1.8/src/scopes.cc +1063 -0
  372. data/ext/v8/upstream/3.1.8/src/scopes.h +494 -0
  373. data/ext/v8/upstream/3.1.8/src/serialize.cc +1535 -0
  374. data/ext/v8/upstream/3.1.8/src/serialize.h +584 -0
  375. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/shell.h +0 -0
  376. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/simulator.h +0 -0
  377. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/smart-pointer.h +0 -0
  378. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/snapshot-common.cc +0 -0
  379. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/snapshot-empty.cc +0 -0
  380. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/snapshot.h +0 -0
  381. data/ext/v8/upstream/3.1.8/src/spaces-inl.h +524 -0
  382. data/ext/v8/upstream/3.1.8/src/spaces.cc +3254 -0
  383. data/ext/v8/upstream/3.1.8/src/spaces.h +2362 -0
  384. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/splay-tree-inl.h +0 -0
  385. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/splay-tree.h +0 -0
  386. data/ext/v8/upstream/3.1.8/src/string-search.cc +40 -0
  387. data/ext/v8/upstream/3.1.8/src/string-search.h +567 -0
  388. data/ext/v8/upstream/3.1.8/src/string-stream.cc +584 -0
  389. data/ext/v8/upstream/3.1.8/src/string-stream.h +191 -0
  390. data/ext/v8/upstream/3.1.8/src/string.js +915 -0
  391. data/ext/v8/upstream/3.1.8/src/strtod.cc +440 -0
  392. data/ext/v8/upstream/3.1.8/src/strtod.h +40 -0
  393. data/ext/v8/upstream/3.1.8/src/stub-cache.cc +1878 -0
  394. data/ext/v8/upstream/3.1.8/src/stub-cache.h +849 -0
  395. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/third_party/valgrind/valgrind.h +0 -0
  396. data/ext/v8/upstream/3.1.8/src/token.cc +63 -0
  397. data/ext/v8/upstream/3.1.8/src/token.h +288 -0
  398. data/ext/v8/upstream/3.1.8/src/top.cc +1152 -0
  399. data/ext/v8/upstream/3.1.8/src/top.h +608 -0
  400. data/ext/v8/upstream/3.1.8/src/type-info.cc +406 -0
  401. data/ext/v8/upstream/3.1.8/src/type-info.h +283 -0
  402. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/unbound-queue-inl.h +0 -0
  403. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/unbound-queue.h +0 -0
  404. data/ext/v8/upstream/3.1.8/src/unicode-inl.h +238 -0
  405. data/ext/v8/upstream/3.1.8/src/unicode.cc +1624 -0
  406. data/ext/v8/upstream/3.1.8/src/unicode.h +280 -0
  407. data/ext/v8/upstream/3.1.8/src/uri.js +402 -0
  408. data/ext/v8/upstream/3.1.8/src/utils.cc +371 -0
  409. data/ext/v8/upstream/3.1.8/src/utils.h +793 -0
  410. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/v8-counters.cc +0 -0
  411. data/ext/v8/upstream/3.1.8/src/v8-counters.h +290 -0
  412. data/ext/v8/upstream/3.1.8/src/v8.cc +270 -0
  413. data/ext/v8/upstream/3.1.8/src/v8.h +127 -0
  414. data/ext/v8/upstream/3.1.8/src/v8checks.h +64 -0
  415. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/v8dll-main.cc +0 -0
  416. data/ext/v8/upstream/3.1.8/src/v8globals.h +480 -0
  417. data/ext/v8/upstream/3.1.8/src/v8natives.js +1252 -0
  418. data/ext/v8/upstream/3.1.8/src/v8preparserdll-main.cc +39 -0
  419. data/ext/v8/upstream/3.1.8/src/v8threads.cc +440 -0
  420. data/ext/v8/upstream/3.1.8/src/v8threads.h +157 -0
  421. data/ext/v8/upstream/3.1.8/src/v8utils.h +354 -0
  422. data/ext/v8/upstream/3.1.8/src/variables.cc +132 -0
  423. data/ext/v8/upstream/3.1.8/src/variables.h +212 -0
  424. data/ext/v8/upstream/3.1.8/src/version.cc +95 -0
  425. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/version.h +0 -0
  426. data/ext/v8/upstream/3.1.8/src/virtual-frame-heavy-inl.h +190 -0
  427. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/virtual-frame-heavy.cc +0 -0
  428. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/virtual-frame-inl.h +0 -0
  429. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/virtual-frame-light-inl.h +0 -0
  430. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/virtual-frame-light.cc +0 -0
  431. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/virtual-frame.cc +0 -0
  432. data/ext/v8/upstream/3.1.8/src/virtual-frame.h +59 -0
  433. data/ext/v8/upstream/3.1.8/src/vm-state-inl.h +134 -0
  434. data/ext/v8/upstream/3.1.8/src/vm-state.h +68 -0
  435. data/ext/v8/upstream/3.1.8/src/win32-headers.h +95 -0
  436. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64-inl.h +455 -0
  437. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64.cc +3162 -0
  438. data/ext/v8/upstream/3.1.8/src/x64/assembler-x64.h +1584 -0
  439. data/ext/v8/upstream/3.1.8/src/x64/builtins-x64.cc +1492 -0
  440. data/ext/v8/upstream/3.1.8/src/x64/code-stubs-x64.cc +5150 -0
  441. data/ext/v8/upstream/3.1.8/src/x64/code-stubs-x64.h +519 -0
  442. data/ext/v8/upstream/3.1.8/src/x64/codegen-x64-inl.h +46 -0
  443. data/ext/v8/upstream/3.1.8/src/x64/codegen-x64.cc +8835 -0
  444. data/ext/v8/upstream/3.1.8/src/x64/codegen-x64.h +750 -0
  445. data/ext/v8/upstream/3.1.8/src/x64/cpu-x64.cc +86 -0
  446. data/ext/v8/upstream/3.1.8/src/x64/debug-x64.cc +316 -0
  447. data/ext/v8/upstream/3.1.8/src/x64/deoptimizer-x64.cc +781 -0
  448. data/ext/v8/upstream/3.1.8/src/x64/disasm-x64.cc +1737 -0
  449. data/ext/v8/upstream/3.1.8/src/x64/frames-x64.cc +45 -0
  450. data/ext/v8/upstream/3.1.8/src/x64/frames-x64.h +130 -0
  451. data/ext/v8/upstream/3.1.8/src/x64/full-codegen-x64.cc +3984 -0
  452. data/ext/v8/upstream/3.1.8/src/x64/ic-x64.cc +1761 -0
  453. data/ext/v8/upstream/3.1.8/src/x64/jump-target-x64.cc +437 -0
  454. data/ext/v8/upstream/3.1.8/src/x64/lithium-codegen-x64.cc +3639 -0
  455. data/ext/v8/upstream/3.1.8/src/x64/lithium-codegen-x64.h +305 -0
  456. data/ext/v8/upstream/3.1.8/src/x64/lithium-gap-resolver-x64.cc +320 -0
  457. data/ext/v8/upstream/3.1.8/src/x64/lithium-gap-resolver-x64.h +74 -0
  458. data/ext/v8/upstream/3.1.8/src/x64/lithium-x64.cc +2044 -0
  459. data/ext/v8/upstream/3.1.8/src/x64/lithium-x64.h +2052 -0
  460. data/ext/v8/upstream/3.1.8/src/x64/macro-assembler-x64.cc +2660 -0
  461. data/ext/v8/upstream/3.1.8/src/x64/macro-assembler-x64.h +1852 -0
  462. data/ext/v8/upstream/3.1.8/src/x64/regexp-macro-assembler-x64.cc +1382 -0
  463. data/ext/v8/upstream/3.1.8/src/x64/regexp-macro-assembler-x64.h +278 -0
  464. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/x64/register-allocator-x64-inl.h +0 -0
  465. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/x64/register-allocator-x64.cc +0 -0
  466. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/x64/register-allocator-x64.h +0 -0
  467. data/ext/v8/upstream/{2.3.3 → 3.1.8}/src/x64/simulator-x64.cc +0 -0
  468. data/ext/v8/upstream/3.1.8/src/x64/simulator-x64.h +71 -0
  469. data/ext/v8/upstream/3.1.8/src/x64/stub-cache-x64.cc +3509 -0
  470. data/ext/v8/upstream/3.1.8/src/x64/virtual-frame-x64.cc +1292 -0
  471. data/ext/v8/upstream/3.1.8/src/x64/virtual-frame-x64.h +593 -0
  472. data/ext/v8/upstream/3.1.8/src/zone-inl.h +83 -0
  473. data/ext/v8/upstream/3.1.8/src/zone.cc +195 -0
  474. data/ext/v8/upstream/3.1.8/src/zone.h +233 -0
  475. data/ext/v8/upstream/3.1.8/tools/codemap.js +265 -0
  476. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/consarray.js +0 -0
  477. data/ext/v8/upstream/3.1.8/tools/csvparser.js +78 -0
  478. data/ext/v8/upstream/3.1.8/tools/disasm.py +92 -0
  479. data/ext/v8/upstream/3.1.8/tools/gc-nvp-trace-processor.py +328 -0
  480. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/generate-ten-powers.scm +0 -0
  481. data/ext/v8/upstream/3.1.8/tools/grokdump.py +840 -0
  482. data/ext/v8/upstream/3.1.8/tools/gyp/v8.gyp +869 -0
  483. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/js2c.py +0 -0
  484. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/jsmin.py +0 -0
  485. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/linux-tick-processor +0 -0
  486. data/ext/v8/upstream/3.1.8/tools/ll_prof.py +919 -0
  487. data/ext/v8/upstream/3.1.8/tools/logreader.js +185 -0
  488. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/mac-nm +0 -0
  489. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/mac-tick-processor +0 -0
  490. data/ext/v8/upstream/3.1.8/tools/oom_dump/README +31 -0
  491. data/ext/v8/upstream/3.1.8/tools/oom_dump/SConstruct +42 -0
  492. data/ext/v8/upstream/3.1.8/tools/oom_dump/oom_dump.cc +288 -0
  493. data/ext/v8/upstream/3.1.8/tools/presubmit.py +305 -0
  494. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/process-heap-prof.py +0 -0
  495. data/ext/v8/upstream/3.1.8/tools/profile.js +751 -0
  496. data/ext/v8/upstream/3.1.8/tools/profile_view.js +219 -0
  497. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/run-valgrind.py +0 -0
  498. data/ext/v8/upstream/3.1.8/tools/splaytree.js +316 -0
  499. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/stats-viewer.py +0 -0
  500. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/tickprocessor-driver.js +0 -0
  501. data/ext/v8/upstream/3.1.8/tools/tickprocessor.js +863 -0
  502. data/ext/v8/upstream/3.1.8/tools/utils.py +96 -0
  503. data/ext/v8/upstream/3.1.8/tools/visual_studio/README.txt +70 -0
  504. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/arm.vsprops +0 -0
  505. data/ext/v8/upstream/3.1.8/tools/visual_studio/common.vsprops +34 -0
  506. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/d8.vcproj +0 -0
  507. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/d8_arm.vcproj +0 -0
  508. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/d8_x64.vcproj +0 -0
  509. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/d8js2c.cmd +0 -0
  510. data/ext/v8/upstream/3.1.8/tools/visual_studio/debug.vsprops +17 -0
  511. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/ia32.vsprops +0 -0
  512. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/js2c.cmd +0 -0
  513. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/release.vsprops +0 -0
  514. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8.sln +0 -0
  515. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8.vcproj +0 -0
  516. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_arm.sln +0 -0
  517. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_arm.vcproj +0 -0
  518. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base.vcproj +1296 -0
  519. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base_arm.vcproj +1234 -0
  520. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_base_x64.vcproj +1296 -0
  521. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_cctest.vcproj +0 -0
  522. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_cctest_arm.vcproj +0 -0
  523. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_cctest_x64.vcproj +0 -0
  524. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_mksnapshot.vcproj +0 -0
  525. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_mksnapshot_x64.vcproj +0 -0
  526. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_process_sample.vcproj +0 -0
  527. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_process_sample_arm.vcproj +0 -0
  528. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_process_sample_x64.vcproj +0 -0
  529. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_shell_sample.vcproj +147 -0
  530. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_shell_sample_arm.vcproj +147 -0
  531. data/ext/v8/upstream/3.1.8/tools/visual_studio/v8_shell_sample_x64.vcproj +163 -0
  532. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_snapshot.vcproj +0 -0
  533. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_snapshot_cc.vcproj +0 -0
  534. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_snapshot_cc_x64.vcproj +0 -0
  535. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_snapshot_x64.vcproj +0 -0
  536. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_x64.sln +0 -0
  537. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/v8_x64.vcproj +0 -0
  538. data/ext/v8/upstream/{2.3.3 → 3.1.8}/tools/visual_studio/x64.vsprops +0 -0
  539. data/ext/v8/upstream/3.1.8/tools/windows-tick-processor.bat +30 -0
  540. data/ext/v8/upstream/Makefile +2 -1
  541. data/ext/v8/v8_template.cpp +2 -2
  542. data/lib/v8/version.rb +1 -1
  543. data/spec/redjs/jsapi_spec.rb +2 -2
  544. metadata +552 -490
  545. data/ext/v8/upstream/2.3.3/.gitignore +0 -26
  546. data/ext/v8/upstream/2.3.3/AUTHORS +0 -31
  547. data/ext/v8/upstream/2.3.3/ChangeLog +0 -1916
  548. data/ext/v8/upstream/2.3.3/LICENSE +0 -55
  549. data/ext/v8/upstream/2.3.3/SConstruct +0 -1154
  550. data/ext/v8/upstream/2.3.3/include/v8-debug.h +0 -381
  551. data/ext/v8/upstream/2.3.3/include/v8-profiler.h +0 -353
  552. data/ext/v8/upstream/2.3.3/include/v8.h +0 -3616
  553. data/ext/v8/upstream/2.3.3/src/SConscript +0 -330
  554. data/ext/v8/upstream/2.3.3/src/accessors.cc +0 -661
  555. data/ext/v8/upstream/2.3.3/src/accessors.h +0 -114
  556. data/ext/v8/upstream/2.3.3/src/allocation.cc +0 -198
  557. data/ext/v8/upstream/2.3.3/src/allocation.h +0 -169
  558. data/ext/v8/upstream/2.3.3/src/api.cc +0 -4795
  559. data/ext/v8/upstream/2.3.3/src/api.h +0 -485
  560. data/ext/v8/upstream/2.3.3/src/apiutils.h +0 -69
  561. data/ext/v8/upstream/2.3.3/src/arguments.h +0 -96
  562. data/ext/v8/upstream/2.3.3/src/arm/assembler-arm-inl.h +0 -305
  563. data/ext/v8/upstream/2.3.3/src/arm/assembler-arm.cc +0 -2580
  564. data/ext/v8/upstream/2.3.3/src/arm/assembler-arm.h +0 -1275
  565. data/ext/v8/upstream/2.3.3/src/arm/builtins-arm.cc +0 -1320
  566. data/ext/v8/upstream/2.3.3/src/arm/codegen-arm-inl.h +0 -48
  567. data/ext/v8/upstream/2.3.3/src/arm/codegen-arm.cc +0 -11398
  568. data/ext/v8/upstream/2.3.3/src/arm/codegen-arm.h +0 -1102
  569. data/ext/v8/upstream/2.3.3/src/arm/constants-arm.cc +0 -154
  570. data/ext/v8/upstream/2.3.3/src/arm/constants-arm.h +0 -388
  571. data/ext/v8/upstream/2.3.3/src/arm/cpu-arm.cc +0 -142
  572. data/ext/v8/upstream/2.3.3/src/arm/debug-arm.cc +0 -309
  573. data/ext/v8/upstream/2.3.3/src/arm/disasm-arm.cc +0 -1459
  574. data/ext/v8/upstream/2.3.3/src/arm/fast-codegen-arm.cc +0 -241
  575. data/ext/v8/upstream/2.3.3/src/arm/frames-arm.cc +0 -123
  576. data/ext/v8/upstream/2.3.3/src/arm/frames-arm.h +0 -162
  577. data/ext/v8/upstream/2.3.3/src/arm/full-codegen-arm.cc +0 -3178
  578. data/ext/v8/upstream/2.3.3/src/arm/ic-arm.cc +0 -2258
  579. data/ext/v8/upstream/2.3.3/src/arm/jump-target-arm.cc +0 -164
  580. data/ext/v8/upstream/2.3.3/src/arm/macro-assembler-arm.cc +0 -1892
  581. data/ext/v8/upstream/2.3.3/src/arm/macro-assembler-arm.h +0 -727
  582. data/ext/v8/upstream/2.3.3/src/arm/regexp-macro-assembler-arm.cc +0 -1261
  583. data/ext/v8/upstream/2.3.3/src/arm/regexp-macro-assembler-arm.h +0 -266
  584. data/ext/v8/upstream/2.3.3/src/arm/simulator-arm.cc +0 -2822
  585. data/ext/v8/upstream/2.3.3/src/arm/simulator-arm.h +0 -361
  586. data/ext/v8/upstream/2.3.3/src/arm/stub-cache-arm.cc +0 -2387
  587. data/ext/v8/upstream/2.3.3/src/arm/virtual-frame-arm.cc +0 -834
  588. data/ext/v8/upstream/2.3.3/src/arm/virtual-frame-arm.h +0 -519
  589. data/ext/v8/upstream/2.3.3/src/array.js +0 -1127
  590. data/ext/v8/upstream/2.3.3/src/assembler.cc +0 -801
  591. data/ext/v8/upstream/2.3.3/src/assembler.h +0 -573
  592. data/ext/v8/upstream/2.3.3/src/ast-inl.h +0 -81
  593. data/ext/v8/upstream/2.3.3/src/ast.cc +0 -1152
  594. data/ext/v8/upstream/2.3.3/src/ast.h +0 -2106
  595. data/ext/v8/upstream/2.3.3/src/bootstrapper.cc +0 -1819
  596. data/ext/v8/upstream/2.3.3/src/builtins.cc +0 -1529
  597. data/ext/v8/upstream/2.3.3/src/builtins.h +0 -263
  598. data/ext/v8/upstream/2.3.3/src/bytecodes-irregexp.h +0 -104
  599. data/ext/v8/upstream/2.3.3/src/cached-powers.h +0 -119
  600. data/ext/v8/upstream/2.3.3/src/char-predicates-inl.h +0 -86
  601. data/ext/v8/upstream/2.3.3/src/checks.cc +0 -100
  602. data/ext/v8/upstream/2.3.3/src/checks.h +0 -310
  603. data/ext/v8/upstream/2.3.3/src/circular-queue.cc +0 -121
  604. data/ext/v8/upstream/2.3.3/src/code-stubs.cc +0 -177
  605. data/ext/v8/upstream/2.3.3/src/code-stubs.h +0 -177
  606. data/ext/v8/upstream/2.3.3/src/codegen-inl.h +0 -60
  607. data/ext/v8/upstream/2.3.3/src/codegen.cc +0 -516
  608. data/ext/v8/upstream/2.3.3/src/codegen.h +0 -897
  609. data/ext/v8/upstream/2.3.3/src/compilation-cache.cc +0 -562
  610. data/ext/v8/upstream/2.3.3/src/compilation-cache.h +0 -102
  611. data/ext/v8/upstream/2.3.3/src/compiler.cc +0 -654
  612. data/ext/v8/upstream/2.3.3/src/compiler.h +0 -299
  613. data/ext/v8/upstream/2.3.3/src/contexts.cc +0 -256
  614. data/ext/v8/upstream/2.3.3/src/contexts.h +0 -342
  615. data/ext/v8/upstream/2.3.3/src/conversions.cc +0 -1119
  616. data/ext/v8/upstream/2.3.3/src/conversions.h +0 -123
  617. data/ext/v8/upstream/2.3.3/src/counters.h +0 -239
  618. data/ext/v8/upstream/2.3.3/src/cpu-profiler-inl.h +0 -100
  619. data/ext/v8/upstream/2.3.3/src/cpu-profiler.cc +0 -538
  620. data/ext/v8/upstream/2.3.3/src/cpu-profiler.h +0 -285
  621. data/ext/v8/upstream/2.3.3/src/d8-debug.cc +0 -356
  622. data/ext/v8/upstream/2.3.3/src/d8-debug.h +0 -155
  623. data/ext/v8/upstream/2.3.3/src/d8.cc +0 -783
  624. data/ext/v8/upstream/2.3.3/src/d8.h +0 -227
  625. data/ext/v8/upstream/2.3.3/src/d8.js +0 -1683
  626. data/ext/v8/upstream/2.3.3/src/data-flow.cc +0 -758
  627. data/ext/v8/upstream/2.3.3/src/data-flow.h +0 -278
  628. data/ext/v8/upstream/2.3.3/src/date.js +0 -1059
  629. data/ext/v8/upstream/2.3.3/src/dateparser-inl.h +0 -123
  630. data/ext/v8/upstream/2.3.3/src/dateparser.h +0 -244
  631. data/ext/v8/upstream/2.3.3/src/debug-agent.cc +0 -427
  632. data/ext/v8/upstream/2.3.3/src/debug-agent.h +0 -129
  633. data/ext/v8/upstream/2.3.3/src/debug-debugger.js +0 -2227
  634. data/ext/v8/upstream/2.3.3/src/debug.cc +0 -3005
  635. data/ext/v8/upstream/2.3.3/src/debug.h +0 -993
  636. data/ext/v8/upstream/2.3.3/src/disassembler.cc +0 -312
  637. data/ext/v8/upstream/2.3.3/src/double.h +0 -169
  638. data/ext/v8/upstream/2.3.3/src/dtoa-config.c +0 -92
  639. data/ext/v8/upstream/2.3.3/src/dtoa.cc +0 -77
  640. data/ext/v8/upstream/2.3.3/src/dtoa.h +0 -81
  641. data/ext/v8/upstream/2.3.3/src/execution.cc +0 -809
  642. data/ext/v8/upstream/2.3.3/src/execution.h +0 -336
  643. data/ext/v8/upstream/2.3.3/src/factory.cc +0 -1003
  644. data/ext/v8/upstream/2.3.3/src/factory.h +0 -410
  645. data/ext/v8/upstream/2.3.3/src/fast-codegen.cc +0 -746
  646. data/ext/v8/upstream/2.3.3/src/fast-codegen.h +0 -161
  647. data/ext/v8/upstream/2.3.3/src/fast-dtoa.cc +0 -505
  648. data/ext/v8/upstream/2.3.3/src/fast-dtoa.h +0 -58
  649. data/ext/v8/upstream/2.3.3/src/flag-definitions.h +0 -455
  650. data/ext/v8/upstream/2.3.3/src/flags.cc +0 -551
  651. data/ext/v8/upstream/2.3.3/src/flags.h +0 -81
  652. data/ext/v8/upstream/2.3.3/src/flow-graph.cc +0 -763
  653. data/ext/v8/upstream/2.3.3/src/flow-graph.h +0 -180
  654. data/ext/v8/upstream/2.3.3/src/frame-element.h +0 -273
  655. data/ext/v8/upstream/2.3.3/src/frames-inl.h +0 -217
  656. data/ext/v8/upstream/2.3.3/src/frames.cc +0 -826
  657. data/ext/v8/upstream/2.3.3/src/frames.h +0 -682
  658. data/ext/v8/upstream/2.3.3/src/full-codegen.cc +0 -1443
  659. data/ext/v8/upstream/2.3.3/src/full-codegen.h +0 -548
  660. data/ext/v8/upstream/2.3.3/src/func-name-inferrer.cc +0 -76
  661. data/ext/v8/upstream/2.3.3/src/func-name-inferrer.h +0 -135
  662. data/ext/v8/upstream/2.3.3/src/global-handles.cc +0 -520
  663. data/ext/v8/upstream/2.3.3/src/global-handles.h +0 -180
  664. data/ext/v8/upstream/2.3.3/src/globals.h +0 -669
  665. data/ext/v8/upstream/2.3.3/src/handles-inl.h +0 -76
  666. data/ext/v8/upstream/2.3.3/src/handles.cc +0 -825
  667. data/ext/v8/upstream/2.3.3/src/handles.h +0 -393
  668. data/ext/v8/upstream/2.3.3/src/hashmap.cc +0 -226
  669. data/ext/v8/upstream/2.3.3/src/hashmap.h +0 -120
  670. data/ext/v8/upstream/2.3.3/src/heap-inl.h +0 -493
  671. data/ext/v8/upstream/2.3.3/src/heap-profiler.cc +0 -779
  672. data/ext/v8/upstream/2.3.3/src/heap-profiler.h +0 -323
  673. data/ext/v8/upstream/2.3.3/src/heap.cc +0 -4994
  674. data/ext/v8/upstream/2.3.3/src/heap.h +0 -1984
  675. data/ext/v8/upstream/2.3.3/src/ia32/assembler-ia32-inl.h +0 -360
  676. data/ext/v8/upstream/2.3.3/src/ia32/assembler-ia32.cc +0 -2600
  677. data/ext/v8/upstream/2.3.3/src/ia32/assembler-ia32.h +0 -969
  678. data/ext/v8/upstream/2.3.3/src/ia32/builtins-ia32.cc +0 -1261
  679. data/ext/v8/upstream/2.3.3/src/ia32/codegen-ia32.cc +0 -13968
  680. data/ext/v8/upstream/2.3.3/src/ia32/codegen-ia32.h +0 -1097
  681. data/ext/v8/upstream/2.3.3/src/ia32/cpu-ia32.cc +0 -83
  682. data/ext/v8/upstream/2.3.3/src/ia32/debug-ia32.cc +0 -309
  683. data/ext/v8/upstream/2.3.3/src/ia32/disasm-ia32.cc +0 -1471
  684. data/ext/v8/upstream/2.3.3/src/ia32/fast-codegen-ia32.cc +0 -954
  685. data/ext/v8/upstream/2.3.3/src/ia32/fast-codegen-ia32.h +0 -155
  686. data/ext/v8/upstream/2.3.3/src/ia32/frames-ia32.cc +0 -115
  687. data/ext/v8/upstream/2.3.3/src/ia32/frames-ia32.h +0 -135
  688. data/ext/v8/upstream/2.3.3/src/ia32/full-codegen-ia32.cc +0 -3281
  689. data/ext/v8/upstream/2.3.3/src/ia32/ic-ia32.cc +0 -1966
  690. data/ext/v8/upstream/2.3.3/src/ia32/macro-assembler-ia32.cc +0 -1610
  691. data/ext/v8/upstream/2.3.3/src/ia32/macro-assembler-ia32.h +0 -610
  692. data/ext/v8/upstream/2.3.3/src/ia32/regexp-macro-assembler-ia32.cc +0 -1247
  693. data/ext/v8/upstream/2.3.3/src/ia32/regexp-macro-assembler-ia32.h +0 -214
  694. data/ext/v8/upstream/2.3.3/src/ia32/simulator-ia32.h +0 -62
  695. data/ext/v8/upstream/2.3.3/src/ia32/stub-cache-ia32.cc +0 -2750
  696. data/ext/v8/upstream/2.3.3/src/ia32/virtual-frame-ia32.cc +0 -1334
  697. data/ext/v8/upstream/2.3.3/src/ia32/virtual-frame-ia32.h +0 -627
  698. data/ext/v8/upstream/2.3.3/src/ic-inl.h +0 -120
  699. data/ext/v8/upstream/2.3.3/src/ic.cc +0 -1827
  700. data/ext/v8/upstream/2.3.3/src/ic.h +0 -515
  701. data/ext/v8/upstream/2.3.3/src/interpreter-irregexp.cc +0 -646
  702. data/ext/v8/upstream/2.3.3/src/json.js +0 -268
  703. data/ext/v8/upstream/2.3.3/src/jsregexp.cc +0 -5283
  704. data/ext/v8/upstream/2.3.3/src/jsregexp.h +0 -1463
  705. data/ext/v8/upstream/2.3.3/src/jump-target-heavy.cc +0 -429
  706. data/ext/v8/upstream/2.3.3/src/jump-target-heavy.h +0 -244
  707. data/ext/v8/upstream/2.3.3/src/jump-target-light.cc +0 -110
  708. data/ext/v8/upstream/2.3.3/src/jump-target-light.h +0 -192
  709. data/ext/v8/upstream/2.3.3/src/list-inl.h +0 -166
  710. data/ext/v8/upstream/2.3.3/src/list.h +0 -159
  711. data/ext/v8/upstream/2.3.3/src/liveedit-debugger.js +0 -1057
  712. data/ext/v8/upstream/2.3.3/src/liveedit.cc +0 -1480
  713. data/ext/v8/upstream/2.3.3/src/liveedit.h +0 -170
  714. data/ext/v8/upstream/2.3.3/src/log-utils.cc +0 -497
  715. data/ext/v8/upstream/2.3.3/src/log-utils.h +0 -289
  716. data/ext/v8/upstream/2.3.3/src/log.cc +0 -1561
  717. data/ext/v8/upstream/2.3.3/src/log.h +0 -384
  718. data/ext/v8/upstream/2.3.3/src/macro-assembler.h +0 -86
  719. data/ext/v8/upstream/2.3.3/src/macros.py +0 -177
  720. data/ext/v8/upstream/2.3.3/src/mark-compact.cc +0 -2330
  721. data/ext/v8/upstream/2.3.3/src/mark-compact.h +0 -451
  722. data/ext/v8/upstream/2.3.3/src/math.js +0 -264
  723. data/ext/v8/upstream/2.3.3/src/memory.h +0 -74
  724. data/ext/v8/upstream/2.3.3/src/messages.cc +0 -183
  725. data/ext/v8/upstream/2.3.3/src/messages.h +0 -113
  726. data/ext/v8/upstream/2.3.3/src/messages.js +0 -982
  727. data/ext/v8/upstream/2.3.3/src/mips/assembler-mips.h +0 -668
  728. data/ext/v8/upstream/2.3.3/src/mips/builtins-mips.cc +0 -205
  729. data/ext/v8/upstream/2.3.3/src/mips/codegen-mips.h +0 -434
  730. data/ext/v8/upstream/2.3.3/src/mips/debug-mips.cc +0 -131
  731. data/ext/v8/upstream/2.3.3/src/mips/frames-mips.cc +0 -102
  732. data/ext/v8/upstream/2.3.3/src/mips/ic-mips.cc +0 -220
  733. data/ext/v8/upstream/2.3.3/src/mips/simulator-mips.cc +0 -1651
  734. data/ext/v8/upstream/2.3.3/src/mips/simulator-mips.h +0 -311
  735. data/ext/v8/upstream/2.3.3/src/mips/stub-cache-mips.cc +0 -403
  736. data/ext/v8/upstream/2.3.3/src/mirror-debugger.js +0 -2380
  737. data/ext/v8/upstream/2.3.3/src/objects-debug.cc +0 -1366
  738. data/ext/v8/upstream/2.3.3/src/objects-inl.h +0 -3333
  739. data/ext/v8/upstream/2.3.3/src/objects.cc +0 -8820
  740. data/ext/v8/upstream/2.3.3/src/objects.h +0 -5373
  741. data/ext/v8/upstream/2.3.3/src/oprofile-agent.cc +0 -108
  742. data/ext/v8/upstream/2.3.3/src/oprofile-agent.h +0 -77
  743. data/ext/v8/upstream/2.3.3/src/parser.cc +0 -5207
  744. data/ext/v8/upstream/2.3.3/src/parser.h +0 -197
  745. data/ext/v8/upstream/2.3.3/src/platform-freebsd.cc +0 -667
  746. data/ext/v8/upstream/2.3.3/src/platform-linux.cc +0 -862
  747. data/ext/v8/upstream/2.3.3/src/platform-macos.cc +0 -665
  748. data/ext/v8/upstream/2.3.3/src/platform-nullos.cc +0 -454
  749. data/ext/v8/upstream/2.3.3/src/platform-openbsd.cc +0 -622
  750. data/ext/v8/upstream/2.3.3/src/platform-posix.cc +0 -362
  751. data/ext/v8/upstream/2.3.3/src/platform-solaris.cc +0 -653
  752. data/ext/v8/upstream/2.3.3/src/platform-win32.cc +0 -1911
  753. data/ext/v8/upstream/2.3.3/src/platform.h +0 -577
  754. data/ext/v8/upstream/2.3.3/src/powers-ten.h +0 -2461
  755. data/ext/v8/upstream/2.3.3/src/prettyprinter.cc +0 -1531
  756. data/ext/v8/upstream/2.3.3/src/prettyprinter.h +0 -221
  757. data/ext/v8/upstream/2.3.3/src/profile-generator-inl.h +0 -148
  758. data/ext/v8/upstream/2.3.3/src/profile-generator.cc +0 -1830
  759. data/ext/v8/upstream/2.3.3/src/profile-generator.h +0 -853
  760. data/ext/v8/upstream/2.3.3/src/property.cc +0 -96
  761. data/ext/v8/upstream/2.3.3/src/property.h +0 -315
  762. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler-irregexp.cc +0 -464
  763. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler-irregexp.h +0 -141
  764. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler-tracer.cc +0 -356
  765. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler-tracer.h +0 -103
  766. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler.cc +0 -261
  767. data/ext/v8/upstream/2.3.3/src/regexp-macro-assembler.h +0 -228
  768. data/ext/v8/upstream/2.3.3/src/regexp.js +0 -549
  769. data/ext/v8/upstream/2.3.3/src/rewriter.cc +0 -1038
  770. data/ext/v8/upstream/2.3.3/src/rewriter.h +0 -54
  771. data/ext/v8/upstream/2.3.3/src/runtime.cc +0 -10599
  772. data/ext/v8/upstream/2.3.3/src/runtime.h +0 -459
  773. data/ext/v8/upstream/2.3.3/src/runtime.js +0 -629
  774. data/ext/v8/upstream/2.3.3/src/scanner.cc +0 -1346
  775. data/ext/v8/upstream/2.3.3/src/scanner.h +0 -503
  776. data/ext/v8/upstream/2.3.3/src/scopeinfo.cc +0 -637
  777. data/ext/v8/upstream/2.3.3/src/scopeinfo.h +0 -233
  778. data/ext/v8/upstream/2.3.3/src/scopes.cc +0 -962
  779. data/ext/v8/upstream/2.3.3/src/scopes.h +0 -400
  780. data/ext/v8/upstream/2.3.3/src/serialize.cc +0 -1461
  781. data/ext/v8/upstream/2.3.3/src/serialize.h +0 -581
  782. data/ext/v8/upstream/2.3.3/src/spaces-inl.h +0 -483
  783. data/ext/v8/upstream/2.3.3/src/spaces.cc +0 -2901
  784. data/ext/v8/upstream/2.3.3/src/spaces.h +0 -2197
  785. data/ext/v8/upstream/2.3.3/src/string-stream.cc +0 -584
  786. data/ext/v8/upstream/2.3.3/src/string-stream.h +0 -189
  787. data/ext/v8/upstream/2.3.3/src/string.js +0 -1006
  788. data/ext/v8/upstream/2.3.3/src/stub-cache.cc +0 -1379
  789. data/ext/v8/upstream/2.3.3/src/stub-cache.h +0 -756
  790. data/ext/v8/upstream/2.3.3/src/third_party/dtoa/COPYING +0 -15
  791. data/ext/v8/upstream/2.3.3/src/third_party/dtoa/dtoa.c +0 -3334
  792. data/ext/v8/upstream/2.3.3/src/token.cc +0 -56
  793. data/ext/v8/upstream/2.3.3/src/token.h +0 -270
  794. data/ext/v8/upstream/2.3.3/src/top.cc +0 -1067
  795. data/ext/v8/upstream/2.3.3/src/top.h +0 -463
  796. data/ext/v8/upstream/2.3.3/src/type-info.cc +0 -53
  797. data/ext/v8/upstream/2.3.3/src/type-info.h +0 -244
  798. data/ext/v8/upstream/2.3.3/src/unicode-inl.h +0 -238
  799. data/ext/v8/upstream/2.3.3/src/unicode.cc +0 -749
  800. data/ext/v8/upstream/2.3.3/src/unicode.h +0 -279
  801. data/ext/v8/upstream/2.3.3/src/uri.js +0 -415
  802. data/ext/v8/upstream/2.3.3/src/utils.cc +0 -285
  803. data/ext/v8/upstream/2.3.3/src/utils.h +0 -745
  804. data/ext/v8/upstream/2.3.3/src/v8-counters.h +0 -250
  805. data/ext/v8/upstream/2.3.3/src/v8.cc +0 -228
  806. data/ext/v8/upstream/2.3.3/src/v8.h +0 -121
  807. data/ext/v8/upstream/2.3.3/src/v8natives.js +0 -1188
  808. data/ext/v8/upstream/2.3.3/src/v8threads.cc +0 -461
  809. data/ext/v8/upstream/2.3.3/src/v8threads.h +0 -159
  810. data/ext/v8/upstream/2.3.3/src/variables.cc +0 -119
  811. data/ext/v8/upstream/2.3.3/src/variables.h +0 -205
  812. data/ext/v8/upstream/2.3.3/src/version.cc +0 -88
  813. data/ext/v8/upstream/2.3.3/src/virtual-frame-heavy-inl.h +0 -192
  814. data/ext/v8/upstream/2.3.3/src/virtual-frame.h +0 -46
  815. data/ext/v8/upstream/2.3.3/src/vm-state-inl.h +0 -137
  816. data/ext/v8/upstream/2.3.3/src/vm-state.cc +0 -39
  817. data/ext/v8/upstream/2.3.3/src/vm-state.h +0 -77
  818. data/ext/v8/upstream/2.3.3/src/x64/assembler-x64-inl.h +0 -400
  819. data/ext/v8/upstream/2.3.3/src/x64/assembler-x64.cc +0 -2963
  820. data/ext/v8/upstream/2.3.3/src/x64/assembler-x64.h +0 -1438
  821. data/ext/v8/upstream/2.3.3/src/x64/builtins-x64.cc +0 -1296
  822. data/ext/v8/upstream/2.3.3/src/x64/codegen-x64-inl.h +0 -46
  823. data/ext/v8/upstream/2.3.3/src/x64/codegen-x64.cc +0 -12491
  824. data/ext/v8/upstream/2.3.3/src/x64/codegen-x64.h +0 -1090
  825. data/ext/v8/upstream/2.3.3/src/x64/cpu-x64.cc +0 -83
  826. data/ext/v8/upstream/2.3.3/src/x64/debug-x64.cc +0 -267
  827. data/ext/v8/upstream/2.3.3/src/x64/disasm-x64.cc +0 -1696
  828. data/ext/v8/upstream/2.3.3/src/x64/fast-codegen-x64.cc +0 -250
  829. data/ext/v8/upstream/2.3.3/src/x64/frames-x64.cc +0 -113
  830. data/ext/v8/upstream/2.3.3/src/x64/frames-x64.h +0 -125
  831. data/ext/v8/upstream/2.3.3/src/x64/full-codegen-x64.cc +0 -3270
  832. data/ext/v8/upstream/2.3.3/src/x64/ic-x64.cc +0 -1907
  833. data/ext/v8/upstream/2.3.3/src/x64/jump-target-x64.cc +0 -437
  834. data/ext/v8/upstream/2.3.3/src/x64/macro-assembler-x64.cc +0 -2793
  835. data/ext/v8/upstream/2.3.3/src/x64/macro-assembler-x64.h +0 -916
  836. data/ext/v8/upstream/2.3.3/src/x64/regexp-macro-assembler-x64.cc +0 -1374
  837. data/ext/v8/upstream/2.3.3/src/x64/regexp-macro-assembler-x64.h +0 -277
  838. data/ext/v8/upstream/2.3.3/src/x64/simulator-x64.h +0 -63
  839. data/ext/v8/upstream/2.3.3/src/x64/stub-cache-x64.cc +0 -2560
  840. data/ext/v8/upstream/2.3.3/src/x64/virtual-frame-x64.cc +0 -1264
  841. data/ext/v8/upstream/2.3.3/src/x64/virtual-frame-x64.h +0 -590
  842. data/ext/v8/upstream/2.3.3/src/zone-inl.h +0 -82
  843. data/ext/v8/upstream/2.3.3/src/zone.cc +0 -194
  844. data/ext/v8/upstream/2.3.3/src/zone.h +0 -221
  845. data/ext/v8/upstream/2.3.3/tools/codemap.js +0 -270
  846. data/ext/v8/upstream/2.3.3/tools/csvparser.js +0 -83
  847. data/ext/v8/upstream/2.3.3/tools/gc-nvp-trace-processor.py +0 -317
  848. data/ext/v8/upstream/2.3.3/tools/gyp/v8.gyp +0 -749
  849. data/ext/v8/upstream/2.3.3/tools/linux-tick-processor.py +0 -78
  850. data/ext/v8/upstream/2.3.3/tools/logreader.js +0 -338
  851. data/ext/v8/upstream/2.3.3/tools/oprofile/annotate +0 -7
  852. data/ext/v8/upstream/2.3.3/tools/oprofile/common +0 -19
  853. data/ext/v8/upstream/2.3.3/tools/oprofile/dump +0 -7
  854. data/ext/v8/upstream/2.3.3/tools/oprofile/report +0 -7
  855. data/ext/v8/upstream/2.3.3/tools/oprofile/reset +0 -7
  856. data/ext/v8/upstream/2.3.3/tools/oprofile/run +0 -14
  857. data/ext/v8/upstream/2.3.3/tools/oprofile/shutdown +0 -7
  858. data/ext/v8/upstream/2.3.3/tools/oprofile/start +0 -7
  859. data/ext/v8/upstream/2.3.3/tools/presubmit.py +0 -299
  860. data/ext/v8/upstream/2.3.3/tools/profile.js +0 -691
  861. data/ext/v8/upstream/2.3.3/tools/profile_view.js +0 -224
  862. data/ext/v8/upstream/2.3.3/tools/splaytree.js +0 -322
  863. data/ext/v8/upstream/2.3.3/tools/splaytree.py +0 -226
  864. data/ext/v8/upstream/2.3.3/tools/tickprocessor.js +0 -862
  865. data/ext/v8/upstream/2.3.3/tools/tickprocessor.py +0 -571
  866. data/ext/v8/upstream/2.3.3/tools/utils.py +0 -88
  867. data/ext/v8/upstream/2.3.3/tools/visual_studio/README.txt +0 -71
  868. data/ext/v8/upstream/2.3.3/tools/visual_studio/common.vsprops +0 -34
  869. data/ext/v8/upstream/2.3.3/tools/visual_studio/debug.vsprops +0 -17
  870. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_base.vcproj +0 -1143
  871. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_base_arm.vcproj +0 -1115
  872. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_base_x64.vcproj +0 -1096
  873. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_shell_sample.vcproj +0 -145
  874. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_shell_sample_arm.vcproj +0 -145
  875. data/ext/v8/upstream/2.3.3/tools/visual_studio/v8_shell_sample_x64.vcproj +0 -161
  876. data/ext/v8/upstream/2.3.3/tools/windows-tick-processor.bat +0 -29
  877. data/ext/v8/upstream/2.3.3/tools/windows-tick-processor.py +0 -137
@@ -0,0 +1,3493 @@
1
+ // Copyright 2011 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
+ #ifndef V8_HYDROGEN_INSTRUCTIONS_H_
29
+ #define V8_HYDROGEN_INSTRUCTIONS_H_
30
+
31
+ #include "v8.h"
32
+ #include "code-stubs.h"
33
+ #include "string-stream.h"
34
+ #include "zone.h"
35
+
36
+ namespace v8 {
37
+ namespace internal {
38
+
39
+ // Forward declarations.
40
+ class HBasicBlock;
41
+ class HEnvironment;
42
+ class HInstruction;
43
+ class HLoopInformation;
44
+ class HValue;
45
+ class LInstruction;
46
+ class LChunkBuilder;
47
+
48
+
49
+ #define HYDROGEN_ALL_INSTRUCTION_LIST(V) \
50
+ V(ArithmeticBinaryOperation) \
51
+ V(BinaryCall) \
52
+ V(BinaryOperation) \
53
+ V(BitwiseBinaryOperation) \
54
+ V(ControlInstruction) \
55
+ V(Instruction) \
56
+ V(Phi) \
57
+ V(UnaryCall) \
58
+ V(UnaryControlInstruction) \
59
+ V(UnaryOperation) \
60
+ HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
61
+
62
+
63
+ #define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \
64
+ V(AbnormalExit) \
65
+ V(AccessArgumentsAt) \
66
+ V(Add) \
67
+ V(ApplyArguments) \
68
+ V(ArgumentsElements) \
69
+ V(ArgumentsLength) \
70
+ V(ArgumentsObject) \
71
+ V(ArrayLiteral) \
72
+ V(BitAnd) \
73
+ V(BitNot) \
74
+ V(BitOr) \
75
+ V(BitXor) \
76
+ V(BlockEntry) \
77
+ V(BoundsCheck) \
78
+ V(CallConstantFunction) \
79
+ V(CallFunction) \
80
+ V(CallGlobal) \
81
+ V(CallKeyed) \
82
+ V(CallKnownGlobal) \
83
+ V(CallNamed) \
84
+ V(CallNew) \
85
+ V(CallRuntime) \
86
+ V(CallStub) \
87
+ V(Change) \
88
+ V(CheckFunction) \
89
+ V(CheckInstanceType) \
90
+ V(CheckMap) \
91
+ V(CheckNonSmi) \
92
+ V(CheckPrototypeMaps) \
93
+ V(CheckSmi) \
94
+ V(Compare) \
95
+ V(CompareJSObjectEq) \
96
+ V(CompareMap) \
97
+ V(Constant) \
98
+ V(Context) \
99
+ V(DeleteProperty) \
100
+ V(Deoptimize) \
101
+ V(Div) \
102
+ V(EnterInlined) \
103
+ V(FixedArrayLength) \
104
+ V(FunctionLiteral) \
105
+ V(GetCachedArrayIndex) \
106
+ V(GlobalObject) \
107
+ V(GlobalReceiver) \
108
+ V(Goto) \
109
+ V(InstanceOf) \
110
+ V(InstanceOfKnownGlobal) \
111
+ V(IsNull) \
112
+ V(IsObject) \
113
+ V(IsSmi) \
114
+ V(IsConstructCall) \
115
+ V(HasInstanceType) \
116
+ V(HasCachedArrayIndex) \
117
+ V(JSArrayLength) \
118
+ V(ClassOfTest) \
119
+ V(LeaveInlined) \
120
+ V(LoadContextSlot) \
121
+ V(LoadElements) \
122
+ V(LoadFunctionPrototype) \
123
+ V(LoadGlobal) \
124
+ V(LoadKeyedFastElement) \
125
+ V(LoadKeyedGeneric) \
126
+ V(LoadNamedField) \
127
+ V(LoadNamedGeneric) \
128
+ V(LoadPixelArrayElement) \
129
+ V(LoadPixelArrayExternalPointer) \
130
+ V(Mod) \
131
+ V(Mul) \
132
+ V(ObjectLiteral) \
133
+ V(OsrEntry) \
134
+ V(OuterContext) \
135
+ V(Parameter) \
136
+ V(PixelArrayLength) \
137
+ V(Power) \
138
+ V(PushArgument) \
139
+ V(RegExpLiteral) \
140
+ V(Return) \
141
+ V(Sar) \
142
+ V(Shl) \
143
+ V(Shr) \
144
+ V(Simulate) \
145
+ V(StackCheck) \
146
+ V(StoreContextSlot) \
147
+ V(StoreGlobal) \
148
+ V(StoreKeyedFastElement) \
149
+ V(StorePixelArrayElement) \
150
+ V(StoreKeyedGeneric) \
151
+ V(StoreNamedField) \
152
+ V(StoreNamedGeneric) \
153
+ V(StringCharCodeAt) \
154
+ V(StringLength) \
155
+ V(Sub) \
156
+ V(Test) \
157
+ V(Throw) \
158
+ V(Typeof) \
159
+ V(TypeofIs) \
160
+ V(UnaryMathOperation) \
161
+ V(UnknownOSRValue) \
162
+ V(ValueOf)
163
+
164
+ #define GVN_FLAG_LIST(V) \
165
+ V(Calls) \
166
+ V(InobjectFields) \
167
+ V(BackingStoreFields) \
168
+ V(ArrayElements) \
169
+ V(PixelArrayElements) \
170
+ V(GlobalVars) \
171
+ V(Maps) \
172
+ V(ArrayLengths) \
173
+ V(ContextSlots) \
174
+ V(OsrEntries)
175
+
176
+ #define DECLARE_INSTRUCTION(type) \
177
+ virtual bool Is##type() const { return true; } \
178
+ static H##type* cast(HValue* value) { \
179
+ ASSERT(value->Is##type()); \
180
+ return reinterpret_cast<H##type*>(value); \
181
+ } \
182
+ Opcode opcode() const { return HValue::k##type; }
183
+
184
+
185
+ #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
186
+ virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \
187
+ virtual const char* Mnemonic() const { return mnemonic; } \
188
+ DECLARE_INSTRUCTION(type)
189
+
190
+
191
+ class Range: public ZoneObject {
192
+ public:
193
+ Range() : lower_(kMinInt),
194
+ upper_(kMaxInt),
195
+ next_(NULL),
196
+ can_be_minus_zero_(false) { }
197
+
198
+ Range(int32_t lower, int32_t upper)
199
+ : lower_(lower), upper_(upper), next_(NULL), can_be_minus_zero_(false) { }
200
+
201
+ bool IsInSmiRange() const {
202
+ return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
203
+ }
204
+ void KeepOrder();
205
+ void Verify() const;
206
+ int32_t upper() const { return upper_; }
207
+ int32_t lower() const { return lower_; }
208
+ Range* next() const { return next_; }
209
+ Range* CopyClearLower() const { return new Range(kMinInt, upper_); }
210
+ Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); }
211
+ void ClearLower() { lower_ = kMinInt; }
212
+ void ClearUpper() { upper_ = kMaxInt; }
213
+ Range* Copy() const { return new Range(lower_, upper_); }
214
+ bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; }
215
+ int32_t Mask() const;
216
+ void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
217
+ bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
218
+ bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
219
+ bool CanBeNegative() const { return lower_ < 0; }
220
+ bool Includes(int value) const {
221
+ return lower_ <= value && upper_ >= value;
222
+ }
223
+
224
+ void Sar(int32_t value) {
225
+ int32_t bits = value & 0x1F;
226
+ lower_ = lower_ >> bits;
227
+ upper_ = upper_ >> bits;
228
+ set_can_be_minus_zero(false);
229
+ }
230
+
231
+ void Shl(int32_t value) {
232
+ int32_t bits = value & 0x1F;
233
+ int old_lower = lower_;
234
+ int old_upper = upper_;
235
+ lower_ = lower_ << bits;
236
+ upper_ = upper_ << bits;
237
+ if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) {
238
+ upper_ = kMaxInt;
239
+ lower_ = kMinInt;
240
+ }
241
+ set_can_be_minus_zero(false);
242
+ }
243
+
244
+ // Adds a constant to the lower and upper bound of the range.
245
+ void AddConstant(int32_t value);
246
+
247
+ void StackUpon(Range* other) {
248
+ Intersect(other);
249
+ next_ = other;
250
+ }
251
+
252
+ void Intersect(Range* other) {
253
+ upper_ = Min(upper_, other->upper_);
254
+ lower_ = Max(lower_, other->lower_);
255
+ bool b = CanBeMinusZero() && other->CanBeMinusZero();
256
+ set_can_be_minus_zero(b);
257
+ }
258
+
259
+ void Union(Range* other) {
260
+ upper_ = Max(upper_, other->upper_);
261
+ lower_ = Min(lower_, other->lower_);
262
+ bool b = CanBeMinusZero() || other->CanBeMinusZero();
263
+ set_can_be_minus_zero(b);
264
+ }
265
+
266
+ // Compute a new result range and return true, if the operation
267
+ // can overflow.
268
+ bool AddAndCheckOverflow(Range* other);
269
+ bool SubAndCheckOverflow(Range* other);
270
+ bool MulAndCheckOverflow(Range* other);
271
+
272
+ private:
273
+ int32_t lower_;
274
+ int32_t upper_;
275
+ Range* next_;
276
+ bool can_be_minus_zero_;
277
+ };
278
+
279
+
280
+ class Representation {
281
+ public:
282
+ enum Kind {
283
+ kNone,
284
+ kTagged,
285
+ kDouble,
286
+ kInteger32,
287
+ kExternal,
288
+ kNumRepresentations
289
+ };
290
+
291
+ Representation() : kind_(kNone) { }
292
+
293
+ static Representation None() { return Representation(kNone); }
294
+ static Representation Tagged() { return Representation(kTagged); }
295
+ static Representation Integer32() { return Representation(kInteger32); }
296
+ static Representation Double() { return Representation(kDouble); }
297
+ static Representation External() { return Representation(kExternal); }
298
+
299
+ bool Equals(const Representation& other) {
300
+ return kind_ == other.kind_;
301
+ }
302
+
303
+ Kind kind() const { return kind_; }
304
+ bool IsNone() const { return kind_ == kNone; }
305
+ bool IsTagged() const { return kind_ == kTagged; }
306
+ bool IsInteger32() const { return kind_ == kInteger32; }
307
+ bool IsDouble() const { return kind_ == kDouble; }
308
+ bool IsExternal() const { return kind_ == kExternal; }
309
+ bool IsSpecialization() const {
310
+ return kind_ == kInteger32 || kind_ == kDouble;
311
+ }
312
+ const char* Mnemonic() const;
313
+
314
+ private:
315
+ explicit Representation(Kind k) : kind_(k) { }
316
+
317
+ Kind kind_;
318
+ };
319
+
320
+
321
+ class HType {
322
+ public:
323
+ HType() : type_(kUninitialized) { }
324
+
325
+ static HType Tagged() { return HType(kTagged); }
326
+ static HType TaggedPrimitive() { return HType(kTaggedPrimitive); }
327
+ static HType TaggedNumber() { return HType(kTaggedNumber); }
328
+ static HType Smi() { return HType(kSmi); }
329
+ static HType HeapNumber() { return HType(kHeapNumber); }
330
+ static HType String() { return HType(kString); }
331
+ static HType Boolean() { return HType(kBoolean); }
332
+ static HType NonPrimitive() { return HType(kNonPrimitive); }
333
+ static HType JSArray() { return HType(kJSArray); }
334
+ static HType JSObject() { return HType(kJSObject); }
335
+ static HType Uninitialized() { return HType(kUninitialized); }
336
+
337
+ // Return the weakest (least precise) common type.
338
+ HType Combine(HType other) {
339
+ return HType(static_cast<Type>(type_ & other.type_));
340
+ }
341
+
342
+ bool Equals(const HType& other) {
343
+ return type_ == other.type_;
344
+ }
345
+
346
+ bool IsSubtypeOf(const HType& other) {
347
+ return Combine(other).Equals(other);
348
+ }
349
+
350
+ bool IsTagged() {
351
+ ASSERT(type_ != kUninitialized);
352
+ return ((type_ & kTagged) == kTagged);
353
+ }
354
+
355
+ bool IsTaggedPrimitive() {
356
+ ASSERT(type_ != kUninitialized);
357
+ return ((type_ & kTaggedPrimitive) == kTaggedPrimitive);
358
+ }
359
+
360
+ bool IsTaggedNumber() {
361
+ ASSERT(type_ != kUninitialized);
362
+ return ((type_ & kTaggedNumber) == kTaggedNumber);
363
+ }
364
+
365
+ bool IsSmi() {
366
+ ASSERT(type_ != kUninitialized);
367
+ return ((type_ & kSmi) == kSmi);
368
+ }
369
+
370
+ bool IsHeapNumber() {
371
+ ASSERT(type_ != kUninitialized);
372
+ return ((type_ & kHeapNumber) == kHeapNumber);
373
+ }
374
+
375
+ bool IsString() {
376
+ ASSERT(type_ != kUninitialized);
377
+ return ((type_ & kString) == kString);
378
+ }
379
+
380
+ bool IsBoolean() {
381
+ ASSERT(type_ != kUninitialized);
382
+ return ((type_ & kBoolean) == kBoolean);
383
+ }
384
+
385
+ bool IsNonPrimitive() {
386
+ ASSERT(type_ != kUninitialized);
387
+ return ((type_ & kNonPrimitive) == kNonPrimitive);
388
+ }
389
+
390
+ bool IsJSArray() {
391
+ ASSERT(type_ != kUninitialized);
392
+ return ((type_ & kJSArray) == kJSArray);
393
+ }
394
+
395
+ bool IsJSObject() {
396
+ ASSERT(type_ != kUninitialized);
397
+ return ((type_ & kJSObject) == kJSObject);
398
+ }
399
+
400
+ bool IsUninitialized() {
401
+ return type_ == kUninitialized;
402
+ }
403
+
404
+ static HType TypeFromValue(Handle<Object> value);
405
+
406
+ const char* ToString();
407
+ const char* ToShortString();
408
+
409
+ private:
410
+ enum Type {
411
+ kTagged = 0x1, // 0000 0000 0000 0001
412
+ kTaggedPrimitive = 0x5, // 0000 0000 0000 0101
413
+ kTaggedNumber = 0xd, // 0000 0000 0000 1101
414
+ kSmi = 0x1d, // 0000 0000 0001 1101
415
+ kHeapNumber = 0x2d, // 0000 0000 0010 1101
416
+ kString = 0x45, // 0000 0000 0100 0101
417
+ kBoolean = 0x85, // 0000 0000 1000 0101
418
+ kNonPrimitive = 0x101, // 0000 0001 0000 0001
419
+ kJSObject = 0x301, // 0000 0011 0000 0001
420
+ kJSArray = 0x701, // 0000 0111 1000 0001
421
+ kUninitialized = 0x1fff // 0001 1111 1111 1111
422
+ };
423
+
424
+ explicit HType(Type t) : type_(t) { }
425
+
426
+ Type type_;
427
+ };
428
+
429
+
430
+ class HValue: public ZoneObject {
431
+ public:
432
+ static const int kNoNumber = -1;
433
+
434
+ // There must be one corresponding kDepends flag for every kChanges flag and
435
+ // the order of the kChanges flags must be exactly the same as of the kDepends
436
+ // flags.
437
+ enum Flag {
438
+ // Declare global value numbering flags.
439
+ #define DECLARE_DO(type) kChanges##type, kDependsOn##type,
440
+ GVN_FLAG_LIST(DECLARE_DO)
441
+ #undef DECLARE_DO
442
+ kFlexibleRepresentation,
443
+ kUseGVN,
444
+ kCanOverflow,
445
+ kBailoutOnMinusZero,
446
+ kCanBeDivByZero,
447
+ kIsArguments,
448
+ kTruncatingToInt32,
449
+ kLastFlag = kTruncatingToInt32
450
+ };
451
+
452
+ STATIC_ASSERT(kLastFlag < kBitsPerInt);
453
+
454
+ static const int kChangesToDependsFlagsLeftShift = 1;
455
+
456
+ static int ChangesFlagsMask() {
457
+ int result = 0;
458
+ // Create changes mask.
459
+ #define DECLARE_DO(type) result |= (1 << kChanges##type);
460
+ GVN_FLAG_LIST(DECLARE_DO)
461
+ #undef DECLARE_DO
462
+ return result;
463
+ }
464
+
465
+ static int DependsFlagsMask() {
466
+ return ConvertChangesToDependsFlags(ChangesFlagsMask());
467
+ }
468
+
469
+ static int ConvertChangesToDependsFlags(int flags) {
470
+ return flags << kChangesToDependsFlagsLeftShift;
471
+ }
472
+
473
+ static HValue* cast(HValue* value) { return value; }
474
+
475
+ enum Opcode {
476
+ // Declare a unique enum value for each hydrogen instruction.
477
+ #define DECLARE_DO(type) k##type,
478
+ HYDROGEN_ALL_INSTRUCTION_LIST(DECLARE_DO)
479
+ #undef DECLARE_DO
480
+ kMaxInstructionClass
481
+ };
482
+
483
+ HValue() : block_(NULL),
484
+ id_(kNoNumber),
485
+ uses_(2),
486
+ type_(HType::Tagged()),
487
+ range_(NULL),
488
+ flags_(0) {}
489
+ virtual ~HValue() {}
490
+
491
+ HBasicBlock* block() const { return block_; }
492
+ void SetBlock(HBasicBlock* block);
493
+
494
+ int id() const { return id_; }
495
+ void set_id(int id) { id_ = id; }
496
+
497
+ const ZoneList<HValue*>* uses() const { return &uses_; }
498
+
499
+ virtual bool EmitAtUses() const { return false; }
500
+ Representation representation() const { return representation_; }
501
+ void ChangeRepresentation(Representation r) {
502
+ // Representation was already set and is allowed to be changed.
503
+ ASSERT(!representation_.IsNone());
504
+ ASSERT(!r.IsNone());
505
+ ASSERT(CheckFlag(kFlexibleRepresentation));
506
+ RepresentationChanged(r);
507
+ representation_ = r;
508
+ }
509
+
510
+ HType type() const { return type_; }
511
+ void set_type(HType type) {
512
+ ASSERT(uses_.length() == 0);
513
+ type_ = type;
514
+ }
515
+
516
+ // An operation needs to override this function iff:
517
+ // 1) it can produce an int32 output.
518
+ // 2) the true value of its output can potentially be minus zero.
519
+ // The implementation must set a flag so that it bails out in the case where
520
+ // it would otherwise output what should be a minus zero as an int32 zero.
521
+ // If the operation also exists in a form that takes int32 and outputs int32
522
+ // then the operation should return its input value so that we can propagate
523
+ // back. There are two operations that need to propagate back to more than
524
+ // one input. They are phi and binary add. They always return NULL and
525
+ // expect the caller to take care of things.
526
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
527
+ visited->Add(id());
528
+ return NULL;
529
+ }
530
+
531
+ bool IsDefinedAfter(HBasicBlock* other) const;
532
+
533
+ // Operands.
534
+ virtual int OperandCount() = 0;
535
+ virtual HValue* OperandAt(int index) = 0;
536
+ void SetOperandAt(int index, HValue* value);
537
+
538
+ int LookupOperandIndex(int occurrence_index, HValue* op);
539
+ bool UsesMultipleTimes(HValue* op);
540
+
541
+ void ReplaceAndDelete(HValue* other);
542
+ void ReplaceValue(HValue* other);
543
+ void ReplaceAtUse(HValue* use, HValue* other);
544
+ void ReplaceFirstAtUse(HValue* use, HValue* other, Representation r);
545
+ bool HasNoUses() const { return uses_.is_empty(); }
546
+ void ClearOperands();
547
+ void Delete();
548
+
549
+ int flags() const { return flags_; }
550
+ void SetFlag(Flag f) { flags_ |= (1 << f); }
551
+ void ClearFlag(Flag f) { flags_ &= ~(1 << f); }
552
+ bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
553
+
554
+ void SetAllSideEffects() { flags_ |= AllSideEffects(); }
555
+ void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); }
556
+ bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; }
557
+
558
+ Range* range() const { return range_; }
559
+ bool HasRange() const { return range_ != NULL; }
560
+ void AddNewRange(Range* r);
561
+ void RemoveLastAddedRange();
562
+ void ComputeInitialRange();
563
+
564
+ // Representation helpers.
565
+ virtual Representation RequiredInputRepresentation(int index) const = 0;
566
+
567
+ virtual Representation InferredRepresentation() {
568
+ return representation();
569
+ }
570
+
571
+ // This gives the instruction an opportunity to replace itself with an
572
+ // instruction that does the same in some better way. To replace an
573
+ // instruction with a new one, first add the new instruction to the graph,
574
+ // then return it. Return NULL to have the instruction deleted.
575
+ virtual HValue* Canonicalize() { return this; }
576
+
577
+ // Declare virtual type testers.
578
+ #define DECLARE_DO(type) virtual bool Is##type() const { return false; }
579
+ HYDROGEN_ALL_INSTRUCTION_LIST(DECLARE_DO)
580
+ #undef DECLARE_DO
581
+
582
+ bool Equals(HValue* other);
583
+ virtual intptr_t Hashcode();
584
+
585
+ // Printing support.
586
+ virtual void PrintTo(StringStream* stream) = 0;
587
+ void PrintNameTo(StringStream* stream);
588
+ static void PrintTypeTo(HType type, StringStream* stream);
589
+
590
+ virtual const char* Mnemonic() const = 0;
591
+ virtual Opcode opcode() const = 0;
592
+
593
+ // Updated the inferred type of this instruction and returns true if
594
+ // it has changed.
595
+ bool UpdateInferredType();
596
+
597
+ virtual HType CalculateInferredType();
598
+
599
+ #ifdef DEBUG
600
+ virtual void Verify() = 0;
601
+ #endif
602
+
603
+ protected:
604
+ // This function must be overridden for instructions with flag kUseGVN, to
605
+ // compare the non-Operand parts of the instruction.
606
+ virtual bool DataEquals(HValue* other) {
607
+ UNREACHABLE();
608
+ return false;
609
+ }
610
+ virtual void RepresentationChanged(Representation to) { }
611
+ virtual Range* InferRange();
612
+ virtual void DeleteFromGraph() = 0;
613
+ virtual void InternalSetOperandAt(int index, HValue* value) = 0;
614
+ void clear_block() {
615
+ ASSERT(block_ != NULL);
616
+ block_ = NULL;
617
+ }
618
+
619
+ void set_representation(Representation r) {
620
+ // Representation is set-once.
621
+ ASSERT(representation_.IsNone() && !r.IsNone());
622
+ representation_ = r;
623
+ }
624
+
625
+ private:
626
+ // A flag mask to mark an instruction as having arbitrary side effects.
627
+ static int AllSideEffects() {
628
+ return ChangesFlagsMask() & ~(1 << kChangesOsrEntries);
629
+ }
630
+
631
+ void InternalReplaceAtUse(HValue* use, HValue* other);
632
+ void RegisterUse(int index, HValue* new_value);
633
+
634
+ HBasicBlock* block_;
635
+
636
+ // The id of this instruction in the hydrogen graph, assigned when first
637
+ // added to the graph. Reflects creation order.
638
+ int id_;
639
+
640
+ Representation representation_;
641
+ ZoneList<HValue*> uses_;
642
+ HType type_;
643
+ Range* range_;
644
+ int flags_;
645
+
646
+ DISALLOW_COPY_AND_ASSIGN(HValue);
647
+ };
648
+
649
+
650
+ class HInstruction: public HValue {
651
+ public:
652
+ HInstruction* next() const { return next_; }
653
+ HInstruction* previous() const { return previous_; }
654
+
655
+ virtual void PrintTo(StringStream* stream);
656
+ virtual void PrintDataTo(StringStream* stream) { }
657
+
658
+ bool IsLinked() const { return block() != NULL; }
659
+ void Unlink();
660
+ void InsertBefore(HInstruction* next);
661
+ void InsertAfter(HInstruction* previous);
662
+
663
+ int position() const { return position_; }
664
+ bool has_position() const { return position_ != RelocInfo::kNoPosition; }
665
+ void set_position(int position) { position_ = position; }
666
+
667
+ virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0;
668
+
669
+ #ifdef DEBUG
670
+ virtual void Verify();
671
+ #endif
672
+
673
+ // Returns whether this is some kind of deoptimizing check
674
+ // instruction.
675
+ virtual bool IsCheckInstruction() const { return false; }
676
+
677
+ virtual bool IsCall() { return false; }
678
+
679
+ DECLARE_INSTRUCTION(Instruction)
680
+
681
+ protected:
682
+ HInstruction()
683
+ : next_(NULL),
684
+ previous_(NULL),
685
+ position_(RelocInfo::kNoPosition) {
686
+ SetFlag(kDependsOnOsrEntries);
687
+ }
688
+
689
+ virtual void DeleteFromGraph() { Unlink(); }
690
+
691
+ private:
692
+ void InitializeAsFirst(HBasicBlock* block) {
693
+ ASSERT(!IsLinked());
694
+ SetBlock(block);
695
+ }
696
+
697
+ HInstruction* next_;
698
+ HInstruction* previous_;
699
+ int position_;
700
+
701
+ friend class HBasicBlock;
702
+ };
703
+
704
+
705
+ class HControlInstruction: public HInstruction {
706
+ public:
707
+ HControlInstruction(HBasicBlock* first, HBasicBlock* second)
708
+ : first_successor_(first), second_successor_(second) {
709
+ }
710
+
711
+ HBasicBlock* FirstSuccessor() const { return first_successor_; }
712
+ HBasicBlock* SecondSuccessor() const { return second_successor_; }
713
+
714
+ virtual void PrintDataTo(StringStream* stream);
715
+
716
+ DECLARE_INSTRUCTION(ControlInstruction)
717
+
718
+ private:
719
+ HBasicBlock* first_successor_;
720
+ HBasicBlock* second_successor_;
721
+ };
722
+
723
+
724
+ template<int NumElements>
725
+ class HOperandContainer {
726
+ public:
727
+ HOperandContainer() : elems_() { }
728
+
729
+ int length() { return NumElements; }
730
+ HValue*& operator[](int i) {
731
+ ASSERT(i < length());
732
+ return elems_[i];
733
+ }
734
+
735
+ private:
736
+ HValue* elems_[NumElements];
737
+ };
738
+
739
+
740
+ template<>
741
+ class HOperandContainer<0> {
742
+ public:
743
+ int length() { return 0; }
744
+ HValue*& operator[](int i) {
745
+ UNREACHABLE();
746
+ static HValue* t = 0;
747
+ return t;
748
+ }
749
+ };
750
+
751
+
752
+ template<int V>
753
+ class HTemplateInstruction : public HInstruction {
754
+ public:
755
+ int OperandCount() { return V; }
756
+ HValue* OperandAt(int i) { return inputs_[i]; }
757
+
758
+ protected:
759
+ void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
760
+
761
+ private:
762
+ HOperandContainer<V> inputs_;
763
+ };
764
+
765
+
766
+ template<int V>
767
+ class HTemplateControlInstruction : public HControlInstruction {
768
+ public:
769
+ HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second)
770
+ : HControlInstruction(first, second) { }
771
+ int OperandCount() { return V; }
772
+ HValue* OperandAt(int i) { return inputs_[i]; }
773
+
774
+ protected:
775
+ void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
776
+
777
+ private:
778
+ HOperandContainer<V> inputs_;
779
+ };
780
+
781
+
782
+ class HBlockEntry: public HTemplateInstruction<0> {
783
+ public:
784
+ virtual Representation RequiredInputRepresentation(int index) const {
785
+ return Representation::None();
786
+ }
787
+
788
+ DECLARE_CONCRETE_INSTRUCTION(BlockEntry, "block_entry")
789
+ };
790
+
791
+
792
+ class HDeoptimize: public HTemplateControlInstruction<0> {
793
+ public:
794
+ HDeoptimize() : HTemplateControlInstruction<0>(NULL, NULL) { }
795
+
796
+ virtual Representation RequiredInputRepresentation(int index) const {
797
+ return Representation::None();
798
+ }
799
+
800
+ DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
801
+ };
802
+
803
+
804
+ class HGoto: public HTemplateControlInstruction<0> {
805
+ public:
806
+ explicit HGoto(HBasicBlock* target)
807
+ : HTemplateControlInstruction<0>(target, NULL),
808
+ include_stack_check_(false) { }
809
+
810
+ void set_include_stack_check(bool include_stack_check) {
811
+ include_stack_check_ = include_stack_check;
812
+ }
813
+ bool include_stack_check() const { return include_stack_check_; }
814
+
815
+ virtual Representation RequiredInputRepresentation(int index) const {
816
+ return Representation::None();
817
+ }
818
+
819
+ DECLARE_CONCRETE_INSTRUCTION(Goto, "goto")
820
+
821
+ private:
822
+ bool include_stack_check_;
823
+ };
824
+
825
+
826
+ class HUnaryControlInstruction: public HTemplateControlInstruction<1> {
827
+ public:
828
+ explicit HUnaryControlInstruction(HValue* value,
829
+ HBasicBlock* true_target,
830
+ HBasicBlock* false_target)
831
+ : HTemplateControlInstruction<1>(true_target, false_target) {
832
+ SetOperandAt(0, value);
833
+ }
834
+
835
+ virtual void PrintDataTo(StringStream* stream);
836
+
837
+ HValue* value() { return OperandAt(0); }
838
+
839
+ DECLARE_INSTRUCTION(UnaryControlInstruction)
840
+ };
841
+
842
+
843
+ class HTest: public HUnaryControlInstruction {
844
+ public:
845
+ HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target)
846
+ : HUnaryControlInstruction(value, true_target, false_target) {
847
+ ASSERT(true_target != NULL && false_target != NULL);
848
+ }
849
+
850
+ virtual Representation RequiredInputRepresentation(int index) const {
851
+ return Representation::None();
852
+ }
853
+
854
+ DECLARE_CONCRETE_INSTRUCTION(Test, "test")
855
+ };
856
+
857
+
858
+ class HCompareMap: public HUnaryControlInstruction {
859
+ public:
860
+ HCompareMap(HValue* value,
861
+ Handle<Map> map,
862
+ HBasicBlock* true_target,
863
+ HBasicBlock* false_target)
864
+ : HUnaryControlInstruction(value, true_target, false_target),
865
+ map_(map) {
866
+ ASSERT(true_target != NULL);
867
+ ASSERT(false_target != NULL);
868
+ ASSERT(!map.is_null());
869
+ }
870
+
871
+ virtual void PrintDataTo(StringStream* stream);
872
+
873
+ Handle<Map> map() const { return map_; }
874
+
875
+ virtual Representation RequiredInputRepresentation(int index) const {
876
+ return Representation::Tagged();
877
+ }
878
+
879
+ DECLARE_CONCRETE_INSTRUCTION(CompareMap, "compare_map")
880
+
881
+ private:
882
+ Handle<Map> map_;
883
+ };
884
+
885
+
886
+ class HReturn: public HUnaryControlInstruction {
887
+ public:
888
+ explicit HReturn(HValue* value)
889
+ : HUnaryControlInstruction(value, NULL, NULL) {
890
+ }
891
+
892
+ virtual Representation RequiredInputRepresentation(int index) const {
893
+ return Representation::Tagged();
894
+ }
895
+
896
+ DECLARE_CONCRETE_INSTRUCTION(Return, "return")
897
+ };
898
+
899
+
900
+ class HAbnormalExit: public HTemplateControlInstruction<0> {
901
+ public:
902
+ HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { }
903
+
904
+ virtual Representation RequiredInputRepresentation(int index) const {
905
+ return Representation::None();
906
+ }
907
+
908
+ DECLARE_CONCRETE_INSTRUCTION(AbnormalExit, "abnormal_exit")
909
+ };
910
+
911
+
912
+ class HUnaryOperation: public HTemplateInstruction<1> {
913
+ public:
914
+ explicit HUnaryOperation(HValue* value) {
915
+ SetOperandAt(0, value);
916
+ }
917
+
918
+ HValue* value() { return OperandAt(0); }
919
+ virtual void PrintDataTo(StringStream* stream);
920
+
921
+ DECLARE_INSTRUCTION(UnaryOperation)
922
+ };
923
+
924
+
925
+ class HThrow: public HUnaryOperation {
926
+ public:
927
+ explicit HThrow(HValue* value) : HUnaryOperation(value) {
928
+ SetAllSideEffects();
929
+ }
930
+
931
+ virtual Representation RequiredInputRepresentation(int index) const {
932
+ return Representation::Tagged();
933
+ }
934
+
935
+ DECLARE_CONCRETE_INSTRUCTION(Throw, "throw")
936
+ };
937
+
938
+
939
+ class HChange: public HUnaryOperation {
940
+ public:
941
+ HChange(HValue* value,
942
+ Representation from,
943
+ Representation to)
944
+ : HUnaryOperation(value), from_(from), to_(to) {
945
+ ASSERT(!from.IsNone() && !to.IsNone());
946
+ ASSERT(!from.Equals(to));
947
+ set_representation(to);
948
+ SetFlag(kUseGVN);
949
+
950
+ if (from.IsInteger32() && to.IsTagged() && value->range() != NULL &&
951
+ value->range()->IsInSmiRange()) {
952
+ set_type(HType::Smi());
953
+ }
954
+ }
955
+
956
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
957
+
958
+ Representation from() const { return from_; }
959
+ Representation to() const { return to_; }
960
+ virtual Representation RequiredInputRepresentation(int index) const {
961
+ return from_;
962
+ }
963
+
964
+ bool CanTruncateToInt32() const {
965
+ for (int i = 0; i < uses()->length(); ++i) {
966
+ if (!uses()->at(i)->CheckFlag(HValue::kTruncatingToInt32)) return false;
967
+ }
968
+ return true;
969
+ }
970
+
971
+ virtual void PrintDataTo(StringStream* stream);
972
+
973
+ DECLARE_CONCRETE_INSTRUCTION(Change,
974
+ CanTruncateToInt32() ? "truncate" : "change")
975
+
976
+ protected:
977
+ virtual bool DataEquals(HValue* other) {
978
+ if (!other->IsChange()) return false;
979
+ HChange* change = HChange::cast(other);
980
+ return value() == change->value()
981
+ && to().Equals(change->to())
982
+ && CanTruncateToInt32() == change->CanTruncateToInt32();
983
+ }
984
+
985
+ private:
986
+ Representation from_;
987
+ Representation to_;
988
+ };
989
+
990
+
991
+ class HSimulate: public HInstruction {
992
+ public:
993
+ HSimulate(int ast_id, int pop_count, int environment_length)
994
+ : ast_id_(ast_id),
995
+ pop_count_(pop_count),
996
+ environment_length_(environment_length),
997
+ values_(2),
998
+ assigned_indexes_(2) {}
999
+ virtual ~HSimulate() {}
1000
+
1001
+ virtual void PrintDataTo(StringStream* stream);
1002
+
1003
+ bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; }
1004
+ int ast_id() const { return ast_id_; }
1005
+ void set_ast_id(int id) {
1006
+ ASSERT(!HasAstId());
1007
+ ast_id_ = id;
1008
+ }
1009
+
1010
+ int environment_length() const { return environment_length_; }
1011
+ int pop_count() const { return pop_count_; }
1012
+ const ZoneList<HValue*>* values() const { return &values_; }
1013
+ int GetAssignedIndexAt(int index) const {
1014
+ ASSERT(HasAssignedIndexAt(index));
1015
+ return assigned_indexes_[index];
1016
+ }
1017
+ bool HasAssignedIndexAt(int index) const {
1018
+ return assigned_indexes_[index] != kNoIndex;
1019
+ }
1020
+ void AddAssignedValue(int index, HValue* value) {
1021
+ AddValue(index, value);
1022
+ }
1023
+ void AddPushedValue(HValue* value) {
1024
+ AddValue(kNoIndex, value);
1025
+ }
1026
+ virtual int OperandCount() { return values_.length(); }
1027
+ virtual HValue* OperandAt(int index) { return values_[index]; }
1028
+
1029
+ virtual Representation RequiredInputRepresentation(int index) const {
1030
+ return Representation::None();
1031
+ }
1032
+
1033
+ DECLARE_CONCRETE_INSTRUCTION(Simulate, "simulate")
1034
+
1035
+ #ifdef DEBUG
1036
+ virtual void Verify();
1037
+ #endif
1038
+
1039
+ protected:
1040
+ virtual void InternalSetOperandAt(int index, HValue* value) {
1041
+ values_[index] = value;
1042
+ }
1043
+
1044
+ private:
1045
+ static const int kNoIndex = -1;
1046
+ void AddValue(int index, HValue* value) {
1047
+ assigned_indexes_.Add(index);
1048
+ // Resize the list of pushed values.
1049
+ values_.Add(NULL);
1050
+ // Set the operand through the base method in HValue to make sure that the
1051
+ // use lists are correctly updated.
1052
+ SetOperandAt(values_.length() - 1, value);
1053
+ }
1054
+ int ast_id_;
1055
+ int pop_count_;
1056
+ int environment_length_;
1057
+ ZoneList<HValue*> values_;
1058
+ ZoneList<int> assigned_indexes_;
1059
+ };
1060
+
1061
+
1062
+ class HStackCheck: public HTemplateInstruction<0> {
1063
+ public:
1064
+ HStackCheck() { }
1065
+
1066
+ virtual Representation RequiredInputRepresentation(int index) const {
1067
+ return Representation::None();
1068
+ }
1069
+
1070
+ DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack_check")
1071
+ };
1072
+
1073
+
1074
+ class HEnterInlined: public HTemplateInstruction<0> {
1075
+ public:
1076
+ HEnterInlined(Handle<JSFunction> closure, FunctionLiteral* function)
1077
+ : closure_(closure), function_(function) {
1078
+ }
1079
+
1080
+ virtual void PrintDataTo(StringStream* stream);
1081
+
1082
+ Handle<JSFunction> closure() const { return closure_; }
1083
+ FunctionLiteral* function() const { return function_; }
1084
+
1085
+ virtual Representation RequiredInputRepresentation(int index) const {
1086
+ return Representation::None();
1087
+ }
1088
+
1089
+ DECLARE_CONCRETE_INSTRUCTION(EnterInlined, "enter_inlined")
1090
+
1091
+ private:
1092
+ Handle<JSFunction> closure_;
1093
+ FunctionLiteral* function_;
1094
+ };
1095
+
1096
+
1097
+ class HLeaveInlined: public HTemplateInstruction<0> {
1098
+ public:
1099
+ HLeaveInlined() {}
1100
+
1101
+ virtual Representation RequiredInputRepresentation(int index) const {
1102
+ return Representation::None();
1103
+ }
1104
+
1105
+ DECLARE_CONCRETE_INSTRUCTION(LeaveInlined, "leave_inlined")
1106
+ };
1107
+
1108
+
1109
+ class HPushArgument: public HUnaryOperation {
1110
+ public:
1111
+ explicit HPushArgument(HValue* value) : HUnaryOperation(value) {
1112
+ set_representation(Representation::Tagged());
1113
+ }
1114
+
1115
+ virtual Representation RequiredInputRepresentation(int index) const {
1116
+ return Representation::Tagged();
1117
+ }
1118
+
1119
+ HValue* argument() { return OperandAt(0); }
1120
+
1121
+ DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push_argument")
1122
+ };
1123
+
1124
+
1125
+ class HContext: public HTemplateInstruction<0> {
1126
+ public:
1127
+ HContext() {
1128
+ set_representation(Representation::Tagged());
1129
+ SetFlag(kUseGVN);
1130
+ }
1131
+
1132
+ virtual Representation RequiredInputRepresentation(int index) const {
1133
+ return Representation::None();
1134
+ }
1135
+
1136
+ DECLARE_CONCRETE_INSTRUCTION(Context, "context");
1137
+
1138
+ protected:
1139
+ virtual bool DataEquals(HValue* other) { return true; }
1140
+ };
1141
+
1142
+
1143
+ class HOuterContext: public HUnaryOperation {
1144
+ public:
1145
+ explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) {
1146
+ set_representation(Representation::Tagged());
1147
+ SetFlag(kUseGVN);
1148
+ }
1149
+
1150
+ DECLARE_CONCRETE_INSTRUCTION(OuterContext, "outer_context");
1151
+
1152
+ virtual Representation RequiredInputRepresentation(int index) const {
1153
+ return Representation::Tagged();
1154
+ }
1155
+
1156
+ protected:
1157
+ virtual bool DataEquals(HValue* other) { return true; }
1158
+ };
1159
+
1160
+
1161
+ class HGlobalObject: public HUnaryOperation {
1162
+ public:
1163
+ explicit HGlobalObject(HValue* context) : HUnaryOperation(context) {
1164
+ set_representation(Representation::Tagged());
1165
+ SetFlag(kUseGVN);
1166
+ }
1167
+
1168
+ DECLARE_CONCRETE_INSTRUCTION(GlobalObject, "global_object")
1169
+
1170
+ virtual Representation RequiredInputRepresentation(int index) const {
1171
+ return Representation::Tagged();
1172
+ }
1173
+
1174
+ protected:
1175
+ virtual bool DataEquals(HValue* other) { return true; }
1176
+ };
1177
+
1178
+
1179
+ class HGlobalReceiver: public HUnaryOperation {
1180
+ public:
1181
+ explicit HGlobalReceiver(HValue* global_object)
1182
+ : HUnaryOperation(global_object) {
1183
+ set_representation(Representation::Tagged());
1184
+ SetFlag(kUseGVN);
1185
+ }
1186
+
1187
+ DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver, "global_receiver")
1188
+
1189
+ virtual Representation RequiredInputRepresentation(int index) const {
1190
+ return Representation::Tagged();
1191
+ }
1192
+
1193
+ protected:
1194
+ virtual bool DataEquals(HValue* other) { return true; }
1195
+ };
1196
+
1197
+
1198
+ template <int V>
1199
+ class HCall: public HTemplateInstruction<V> {
1200
+ public:
1201
+ // The argument count includes the receiver.
1202
+ explicit HCall<V>(int argument_count) : argument_count_(argument_count) {
1203
+ this->set_representation(Representation::Tagged());
1204
+ this->SetAllSideEffects();
1205
+ }
1206
+
1207
+ virtual HType CalculateInferredType() { return HType::Tagged(); }
1208
+
1209
+ virtual int argument_count() const { return argument_count_; }
1210
+
1211
+ virtual bool IsCall() { return true; }
1212
+
1213
+ private:
1214
+ int argument_count_;
1215
+ };
1216
+
1217
+
1218
+ class HUnaryCall: public HCall<1> {
1219
+ public:
1220
+ HUnaryCall(HValue* value, int argument_count)
1221
+ : HCall<1>(argument_count) {
1222
+ SetOperandAt(0, value);
1223
+ }
1224
+
1225
+ virtual Representation RequiredInputRepresentation(int index) const {
1226
+ return Representation::Tagged();
1227
+ }
1228
+
1229
+ virtual void PrintDataTo(StringStream* stream);
1230
+
1231
+ HValue* value() { return OperandAt(0); }
1232
+
1233
+ DECLARE_INSTRUCTION(UnaryCall)
1234
+ };
1235
+
1236
+
1237
+ class HBinaryCall: public HCall<2> {
1238
+ public:
1239
+ HBinaryCall(HValue* first, HValue* second, int argument_count)
1240
+ : HCall<2>(argument_count) {
1241
+ SetOperandAt(0, first);
1242
+ SetOperandAt(1, second);
1243
+ }
1244
+
1245
+ virtual void PrintDataTo(StringStream* stream);
1246
+
1247
+ virtual Representation RequiredInputRepresentation(int index) const {
1248
+ return Representation::Tagged();
1249
+ }
1250
+
1251
+ HValue* first() { return OperandAt(0); }
1252
+ HValue* second() { return OperandAt(1); }
1253
+
1254
+ DECLARE_INSTRUCTION(BinaryCall)
1255
+ };
1256
+
1257
+
1258
+ class HCallConstantFunction: public HCall<0> {
1259
+ public:
1260
+ HCallConstantFunction(Handle<JSFunction> function, int argument_count)
1261
+ : HCall<0>(argument_count), function_(function) { }
1262
+
1263
+ Handle<JSFunction> function() const { return function_; }
1264
+
1265
+ bool IsApplyFunction() const {
1266
+ return function_->code() == Builtins::builtin(Builtins::FunctionApply);
1267
+ }
1268
+
1269
+ virtual void PrintDataTo(StringStream* stream);
1270
+
1271
+ virtual Representation RequiredInputRepresentation(int index) const {
1272
+ return Representation::None();
1273
+ }
1274
+
1275
+ DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction, "call_constant_function")
1276
+
1277
+ private:
1278
+ Handle<JSFunction> function_;
1279
+ };
1280
+
1281
+
1282
+ class HCallKeyed: public HBinaryCall {
1283
+ public:
1284
+ HCallKeyed(HValue* context, HValue* key, int argument_count)
1285
+ : HBinaryCall(context, key, argument_count) {
1286
+ }
1287
+
1288
+ virtual Representation RequiredInputRepresentation(int index) const {
1289
+ return Representation::Tagged();
1290
+ }
1291
+
1292
+ HValue* context() { return first(); }
1293
+ HValue* key() { return second(); }
1294
+
1295
+ DECLARE_CONCRETE_INSTRUCTION(CallKeyed, "call_keyed")
1296
+ };
1297
+
1298
+
1299
+ class HCallNamed: public HUnaryCall {
1300
+ public:
1301
+ HCallNamed(HValue* context, Handle<String> name, int argument_count)
1302
+ : HUnaryCall(context, argument_count), name_(name) {
1303
+ }
1304
+
1305
+ virtual void PrintDataTo(StringStream* stream);
1306
+
1307
+ HValue* context() { return value(); }
1308
+ Handle<String> name() const { return name_; }
1309
+
1310
+ DECLARE_CONCRETE_INSTRUCTION(CallNamed, "call_named")
1311
+
1312
+ virtual Representation RequiredInputRepresentation(int index) const {
1313
+ return Representation::Tagged();
1314
+ }
1315
+
1316
+ private:
1317
+ Handle<String> name_;
1318
+ };
1319
+
1320
+
1321
+ class HCallFunction: public HUnaryCall {
1322
+ public:
1323
+ HCallFunction(HValue* context, int argument_count)
1324
+ : HUnaryCall(context, argument_count) {
1325
+ }
1326
+
1327
+ HValue* context() { return value(); }
1328
+
1329
+ virtual Representation RequiredInputRepresentation(int index) const {
1330
+ return Representation::Tagged();
1331
+ }
1332
+
1333
+ DECLARE_CONCRETE_INSTRUCTION(CallFunction, "call_function")
1334
+ };
1335
+
1336
+
1337
+ class HCallGlobal: public HUnaryCall {
1338
+ public:
1339
+ HCallGlobal(HValue* context, Handle<String> name, int argument_count)
1340
+ : HUnaryCall(context, argument_count), name_(name) {
1341
+ }
1342
+
1343
+ virtual void PrintDataTo(StringStream* stream);
1344
+
1345
+ HValue* context() { return value(); }
1346
+ Handle<String> name() const { return name_; }
1347
+
1348
+ virtual Representation RequiredInputRepresentation(int index) const {
1349
+ return Representation::Tagged();
1350
+ }
1351
+
1352
+ DECLARE_CONCRETE_INSTRUCTION(CallGlobal, "call_global")
1353
+
1354
+ private:
1355
+ Handle<String> name_;
1356
+ };
1357
+
1358
+
1359
+ class HCallKnownGlobal: public HCall<0> {
1360
+ public:
1361
+ HCallKnownGlobal(Handle<JSFunction> target, int argument_count)
1362
+ : HCall<0>(argument_count), target_(target) { }
1363
+
1364
+ virtual void PrintDataTo(StringStream* stream);
1365
+
1366
+ Handle<JSFunction> target() const { return target_; }
1367
+
1368
+ virtual Representation RequiredInputRepresentation(int index) const {
1369
+ return Representation::None();
1370
+ }
1371
+
1372
+ DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal, "call_known_global")
1373
+
1374
+ private:
1375
+ Handle<JSFunction> target_;
1376
+ };
1377
+
1378
+
1379
+ class HCallNew: public HBinaryCall {
1380
+ public:
1381
+ HCallNew(HValue* context, HValue* constructor, int argument_count)
1382
+ : HBinaryCall(context, constructor, argument_count) {
1383
+ }
1384
+
1385
+ virtual Representation RequiredInputRepresentation(int index) const {
1386
+ return Representation::Tagged();
1387
+ }
1388
+
1389
+ HValue* context() { return first(); }
1390
+ HValue* constructor() { return second(); }
1391
+
1392
+ DECLARE_CONCRETE_INSTRUCTION(CallNew, "call_new")
1393
+ };
1394
+
1395
+
1396
+ class HCallRuntime: public HCall<0> {
1397
+ public:
1398
+ HCallRuntime(Handle<String> name,
1399
+ Runtime::Function* c_function,
1400
+ int argument_count)
1401
+ : HCall<0>(argument_count), c_function_(c_function), name_(name) { }
1402
+ virtual void PrintDataTo(StringStream* stream);
1403
+
1404
+ Runtime::Function* function() const { return c_function_; }
1405
+ Handle<String> name() const { return name_; }
1406
+
1407
+ virtual Representation RequiredInputRepresentation(int index) const {
1408
+ return Representation::None();
1409
+ }
1410
+
1411
+ DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime")
1412
+
1413
+ private:
1414
+ Runtime::Function* c_function_;
1415
+ Handle<String> name_;
1416
+ };
1417
+
1418
+
1419
+ class HJSArrayLength: public HUnaryOperation {
1420
+ public:
1421
+ explicit HJSArrayLength(HValue* value) : HUnaryOperation(value) {
1422
+ // The length of an array is stored as a tagged value in the array
1423
+ // object. It is guaranteed to be 32 bit integer, but it can be
1424
+ // represented as either a smi or heap number.
1425
+ set_representation(Representation::Tagged());
1426
+ SetFlag(kDependsOnArrayLengths);
1427
+ SetFlag(kUseGVN);
1428
+ }
1429
+
1430
+ virtual Representation RequiredInputRepresentation(int index) const {
1431
+ return Representation::Tagged();
1432
+ }
1433
+
1434
+ DECLARE_CONCRETE_INSTRUCTION(JSArrayLength, "js_array_length")
1435
+
1436
+ protected:
1437
+ virtual bool DataEquals(HValue* other) { return true; }
1438
+ };
1439
+
1440
+
1441
+ class HFixedArrayLength: public HUnaryOperation {
1442
+ public:
1443
+ explicit HFixedArrayLength(HValue* value) : HUnaryOperation(value) {
1444
+ set_representation(Representation::Tagged());
1445
+ SetFlag(kDependsOnArrayLengths);
1446
+ SetFlag(kUseGVN);
1447
+ }
1448
+
1449
+ virtual Representation RequiredInputRepresentation(int index) const {
1450
+ return Representation::Tagged();
1451
+ }
1452
+
1453
+ DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength, "fixed_array_length")
1454
+
1455
+ protected:
1456
+ virtual bool DataEquals(HValue* other) { return true; }
1457
+ };
1458
+
1459
+
1460
+ class HPixelArrayLength: public HUnaryOperation {
1461
+ public:
1462
+ explicit HPixelArrayLength(HValue* value) : HUnaryOperation(value) {
1463
+ set_representation(Representation::Integer32());
1464
+ // The result of this instruction is idempotent as long as its inputs don't
1465
+ // change. The length of a pixel array cannot change once set, so it's not
1466
+ // necessary to introduce a kDependsOnArrayLengths or any other dependency.
1467
+ SetFlag(kUseGVN);
1468
+ }
1469
+
1470
+ virtual Representation RequiredInputRepresentation(int index) const {
1471
+ return Representation::Tagged();
1472
+ }
1473
+
1474
+ DECLARE_CONCRETE_INSTRUCTION(PixelArrayLength, "pixel_array_length")
1475
+
1476
+ protected:
1477
+ virtual bool DataEquals(HValue* other) { return true; }
1478
+ };
1479
+
1480
+
1481
+ class HBitNot: public HUnaryOperation {
1482
+ public:
1483
+ explicit HBitNot(HValue* value) : HUnaryOperation(value) {
1484
+ set_representation(Representation::Integer32());
1485
+ SetFlag(kUseGVN);
1486
+ SetFlag(kTruncatingToInt32);
1487
+ }
1488
+
1489
+ virtual Representation RequiredInputRepresentation(int index) const {
1490
+ return Representation::Integer32();
1491
+ }
1492
+ virtual HType CalculateInferredType();
1493
+
1494
+ DECLARE_CONCRETE_INSTRUCTION(BitNot, "bit_not")
1495
+
1496
+ protected:
1497
+ virtual bool DataEquals(HValue* other) { return true; }
1498
+ };
1499
+
1500
+
1501
+ class HUnaryMathOperation: public HUnaryOperation {
1502
+ public:
1503
+ HUnaryMathOperation(HValue* value, BuiltinFunctionId op)
1504
+ : HUnaryOperation(value), op_(op) {
1505
+ switch (op) {
1506
+ case kMathFloor:
1507
+ case kMathRound:
1508
+ case kMathCeil:
1509
+ set_representation(Representation::Integer32());
1510
+ break;
1511
+ case kMathAbs:
1512
+ set_representation(Representation::Tagged());
1513
+ SetFlag(kFlexibleRepresentation);
1514
+ break;
1515
+ case kMathSqrt:
1516
+ case kMathPowHalf:
1517
+ case kMathLog:
1518
+ case kMathSin:
1519
+ case kMathCos:
1520
+ set_representation(Representation::Double());
1521
+ break;
1522
+ default:
1523
+ UNREACHABLE();
1524
+ }
1525
+ SetFlag(kUseGVN);
1526
+ }
1527
+
1528
+ virtual void PrintDataTo(StringStream* stream);
1529
+
1530
+ virtual HType CalculateInferredType();
1531
+
1532
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1533
+
1534
+ virtual Representation RequiredInputRepresentation(int index) const {
1535
+ switch (op_) {
1536
+ case kMathFloor:
1537
+ case kMathRound:
1538
+ case kMathCeil:
1539
+ case kMathSqrt:
1540
+ case kMathPowHalf:
1541
+ case kMathLog:
1542
+ case kMathSin:
1543
+ case kMathCos:
1544
+ return Representation::Double();
1545
+ case kMathAbs:
1546
+ return representation();
1547
+ default:
1548
+ UNREACHABLE();
1549
+ return Representation::None();
1550
+ }
1551
+ }
1552
+
1553
+ virtual HValue* Canonicalize() {
1554
+ // If the input is integer32 then we replace the floor instruction
1555
+ // with its inputs. This happens before the representation changes are
1556
+ // introduced.
1557
+ if (op() == kMathFloor) {
1558
+ if (value()->representation().IsInteger32()) return value();
1559
+ }
1560
+ return this;
1561
+ }
1562
+
1563
+ BuiltinFunctionId op() const { return op_; }
1564
+ const char* OpName() const;
1565
+
1566
+ DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation, "unary_math_operation")
1567
+
1568
+ protected:
1569
+ virtual bool DataEquals(HValue* other) {
1570
+ HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
1571
+ return op_ == b->op();
1572
+ }
1573
+
1574
+ private:
1575
+ BuiltinFunctionId op_;
1576
+ };
1577
+
1578
+
1579
+ class HLoadElements: public HUnaryOperation {
1580
+ public:
1581
+ explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
1582
+ set_representation(Representation::Tagged());
1583
+ SetFlag(kUseGVN);
1584
+ SetFlag(kDependsOnMaps);
1585
+ }
1586
+
1587
+ virtual Representation RequiredInputRepresentation(int index) const {
1588
+ return Representation::Tagged();
1589
+ }
1590
+
1591
+ DECLARE_CONCRETE_INSTRUCTION(LoadElements, "load-elements")
1592
+
1593
+ protected:
1594
+ virtual bool DataEquals(HValue* other) { return true; }
1595
+ };
1596
+
1597
+
1598
+ class HLoadPixelArrayExternalPointer: public HUnaryOperation {
1599
+ public:
1600
+ explicit HLoadPixelArrayExternalPointer(HValue* value)
1601
+ : HUnaryOperation(value) {
1602
+ set_representation(Representation::External());
1603
+ // The result of this instruction is idempotent as long as its inputs don't
1604
+ // change. The external array of a pixel array elements object cannot
1605
+ // change once set, so it's no necessary to introduce any additional
1606
+ // dependencies on top of the inputs.
1607
+ SetFlag(kUseGVN);
1608
+ }
1609
+
1610
+ virtual Representation RequiredInputRepresentation(int index) const {
1611
+ return Representation::Tagged();
1612
+ }
1613
+
1614
+ DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayExternalPointer,
1615
+ "load-pixel-array-external-pointer")
1616
+
1617
+ protected:
1618
+ virtual bool DataEquals(HValue* other) { return true; }
1619
+ };
1620
+
1621
+
1622
+ class HCheckMap: public HUnaryOperation {
1623
+ public:
1624
+ HCheckMap(HValue* value, Handle<Map> map)
1625
+ : HUnaryOperation(value), map_(map) {
1626
+ set_representation(Representation::Tagged());
1627
+ SetFlag(kUseGVN);
1628
+ SetFlag(kDependsOnMaps);
1629
+ }
1630
+
1631
+ virtual bool IsCheckInstruction() const { return true; }
1632
+
1633
+ virtual Representation RequiredInputRepresentation(int index) const {
1634
+ return Representation::Tagged();
1635
+ }
1636
+ virtual void PrintDataTo(StringStream* stream);
1637
+ virtual HType CalculateInferredType();
1638
+
1639
+ #ifdef DEBUG
1640
+ virtual void Verify();
1641
+ #endif
1642
+
1643
+ Handle<Map> map() const { return map_; }
1644
+
1645
+ DECLARE_CONCRETE_INSTRUCTION(CheckMap, "check_map")
1646
+
1647
+ protected:
1648
+ virtual bool DataEquals(HValue* other) {
1649
+ HCheckMap* b = HCheckMap::cast(other);
1650
+ return map_.is_identical_to(b->map());
1651
+ }
1652
+
1653
+ private:
1654
+ Handle<Map> map_;
1655
+ };
1656
+
1657
+
1658
+ class HCheckFunction: public HUnaryOperation {
1659
+ public:
1660
+ HCheckFunction(HValue* value, Handle<JSFunction> function)
1661
+ : HUnaryOperation(value), target_(function) {
1662
+ set_representation(Representation::Tagged());
1663
+ SetFlag(kUseGVN);
1664
+ }
1665
+
1666
+ virtual bool IsCheckInstruction() const { return true; }
1667
+
1668
+ virtual Representation RequiredInputRepresentation(int index) const {
1669
+ return Representation::Tagged();
1670
+ }
1671
+ virtual void PrintDataTo(StringStream* stream);
1672
+ virtual HType CalculateInferredType();
1673
+
1674
+ #ifdef DEBUG
1675
+ virtual void Verify();
1676
+ #endif
1677
+
1678
+ Handle<JSFunction> target() const { return target_; }
1679
+
1680
+ DECLARE_CONCRETE_INSTRUCTION(CheckFunction, "check_function")
1681
+
1682
+ protected:
1683
+ virtual bool DataEquals(HValue* other) {
1684
+ HCheckFunction* b = HCheckFunction::cast(other);
1685
+ return target_.is_identical_to(b->target());
1686
+ }
1687
+
1688
+ private:
1689
+ Handle<JSFunction> target_;
1690
+ };
1691
+
1692
+
1693
+ class HCheckInstanceType: public HUnaryOperation {
1694
+ public:
1695
+ // Check that the instance type is in the range [first, last] where
1696
+ // both first and last are included.
1697
+ HCheckInstanceType(HValue* value, InstanceType first, InstanceType last)
1698
+ : HUnaryOperation(value), first_(first), last_(last) {
1699
+ ASSERT(first <= last);
1700
+ set_representation(Representation::Tagged());
1701
+ SetFlag(kUseGVN);
1702
+ if ((FIRST_STRING_TYPE < first && last <= LAST_STRING_TYPE) ||
1703
+ (FIRST_STRING_TYPE <= first && last < LAST_STRING_TYPE)) {
1704
+ // A particular string instance type can change because of GC or
1705
+ // externalization, but the value still remains a string.
1706
+ SetFlag(kDependsOnMaps);
1707
+ }
1708
+ }
1709
+
1710
+ virtual bool IsCheckInstruction() const { return true; }
1711
+
1712
+ virtual Representation RequiredInputRepresentation(int index) const {
1713
+ return Representation::Tagged();
1714
+ }
1715
+
1716
+ #ifdef DEBUG
1717
+ virtual void Verify();
1718
+ #endif
1719
+
1720
+ static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value);
1721
+
1722
+ InstanceType first() const { return first_; }
1723
+ InstanceType last() const { return last_; }
1724
+
1725
+ DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check_instance_type")
1726
+
1727
+ protected:
1728
+ // TODO(ager): It could be nice to allow the ommision of instance
1729
+ // type checks if we have already performed an instance type check
1730
+ // with a larger range.
1731
+ virtual bool DataEquals(HValue* other) {
1732
+ HCheckInstanceType* b = HCheckInstanceType::cast(other);
1733
+ return (first_ == b->first()) && (last_ == b->last());
1734
+ }
1735
+
1736
+ private:
1737
+ InstanceType first_;
1738
+ InstanceType last_;
1739
+ };
1740
+
1741
+
1742
+ class HCheckNonSmi: public HUnaryOperation {
1743
+ public:
1744
+ explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) {
1745
+ set_representation(Representation::Tagged());
1746
+ SetFlag(kUseGVN);
1747
+ }
1748
+
1749
+ virtual bool IsCheckInstruction() const { return true; }
1750
+
1751
+ virtual Representation RequiredInputRepresentation(int index) const {
1752
+ return Representation::Tagged();
1753
+ }
1754
+
1755
+ virtual HType CalculateInferredType();
1756
+
1757
+ #ifdef DEBUG
1758
+ virtual void Verify();
1759
+ #endif
1760
+
1761
+ DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check_non_smi")
1762
+
1763
+ protected:
1764
+ virtual bool DataEquals(HValue* other) { return true; }
1765
+ };
1766
+
1767
+
1768
+ class HCheckPrototypeMaps: public HTemplateInstruction<0> {
1769
+ public:
1770
+ HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder)
1771
+ : prototype_(prototype), holder_(holder) {
1772
+ SetFlag(kUseGVN);
1773
+ SetFlag(kDependsOnMaps);
1774
+ }
1775
+
1776
+ virtual bool IsCheckInstruction() const { return true; }
1777
+
1778
+ #ifdef DEBUG
1779
+ virtual void Verify();
1780
+ #endif
1781
+
1782
+ Handle<JSObject> prototype() const { return prototype_; }
1783
+ Handle<JSObject> holder() const { return holder_; }
1784
+
1785
+ DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps, "check_prototype_maps")
1786
+
1787
+ virtual Representation RequiredInputRepresentation(int index) const {
1788
+ return Representation::None();
1789
+ }
1790
+
1791
+ virtual intptr_t Hashcode() {
1792
+ ASSERT(!Heap::IsAllocationAllowed());
1793
+ intptr_t hash = reinterpret_cast<intptr_t>(*prototype());
1794
+ hash = 17 * hash + reinterpret_cast<intptr_t>(*holder());
1795
+ return hash;
1796
+ }
1797
+
1798
+ protected:
1799
+ virtual bool DataEquals(HValue* other) {
1800
+ HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other);
1801
+ return prototype_.is_identical_to(b->prototype()) &&
1802
+ holder_.is_identical_to(b->holder());
1803
+ }
1804
+
1805
+ private:
1806
+ Handle<JSObject> prototype_;
1807
+ Handle<JSObject> holder_;
1808
+ };
1809
+
1810
+
1811
+ class HCheckSmi: public HUnaryOperation {
1812
+ public:
1813
+ explicit HCheckSmi(HValue* value) : HUnaryOperation(value) {
1814
+ set_representation(Representation::Tagged());
1815
+ SetFlag(kUseGVN);
1816
+ }
1817
+
1818
+ virtual bool IsCheckInstruction() const { return true; }
1819
+
1820
+ virtual Representation RequiredInputRepresentation(int index) const {
1821
+ return Representation::Tagged();
1822
+ }
1823
+ virtual HType CalculateInferredType();
1824
+
1825
+ #ifdef DEBUG
1826
+ virtual void Verify();
1827
+ #endif
1828
+
1829
+ DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check_smi")
1830
+
1831
+ protected:
1832
+ virtual bool DataEquals(HValue* other) { return true; }
1833
+ };
1834
+
1835
+
1836
+ class HPhi: public HValue {
1837
+ public:
1838
+ explicit HPhi(int merged_index)
1839
+ : inputs_(2),
1840
+ merged_index_(merged_index),
1841
+ phi_id_(-1) {
1842
+ for (int i = 0; i < Representation::kNumRepresentations; i++) {
1843
+ non_phi_uses_[i] = 0;
1844
+ indirect_uses_[i] = 0;
1845
+ }
1846
+ ASSERT(merged_index >= 0);
1847
+ set_representation(Representation::Tagged());
1848
+ SetFlag(kFlexibleRepresentation);
1849
+ }
1850
+
1851
+ virtual Representation InferredRepresentation() {
1852
+ bool double_occurred = false;
1853
+ bool int32_occurred = false;
1854
+ for (int i = 0; i < OperandCount(); ++i) {
1855
+ HValue* value = OperandAt(i);
1856
+ if (value->representation().IsDouble()) double_occurred = true;
1857
+ if (value->representation().IsInteger32()) int32_occurred = true;
1858
+ if (value->representation().IsTagged()) return Representation::Tagged();
1859
+ }
1860
+
1861
+ if (double_occurred) return Representation::Double();
1862
+ if (int32_occurred) return Representation::Integer32();
1863
+ return Representation::None();
1864
+ }
1865
+
1866
+ virtual Range* InferRange();
1867
+ virtual Representation RequiredInputRepresentation(int index) const {
1868
+ return representation();
1869
+ }
1870
+ virtual HType CalculateInferredType();
1871
+ virtual int OperandCount() { return inputs_.length(); }
1872
+ virtual HValue* OperandAt(int index) { return inputs_[index]; }
1873
+ HValue* GetRedundantReplacement();
1874
+ void AddInput(HValue* value);
1875
+
1876
+ bool IsReceiver() { return merged_index_ == 0; }
1877
+
1878
+ int merged_index() const { return merged_index_; }
1879
+
1880
+ virtual const char* Mnemonic() const { return "phi"; }
1881
+
1882
+ virtual void PrintTo(StringStream* stream);
1883
+
1884
+ #ifdef DEBUG
1885
+ virtual void Verify();
1886
+ #endif
1887
+
1888
+ DECLARE_INSTRUCTION(Phi)
1889
+
1890
+ void InitRealUses(int id);
1891
+ void AddNonPhiUsesFrom(HPhi* other);
1892
+ void AddIndirectUsesTo(int* use_count);
1893
+
1894
+ int tagged_non_phi_uses() const {
1895
+ return non_phi_uses_[Representation::kTagged];
1896
+ }
1897
+ int int32_non_phi_uses() const {
1898
+ return non_phi_uses_[Representation::kInteger32];
1899
+ }
1900
+ int double_non_phi_uses() const {
1901
+ return non_phi_uses_[Representation::kDouble];
1902
+ }
1903
+ int tagged_indirect_uses() const {
1904
+ return indirect_uses_[Representation::kTagged];
1905
+ }
1906
+ int int32_indirect_uses() const {
1907
+ return indirect_uses_[Representation::kInteger32];
1908
+ }
1909
+ int double_indirect_uses() const {
1910
+ return indirect_uses_[Representation::kDouble];
1911
+ }
1912
+ int phi_id() { return phi_id_; }
1913
+
1914
+ protected:
1915
+ virtual void DeleteFromGraph();
1916
+ virtual void InternalSetOperandAt(int index, HValue* value) {
1917
+ inputs_[index] = value;
1918
+ }
1919
+
1920
+ private:
1921
+ ZoneList<HValue*> inputs_;
1922
+ int merged_index_;
1923
+
1924
+ int non_phi_uses_[Representation::kNumRepresentations];
1925
+ int indirect_uses_[Representation::kNumRepresentations];
1926
+ int phi_id_;
1927
+ };
1928
+
1929
+
1930
+ class HArgumentsObject: public HTemplateInstruction<0> {
1931
+ public:
1932
+ HArgumentsObject() {
1933
+ set_representation(Representation::Tagged());
1934
+ SetFlag(kIsArguments);
1935
+ }
1936
+
1937
+ virtual Representation RequiredInputRepresentation(int index) const {
1938
+ return Representation::None();
1939
+ }
1940
+
1941
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject, "arguments-object")
1942
+ };
1943
+
1944
+
1945
+ class HConstant: public HTemplateInstruction<0> {
1946
+ public:
1947
+ HConstant(Handle<Object> handle, Representation r);
1948
+
1949
+ Handle<Object> handle() const { return handle_; }
1950
+
1951
+ bool InOldSpace() const { return !Heap::InNewSpace(*handle_); }
1952
+
1953
+ virtual Representation RequiredInputRepresentation(int index) const {
1954
+ return Representation::None();
1955
+ }
1956
+
1957
+ virtual bool EmitAtUses() const { return !representation().IsDouble(); }
1958
+ virtual void PrintDataTo(StringStream* stream);
1959
+ virtual HType CalculateInferredType();
1960
+ bool IsInteger() const { return handle_->IsSmi(); }
1961
+ HConstant* CopyToRepresentation(Representation r) const;
1962
+ HConstant* CopyToTruncatedInt32() const;
1963
+ bool HasInteger32Value() const { return has_int32_value_; }
1964
+ int32_t Integer32Value() const {
1965
+ ASSERT(HasInteger32Value());
1966
+ return int32_value_;
1967
+ }
1968
+ bool HasDoubleValue() const { return has_double_value_; }
1969
+ double DoubleValue() const {
1970
+ ASSERT(HasDoubleValue());
1971
+ return double_value_;
1972
+ }
1973
+ bool HasStringValue() const { return handle_->IsString(); }
1974
+
1975
+ virtual intptr_t Hashcode() {
1976
+ ASSERT(!Heap::allow_allocation(false));
1977
+ return reinterpret_cast<intptr_t>(*handle());
1978
+ }
1979
+
1980
+ #ifdef DEBUG
1981
+ virtual void Verify() { }
1982
+ #endif
1983
+
1984
+ DECLARE_CONCRETE_INSTRUCTION(Constant, "constant")
1985
+
1986
+ protected:
1987
+ virtual Range* InferRange();
1988
+
1989
+ virtual bool DataEquals(HValue* other) {
1990
+ HConstant* other_constant = HConstant::cast(other);
1991
+ return handle().is_identical_to(other_constant->handle());
1992
+ }
1993
+
1994
+ private:
1995
+ Handle<Object> handle_;
1996
+ HType constant_type_;
1997
+
1998
+ // The following two values represent the int32 and the double value of the
1999
+ // given constant if there is a lossless conversion between the constant
2000
+ // and the specific representation.
2001
+ bool has_int32_value_;
2002
+ int32_t int32_value_;
2003
+ bool has_double_value_;
2004
+ double double_value_;
2005
+ };
2006
+
2007
+
2008
+ class HBinaryOperation: public HTemplateInstruction<2> {
2009
+ public:
2010
+ HBinaryOperation(HValue* left, HValue* right) {
2011
+ ASSERT(left != NULL && right != NULL);
2012
+ SetOperandAt(0, left);
2013
+ SetOperandAt(1, right);
2014
+ }
2015
+
2016
+ HValue* left() { return OperandAt(0); }
2017
+ HValue* right() { return OperandAt(1); }
2018
+
2019
+ // TODO(kasperl): Move these helpers to the IA-32 Lithium
2020
+ // instruction sequence builder.
2021
+ HValue* LeastConstantOperand() {
2022
+ if (IsCommutative() && left()->IsConstant()) return right();
2023
+ return left();
2024
+ }
2025
+ HValue* MostConstantOperand() {
2026
+ if (IsCommutative() && left()->IsConstant()) return left();
2027
+ return right();
2028
+ }
2029
+
2030
+ virtual bool IsCommutative() const { return false; }
2031
+
2032
+ virtual void PrintDataTo(StringStream* stream);
2033
+
2034
+ DECLARE_INSTRUCTION(BinaryOperation)
2035
+ };
2036
+
2037
+
2038
+ class HApplyArguments: public HTemplateInstruction<4> {
2039
+ public:
2040
+ HApplyArguments(HValue* function,
2041
+ HValue* receiver,
2042
+ HValue* length,
2043
+ HValue* elements) {
2044
+ set_representation(Representation::Tagged());
2045
+ SetOperandAt(0, function);
2046
+ SetOperandAt(1, receiver);
2047
+ SetOperandAt(2, length);
2048
+ SetOperandAt(3, elements);
2049
+ SetAllSideEffects();
2050
+ }
2051
+
2052
+ virtual Representation RequiredInputRepresentation(int index) const {
2053
+ // The length is untagged, all other inputs are tagged.
2054
+ return (index == 2)
2055
+ ? Representation::Integer32()
2056
+ : Representation::Tagged();
2057
+ }
2058
+
2059
+ HValue* function() { return OperandAt(0); }
2060
+ HValue* receiver() { return OperandAt(1); }
2061
+ HValue* length() { return OperandAt(2); }
2062
+ HValue* elements() { return OperandAt(3); }
2063
+
2064
+ DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply_arguments")
2065
+ };
2066
+
2067
+
2068
+ class HArgumentsElements: public HTemplateInstruction<0> {
2069
+ public:
2070
+ HArgumentsElements() {
2071
+ // The value produced by this instruction is a pointer into the stack
2072
+ // that looks as if it was a smi because of alignment.
2073
+ set_representation(Representation::Tagged());
2074
+ SetFlag(kUseGVN);
2075
+ }
2076
+
2077
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments_elements")
2078
+
2079
+ virtual Representation RequiredInputRepresentation(int index) const {
2080
+ return Representation::None();
2081
+ }
2082
+
2083
+ protected:
2084
+ virtual bool DataEquals(HValue* other) { return true; }
2085
+ };
2086
+
2087
+
2088
+ class HArgumentsLength: public HUnaryOperation {
2089
+ public:
2090
+ explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) {
2091
+ set_representation(Representation::Integer32());
2092
+ SetFlag(kUseGVN);
2093
+ }
2094
+
2095
+ virtual Representation RequiredInputRepresentation(int index) const {
2096
+ return Representation::Tagged();
2097
+ }
2098
+
2099
+ DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments_length")
2100
+
2101
+ protected:
2102
+ virtual bool DataEquals(HValue* other) { return true; }
2103
+ };
2104
+
2105
+
2106
+ class HAccessArgumentsAt: public HTemplateInstruction<3> {
2107
+ public:
2108
+ HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) {
2109
+ set_representation(Representation::Tagged());
2110
+ SetFlag(kUseGVN);
2111
+ SetOperandAt(0, arguments);
2112
+ SetOperandAt(1, length);
2113
+ SetOperandAt(2, index);
2114
+ }
2115
+
2116
+ virtual void PrintDataTo(StringStream* stream);
2117
+
2118
+ virtual Representation RequiredInputRepresentation(int index) const {
2119
+ // The arguments elements is considered tagged.
2120
+ return index == 0
2121
+ ? Representation::Tagged()
2122
+ : Representation::Integer32();
2123
+ }
2124
+
2125
+ HValue* arguments() { return OperandAt(0); }
2126
+ HValue* length() { return OperandAt(1); }
2127
+ HValue* index() { return OperandAt(2); }
2128
+
2129
+ DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access_arguments_at")
2130
+
2131
+ virtual bool DataEquals(HValue* other) { return true; }
2132
+ };
2133
+
2134
+
2135
+ class HBoundsCheck: public HBinaryOperation {
2136
+ public:
2137
+ HBoundsCheck(HValue* index, HValue* length)
2138
+ : HBinaryOperation(index, length) {
2139
+ SetFlag(kUseGVN);
2140
+ }
2141
+
2142
+ virtual bool IsCheckInstruction() const { return true; }
2143
+
2144
+ virtual Representation RequiredInputRepresentation(int index) const {
2145
+ return Representation::Integer32();
2146
+ }
2147
+
2148
+ #ifdef DEBUG
2149
+ virtual void Verify();
2150
+ #endif
2151
+
2152
+ HValue* index() { return left(); }
2153
+ HValue* length() { return right(); }
2154
+
2155
+ DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds_check")
2156
+
2157
+ protected:
2158
+ virtual bool DataEquals(HValue* other) { return true; }
2159
+ };
2160
+
2161
+
2162
+ class HBitwiseBinaryOperation: public HBinaryOperation {
2163
+ public:
2164
+ HBitwiseBinaryOperation(HValue* left, HValue* right)
2165
+ : HBinaryOperation(left, right) {
2166
+ set_representation(Representation::Tagged());
2167
+ SetFlag(kFlexibleRepresentation);
2168
+ SetAllSideEffects();
2169
+ }
2170
+
2171
+ virtual Representation RequiredInputRepresentation(int index) const {
2172
+ return representation();
2173
+ }
2174
+
2175
+ virtual void RepresentationChanged(Representation to) {
2176
+ if (!to.IsTagged()) {
2177
+ ASSERT(to.IsInteger32());
2178
+ ClearAllSideEffects();
2179
+ SetFlag(kTruncatingToInt32);
2180
+ SetFlag(kUseGVN);
2181
+ }
2182
+ }
2183
+
2184
+ virtual HType CalculateInferredType();
2185
+
2186
+ DECLARE_INSTRUCTION(BitwiseBinaryOperation)
2187
+ };
2188
+
2189
+
2190
+ class HArithmeticBinaryOperation: public HBinaryOperation {
2191
+ public:
2192
+ HArithmeticBinaryOperation(HValue* left, HValue* right)
2193
+ : HBinaryOperation(left, right) {
2194
+ set_representation(Representation::Tagged());
2195
+ SetFlag(kFlexibleRepresentation);
2196
+ SetAllSideEffects();
2197
+ }
2198
+
2199
+ virtual void RepresentationChanged(Representation to) {
2200
+ if (!to.IsTagged()) {
2201
+ ClearAllSideEffects();
2202
+ SetFlag(kUseGVN);
2203
+ }
2204
+ }
2205
+
2206
+ virtual HType CalculateInferredType();
2207
+ virtual Representation RequiredInputRepresentation(int index) const {
2208
+ return representation();
2209
+ }
2210
+ virtual Representation InferredRepresentation() {
2211
+ if (left()->representation().Equals(right()->representation())) {
2212
+ return left()->representation();
2213
+ }
2214
+ return HValue::InferredRepresentation();
2215
+ }
2216
+
2217
+ DECLARE_INSTRUCTION(ArithmeticBinaryOperation)
2218
+ };
2219
+
2220
+
2221
+ class HCompare: public HBinaryOperation {
2222
+ public:
2223
+ HCompare(HValue* left, HValue* right, Token::Value token)
2224
+ : HBinaryOperation(left, right), token_(token) {
2225
+ ASSERT(Token::IsCompareOp(token));
2226
+ set_representation(Representation::Tagged());
2227
+ SetAllSideEffects();
2228
+ }
2229
+
2230
+ void SetInputRepresentation(Representation r);
2231
+
2232
+ virtual bool EmitAtUses() const {
2233
+ return !HasSideEffects() && (uses()->length() <= 1);
2234
+ }
2235
+
2236
+ virtual Representation RequiredInputRepresentation(int index) const {
2237
+ return input_representation_;
2238
+ }
2239
+ Representation GetInputRepresentation() const {
2240
+ return input_representation_;
2241
+ }
2242
+ Token::Value token() const { return token_; }
2243
+ virtual void PrintDataTo(StringStream* stream);
2244
+
2245
+ virtual HType CalculateInferredType();
2246
+
2247
+ virtual intptr_t Hashcode() {
2248
+ return HValue::Hashcode() * 7 + token_;
2249
+ }
2250
+
2251
+ DECLARE_CONCRETE_INSTRUCTION(Compare, "compare")
2252
+
2253
+ protected:
2254
+ virtual bool DataEquals(HValue* other) {
2255
+ HCompare* comp = HCompare::cast(other);
2256
+ return token_ == comp->token();
2257
+ }
2258
+
2259
+ private:
2260
+ Representation input_representation_;
2261
+ Token::Value token_;
2262
+ };
2263
+
2264
+
2265
+ class HCompareJSObjectEq: public HBinaryOperation {
2266
+ public:
2267
+ HCompareJSObjectEq(HValue* left, HValue* right)
2268
+ : HBinaryOperation(left, right) {
2269
+ set_representation(Representation::Tagged());
2270
+ SetFlag(kUseGVN);
2271
+ }
2272
+
2273
+ virtual bool EmitAtUses() const {
2274
+ return !HasSideEffects() && (uses()->length() <= 1);
2275
+ }
2276
+
2277
+ virtual Representation RequiredInputRepresentation(int index) const {
2278
+ return Representation::Tagged();
2279
+ }
2280
+ virtual HType CalculateInferredType();
2281
+
2282
+ DECLARE_CONCRETE_INSTRUCTION(CompareJSObjectEq, "compare-js-object-eq")
2283
+
2284
+ protected:
2285
+ virtual bool DataEquals(HValue* other) { return true; }
2286
+ };
2287
+
2288
+
2289
+ class HUnaryPredicate: public HUnaryOperation {
2290
+ public:
2291
+ explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) {
2292
+ set_representation(Representation::Tagged());
2293
+ SetFlag(kUseGVN);
2294
+ }
2295
+
2296
+ virtual bool EmitAtUses() const {
2297
+ return !HasSideEffects() && (uses()->length() <= 1);
2298
+ }
2299
+
2300
+ virtual Representation RequiredInputRepresentation(int index) const {
2301
+ return Representation::Tagged();
2302
+ }
2303
+ virtual HType CalculateInferredType();
2304
+ };
2305
+
2306
+
2307
+ class HIsNull: public HUnaryPredicate {
2308
+ public:
2309
+ HIsNull(HValue* value, bool is_strict)
2310
+ : HUnaryPredicate(value), is_strict_(is_strict) { }
2311
+
2312
+ bool is_strict() const { return is_strict_; }
2313
+
2314
+ DECLARE_CONCRETE_INSTRUCTION(IsNull, "is_null")
2315
+
2316
+ protected:
2317
+ virtual bool DataEquals(HValue* other) {
2318
+ HIsNull* b = HIsNull::cast(other);
2319
+ return is_strict_ == b->is_strict();
2320
+ }
2321
+
2322
+ private:
2323
+ bool is_strict_;
2324
+ };
2325
+
2326
+
2327
+ class HIsObject: public HUnaryPredicate {
2328
+ public:
2329
+ explicit HIsObject(HValue* value) : HUnaryPredicate(value) { }
2330
+
2331
+ DECLARE_CONCRETE_INSTRUCTION(IsObject, "is_object")
2332
+
2333
+ protected:
2334
+ virtual bool DataEquals(HValue* other) { return true; }
2335
+ };
2336
+
2337
+
2338
+ class HIsSmi: public HUnaryPredicate {
2339
+ public:
2340
+ explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { }
2341
+
2342
+ DECLARE_CONCRETE_INSTRUCTION(IsSmi, "is_smi")
2343
+
2344
+ protected:
2345
+ virtual bool DataEquals(HValue* other) { return true; }
2346
+ };
2347
+
2348
+
2349
+ class HIsConstructCall: public HTemplateInstruction<0> {
2350
+ public:
2351
+ HIsConstructCall() {
2352
+ set_representation(Representation::Tagged());
2353
+ SetFlag(kUseGVN);
2354
+ }
2355
+
2356
+ virtual bool EmitAtUses() const {
2357
+ return !HasSideEffects() && (uses()->length() <= 1);
2358
+ }
2359
+
2360
+ virtual Representation RequiredInputRepresentation(int index) const {
2361
+ return Representation::None();
2362
+ }
2363
+
2364
+ DECLARE_CONCRETE_INSTRUCTION(IsConstructCall, "is_construct_call")
2365
+
2366
+ protected:
2367
+ virtual bool DataEquals(HValue* other) { return true; }
2368
+ };
2369
+
2370
+
2371
+ class HHasInstanceType: public HUnaryPredicate {
2372
+ public:
2373
+ HHasInstanceType(HValue* value, InstanceType type)
2374
+ : HUnaryPredicate(value), from_(type), to_(type) { }
2375
+ HHasInstanceType(HValue* value, InstanceType from, InstanceType to)
2376
+ : HUnaryPredicate(value), from_(from), to_(to) {
2377
+ ASSERT(to == LAST_TYPE); // Others not implemented yet in backend.
2378
+ }
2379
+
2380
+ InstanceType from() { return from_; }
2381
+ InstanceType to() { return to_; }
2382
+
2383
+ virtual void PrintDataTo(StringStream* stream);
2384
+
2385
+ DECLARE_CONCRETE_INSTRUCTION(HasInstanceType, "has_instance_type")
2386
+
2387
+ protected:
2388
+ virtual bool DataEquals(HValue* other) {
2389
+ HHasInstanceType* b = HHasInstanceType::cast(other);
2390
+ return (from_ == b->from()) && (to_ == b->to());
2391
+ }
2392
+
2393
+ private:
2394
+ InstanceType from_;
2395
+ InstanceType to_; // Inclusive range, not all combinations work.
2396
+ };
2397
+
2398
+
2399
+ class HHasCachedArrayIndex: public HUnaryPredicate {
2400
+ public:
2401
+ explicit HHasCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2402
+
2403
+ DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex, "has_cached_array_index")
2404
+
2405
+ protected:
2406
+ virtual bool DataEquals(HValue* other) { return true; }
2407
+ };
2408
+
2409
+
2410
+ class HGetCachedArrayIndex: public HUnaryPredicate {
2411
+ public:
2412
+ explicit HGetCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2413
+
2414
+ DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get_cached_array_index")
2415
+
2416
+ protected:
2417
+ virtual bool DataEquals(HValue* other) { return true; }
2418
+ };
2419
+
2420
+
2421
+ class HClassOfTest: public HUnaryPredicate {
2422
+ public:
2423
+ HClassOfTest(HValue* value, Handle<String> class_name)
2424
+ : HUnaryPredicate(value), class_name_(class_name) { }
2425
+
2426
+ DECLARE_CONCRETE_INSTRUCTION(ClassOfTest, "class_of_test")
2427
+
2428
+ virtual void PrintDataTo(StringStream* stream);
2429
+
2430
+ Handle<String> class_name() const { return class_name_; }
2431
+
2432
+ protected:
2433
+ virtual bool DataEquals(HValue* other) {
2434
+ HClassOfTest* b = HClassOfTest::cast(other);
2435
+ return class_name_.is_identical_to(b->class_name_);
2436
+ }
2437
+
2438
+ private:
2439
+ Handle<String> class_name_;
2440
+ };
2441
+
2442
+
2443
+ class HTypeofIs: public HUnaryPredicate {
2444
+ public:
2445
+ HTypeofIs(HValue* value, Handle<String> type_literal)
2446
+ : HUnaryPredicate(value), type_literal_(type_literal) { }
2447
+
2448
+ Handle<String> type_literal() { return type_literal_; }
2449
+ virtual void PrintDataTo(StringStream* stream);
2450
+
2451
+ DECLARE_CONCRETE_INSTRUCTION(TypeofIs, "typeof_is")
2452
+
2453
+ protected:
2454
+ virtual bool DataEquals(HValue* other) {
2455
+ HTypeofIs* b = HTypeofIs::cast(other);
2456
+ return type_literal_.is_identical_to(b->type_literal_);
2457
+ }
2458
+
2459
+ private:
2460
+ Handle<String> type_literal_;
2461
+ };
2462
+
2463
+
2464
+ class HInstanceOf: public HTemplateInstruction<3> {
2465
+ public:
2466
+ HInstanceOf(HValue* context, HValue* left, HValue* right) {
2467
+ SetOperandAt(0, context);
2468
+ SetOperandAt(1, left);
2469
+ SetOperandAt(2, right);
2470
+ set_representation(Representation::Tagged());
2471
+ SetAllSideEffects();
2472
+ }
2473
+
2474
+ HValue* context() { return OperandAt(0); }
2475
+ HValue* left() { return OperandAt(1); }
2476
+ HValue* right() { return OperandAt(2); }
2477
+
2478
+ virtual bool EmitAtUses() const {
2479
+ return !HasSideEffects() && (uses()->length() <= 1);
2480
+ }
2481
+
2482
+ virtual Representation RequiredInputRepresentation(int index) const {
2483
+ return Representation::Tagged();
2484
+ }
2485
+
2486
+ virtual void PrintDataTo(StringStream* stream);
2487
+
2488
+ DECLARE_CONCRETE_INSTRUCTION(InstanceOf, "instance_of")
2489
+ };
2490
+
2491
+
2492
+ class HInstanceOfKnownGlobal: public HUnaryOperation {
2493
+ public:
2494
+ HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
2495
+ : HUnaryOperation(left), function_(right) {
2496
+ set_representation(Representation::Tagged());
2497
+ SetAllSideEffects();
2498
+ }
2499
+
2500
+ Handle<JSFunction> function() { return function_; }
2501
+
2502
+ virtual Representation RequiredInputRepresentation(int index) const {
2503
+ return Representation::Tagged();
2504
+ }
2505
+
2506
+ DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,
2507
+ "instance_of_known_global")
2508
+
2509
+ private:
2510
+ Handle<JSFunction> function_;
2511
+ };
2512
+
2513
+
2514
+ class HPower: public HBinaryOperation {
2515
+ public:
2516
+ HPower(HValue* left, HValue* right)
2517
+ : HBinaryOperation(left, right) {
2518
+ set_representation(Representation::Double());
2519
+ SetFlag(kUseGVN);
2520
+ }
2521
+
2522
+ virtual Representation RequiredInputRepresentation(int index) const {
2523
+ return (index == 1) ? Representation::None() : Representation::Double();
2524
+ }
2525
+
2526
+ DECLARE_CONCRETE_INSTRUCTION(Power, "power")
2527
+
2528
+ protected:
2529
+ virtual bool DataEquals(HValue* other) { return true; }
2530
+ };
2531
+
2532
+
2533
+ class HAdd: public HArithmeticBinaryOperation {
2534
+ public:
2535
+ HAdd(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2536
+ SetFlag(kCanOverflow);
2537
+ }
2538
+
2539
+ // Add is only commutative if two integer values are added and not if two
2540
+ // tagged values are added (because it might be a String concatenation).
2541
+ virtual bool IsCommutative() const {
2542
+ return !representation().IsTagged();
2543
+ }
2544
+
2545
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2546
+
2547
+ virtual HType CalculateInferredType();
2548
+
2549
+ DECLARE_CONCRETE_INSTRUCTION(Add, "add")
2550
+
2551
+ protected:
2552
+ virtual bool DataEquals(HValue* other) { return true; }
2553
+
2554
+ virtual Range* InferRange();
2555
+ };
2556
+
2557
+
2558
+ class HSub: public HArithmeticBinaryOperation {
2559
+ public:
2560
+ HSub(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2561
+ SetFlag(kCanOverflow);
2562
+ }
2563
+
2564
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2565
+
2566
+ DECLARE_CONCRETE_INSTRUCTION(Sub, "sub")
2567
+
2568
+ protected:
2569
+ virtual bool DataEquals(HValue* other) { return true; }
2570
+
2571
+ virtual Range* InferRange();
2572
+ };
2573
+
2574
+
2575
+ class HMul: public HArithmeticBinaryOperation {
2576
+ public:
2577
+ HMul(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2578
+ SetFlag(kCanOverflow);
2579
+ }
2580
+
2581
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2582
+
2583
+ // Only commutative if it is certain that not two objects are multiplicated.
2584
+ virtual bool IsCommutative() const {
2585
+ return !representation().IsTagged();
2586
+ }
2587
+
2588
+ DECLARE_CONCRETE_INSTRUCTION(Mul, "mul")
2589
+
2590
+ protected:
2591
+ virtual bool DataEquals(HValue* other) { return true; }
2592
+
2593
+ virtual Range* InferRange();
2594
+ };
2595
+
2596
+
2597
+ class HMod: public HArithmeticBinaryOperation {
2598
+ public:
2599
+ HMod(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2600
+ SetFlag(kCanBeDivByZero);
2601
+ }
2602
+
2603
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2604
+
2605
+ DECLARE_CONCRETE_INSTRUCTION(Mod, "mod")
2606
+
2607
+ protected:
2608
+ virtual bool DataEquals(HValue* other) { return true; }
2609
+
2610
+ virtual Range* InferRange();
2611
+ };
2612
+
2613
+
2614
+ class HDiv: public HArithmeticBinaryOperation {
2615
+ public:
2616
+ HDiv(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2617
+ SetFlag(kCanBeDivByZero);
2618
+ SetFlag(kCanOverflow);
2619
+ }
2620
+
2621
+ virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2622
+
2623
+ DECLARE_CONCRETE_INSTRUCTION(Div, "div")
2624
+
2625
+ protected:
2626
+ virtual bool DataEquals(HValue* other) { return true; }
2627
+
2628
+ virtual Range* InferRange();
2629
+ };
2630
+
2631
+
2632
+ class HBitAnd: public HBitwiseBinaryOperation {
2633
+ public:
2634
+ HBitAnd(HValue* left, HValue* right)
2635
+ : HBitwiseBinaryOperation(left, right) { }
2636
+
2637
+ virtual bool IsCommutative() const { return true; }
2638
+ virtual HType CalculateInferredType();
2639
+
2640
+ DECLARE_CONCRETE_INSTRUCTION(BitAnd, "bit_and")
2641
+
2642
+ protected:
2643
+ virtual bool DataEquals(HValue* other) { return true; }
2644
+
2645
+ virtual Range* InferRange();
2646
+ };
2647
+
2648
+
2649
+ class HBitXor: public HBitwiseBinaryOperation {
2650
+ public:
2651
+ HBitXor(HValue* left, HValue* right)
2652
+ : HBitwiseBinaryOperation(left, right) { }
2653
+
2654
+ virtual bool IsCommutative() const { return true; }
2655
+ virtual HType CalculateInferredType();
2656
+
2657
+ DECLARE_CONCRETE_INSTRUCTION(BitXor, "bit_xor")
2658
+
2659
+ protected:
2660
+ virtual bool DataEquals(HValue* other) { return true; }
2661
+ };
2662
+
2663
+
2664
+ class HBitOr: public HBitwiseBinaryOperation {
2665
+ public:
2666
+ HBitOr(HValue* left, HValue* right)
2667
+ : HBitwiseBinaryOperation(left, right) { }
2668
+
2669
+ virtual bool IsCommutative() const { return true; }
2670
+ virtual HType CalculateInferredType();
2671
+
2672
+ DECLARE_CONCRETE_INSTRUCTION(BitOr, "bit_or")
2673
+
2674
+ protected:
2675
+ virtual bool DataEquals(HValue* other) { return true; }
2676
+
2677
+ virtual Range* InferRange();
2678
+ };
2679
+
2680
+
2681
+ class HShl: public HBitwiseBinaryOperation {
2682
+ public:
2683
+ HShl(HValue* left, HValue* right)
2684
+ : HBitwiseBinaryOperation(left, right) { }
2685
+
2686
+ virtual Range* InferRange();
2687
+ virtual HType CalculateInferredType();
2688
+
2689
+ DECLARE_CONCRETE_INSTRUCTION(Shl, "shl")
2690
+
2691
+ protected:
2692
+ virtual bool DataEquals(HValue* other) { return true; }
2693
+ };
2694
+
2695
+
2696
+ class HShr: public HBitwiseBinaryOperation {
2697
+ public:
2698
+ HShr(HValue* left, HValue* right)
2699
+ : HBitwiseBinaryOperation(left, right) { }
2700
+
2701
+ virtual HType CalculateInferredType();
2702
+
2703
+ DECLARE_CONCRETE_INSTRUCTION(Shr, "shr")
2704
+
2705
+ protected:
2706
+ virtual bool DataEquals(HValue* other) { return true; }
2707
+ };
2708
+
2709
+
2710
+ class HSar: public HBitwiseBinaryOperation {
2711
+ public:
2712
+ HSar(HValue* left, HValue* right)
2713
+ : HBitwiseBinaryOperation(left, right) { }
2714
+
2715
+ virtual Range* InferRange();
2716
+ virtual HType CalculateInferredType();
2717
+
2718
+ DECLARE_CONCRETE_INSTRUCTION(Sar, "sar")
2719
+
2720
+ protected:
2721
+ virtual bool DataEquals(HValue* other) { return true; }
2722
+ };
2723
+
2724
+
2725
+ class HOsrEntry: public HTemplateInstruction<0> {
2726
+ public:
2727
+ explicit HOsrEntry(int ast_id) : ast_id_(ast_id) {
2728
+ SetFlag(kChangesOsrEntries);
2729
+ }
2730
+
2731
+ int ast_id() const { return ast_id_; }
2732
+
2733
+ virtual Representation RequiredInputRepresentation(int index) const {
2734
+ return Representation::None();
2735
+ }
2736
+
2737
+ DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr_entry")
2738
+
2739
+ private:
2740
+ int ast_id_;
2741
+ };
2742
+
2743
+
2744
+ class HParameter: public HTemplateInstruction<0> {
2745
+ public:
2746
+ explicit HParameter(unsigned index) : index_(index) {
2747
+ set_representation(Representation::Tagged());
2748
+ }
2749
+
2750
+ unsigned index() const { return index_; }
2751
+
2752
+ virtual void PrintDataTo(StringStream* stream);
2753
+
2754
+ virtual Representation RequiredInputRepresentation(int index) const {
2755
+ return Representation::None();
2756
+ }
2757
+
2758
+ DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter")
2759
+
2760
+ private:
2761
+ unsigned index_;
2762
+ };
2763
+
2764
+
2765
+ class HCallStub: public HUnaryCall {
2766
+ public:
2767
+ HCallStub(HValue* context, CodeStub::Major major_key, int argument_count)
2768
+ : HUnaryCall(context, argument_count),
2769
+ major_key_(major_key),
2770
+ transcendental_type_(TranscendentalCache::kNumberOfCaches) {
2771
+ }
2772
+
2773
+ CodeStub::Major major_key() { return major_key_; }
2774
+
2775
+ HValue* context() { return value(); }
2776
+
2777
+ void set_transcendental_type(TranscendentalCache::Type transcendental_type) {
2778
+ transcendental_type_ = transcendental_type;
2779
+ }
2780
+ TranscendentalCache::Type transcendental_type() {
2781
+ return transcendental_type_;
2782
+ }
2783
+
2784
+ virtual void PrintDataTo(StringStream* stream);
2785
+
2786
+ virtual Representation RequiredInputRepresentation(int index) const {
2787
+ return Representation::Tagged();
2788
+ }
2789
+
2790
+ DECLARE_CONCRETE_INSTRUCTION(CallStub, "call_stub")
2791
+
2792
+ private:
2793
+ CodeStub::Major major_key_;
2794
+ TranscendentalCache::Type transcendental_type_;
2795
+ };
2796
+
2797
+
2798
+ class HUnknownOSRValue: public HTemplateInstruction<0> {
2799
+ public:
2800
+ HUnknownOSRValue() { set_representation(Representation::Tagged()); }
2801
+
2802
+ virtual Representation RequiredInputRepresentation(int index) const {
2803
+ return Representation::None();
2804
+ }
2805
+
2806
+ DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown_osr_value")
2807
+ };
2808
+
2809
+
2810
+ class HLoadGlobal: public HTemplateInstruction<0> {
2811
+ public:
2812
+ HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value)
2813
+ : cell_(cell), check_hole_value_(check_hole_value) {
2814
+ set_representation(Representation::Tagged());
2815
+ SetFlag(kUseGVN);
2816
+ SetFlag(kDependsOnGlobalVars);
2817
+ }
2818
+
2819
+ Handle<JSGlobalPropertyCell> cell() const { return cell_; }
2820
+ bool check_hole_value() const { return check_hole_value_; }
2821
+
2822
+ virtual void PrintDataTo(StringStream* stream);
2823
+
2824
+ virtual intptr_t Hashcode() {
2825
+ ASSERT(!Heap::allow_allocation(false));
2826
+ return reinterpret_cast<intptr_t>(*cell_);
2827
+ }
2828
+
2829
+ virtual Representation RequiredInputRepresentation(int index) const {
2830
+ return Representation::None();
2831
+ }
2832
+
2833
+ DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load_global")
2834
+
2835
+ protected:
2836
+ virtual bool DataEquals(HValue* other) {
2837
+ HLoadGlobal* b = HLoadGlobal::cast(other);
2838
+ return cell_.is_identical_to(b->cell());
2839
+ }
2840
+
2841
+ private:
2842
+ Handle<JSGlobalPropertyCell> cell_;
2843
+ bool check_hole_value_;
2844
+ };
2845
+
2846
+
2847
+ class HStoreGlobal: public HUnaryOperation {
2848
+ public:
2849
+ HStoreGlobal(HValue* value,
2850
+ Handle<JSGlobalPropertyCell> cell,
2851
+ bool check_hole_value)
2852
+ : HUnaryOperation(value),
2853
+ cell_(cell),
2854
+ check_hole_value_(check_hole_value) {
2855
+ SetFlag(kChangesGlobalVars);
2856
+ }
2857
+
2858
+ Handle<JSGlobalPropertyCell> cell() const { return cell_; }
2859
+ bool check_hole_value() const { return check_hole_value_; }
2860
+
2861
+ virtual Representation RequiredInputRepresentation(int index) const {
2862
+ return Representation::Tagged();
2863
+ }
2864
+ virtual void PrintDataTo(StringStream* stream);
2865
+
2866
+ DECLARE_CONCRETE_INSTRUCTION(StoreGlobal, "store_global")
2867
+
2868
+ private:
2869
+ Handle<JSGlobalPropertyCell> cell_;
2870
+ bool check_hole_value_;
2871
+ };
2872
+
2873
+
2874
+ class HLoadContextSlot: public HUnaryOperation {
2875
+ public:
2876
+ HLoadContextSlot(HValue* context , int slot_index)
2877
+ : HUnaryOperation(context), slot_index_(slot_index) {
2878
+ set_representation(Representation::Tagged());
2879
+ SetFlag(kUseGVN);
2880
+ SetFlag(kDependsOnContextSlots);
2881
+ }
2882
+
2883
+ int slot_index() const { return slot_index_; }
2884
+
2885
+ virtual Representation RequiredInputRepresentation(int index) const {
2886
+ return Representation::Tagged();
2887
+ }
2888
+
2889
+ virtual void PrintDataTo(StringStream* stream);
2890
+
2891
+ DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load_context_slot")
2892
+
2893
+ protected:
2894
+ virtual bool DataEquals(HValue* other) {
2895
+ HLoadContextSlot* b = HLoadContextSlot::cast(other);
2896
+ return (slot_index() == b->slot_index());
2897
+ }
2898
+
2899
+ private:
2900
+ int slot_index_;
2901
+ };
2902
+
2903
+
2904
+ static inline bool StoringValueNeedsWriteBarrier(HValue* value) {
2905
+ return !value->type().IsSmi() &&
2906
+ !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
2907
+ }
2908
+
2909
+
2910
+ class HStoreContextSlot: public HBinaryOperation {
2911
+ public:
2912
+ HStoreContextSlot(HValue* context, int slot_index, HValue* value)
2913
+ : HBinaryOperation(context, value), slot_index_(slot_index) {
2914
+ SetFlag(kChangesContextSlots);
2915
+ }
2916
+
2917
+ HValue* context() { return OperandAt(0); }
2918
+ HValue* value() { return OperandAt(1); }
2919
+ int slot_index() const { return slot_index_; }
2920
+
2921
+ bool NeedsWriteBarrier() {
2922
+ return StoringValueNeedsWriteBarrier(value());
2923
+ }
2924
+
2925
+ virtual Representation RequiredInputRepresentation(int index) const {
2926
+ return Representation::Tagged();
2927
+ }
2928
+
2929
+ virtual void PrintDataTo(StringStream* stream);
2930
+
2931
+ DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store_context_slot")
2932
+
2933
+ private:
2934
+ int slot_index_;
2935
+ };
2936
+
2937
+
2938
+ class HLoadNamedField: public HUnaryOperation {
2939
+ public:
2940
+ HLoadNamedField(HValue* object, bool is_in_object, int offset)
2941
+ : HUnaryOperation(object),
2942
+ is_in_object_(is_in_object),
2943
+ offset_(offset) {
2944
+ set_representation(Representation::Tagged());
2945
+ SetFlag(kUseGVN);
2946
+ if (is_in_object) {
2947
+ SetFlag(kDependsOnInobjectFields);
2948
+ } else {
2949
+ SetFlag(kDependsOnBackingStoreFields);
2950
+ }
2951
+ }
2952
+
2953
+ HValue* object() { return OperandAt(0); }
2954
+ bool is_in_object() const { return is_in_object_; }
2955
+ int offset() const { return offset_; }
2956
+
2957
+ virtual Representation RequiredInputRepresentation(int index) const {
2958
+ return Representation::Tagged();
2959
+ }
2960
+ virtual void PrintDataTo(StringStream* stream);
2961
+
2962
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load_named_field")
2963
+
2964
+ protected:
2965
+ virtual bool DataEquals(HValue* other) {
2966
+ HLoadNamedField* b = HLoadNamedField::cast(other);
2967
+ return is_in_object_ == b->is_in_object_ && offset_ == b->offset_;
2968
+ }
2969
+
2970
+ private:
2971
+ bool is_in_object_;
2972
+ int offset_;
2973
+ };
2974
+
2975
+
2976
+ class HLoadNamedGeneric: public HBinaryOperation {
2977
+ public:
2978
+ HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
2979
+ : HBinaryOperation(context, object), name_(name) {
2980
+ set_representation(Representation::Tagged());
2981
+ SetAllSideEffects();
2982
+ }
2983
+
2984
+ HValue* context() { return OperandAt(0); }
2985
+ HValue* object() { return OperandAt(1); }
2986
+ Handle<Object> name() const { return name_; }
2987
+
2988
+ virtual Representation RequiredInputRepresentation(int index) const {
2989
+ return Representation::Tagged();
2990
+ }
2991
+
2992
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric, "load_named_generic")
2993
+
2994
+ private:
2995
+ Handle<Object> name_;
2996
+ };
2997
+
2998
+
2999
+ class HLoadFunctionPrototype: public HUnaryOperation {
3000
+ public:
3001
+ explicit HLoadFunctionPrototype(HValue* function)
3002
+ : HUnaryOperation(function) {
3003
+ set_representation(Representation::Tagged());
3004
+ SetFlag(kUseGVN);
3005
+ SetFlag(kDependsOnCalls);
3006
+ }
3007
+
3008
+ HValue* function() { return OperandAt(0); }
3009
+
3010
+ virtual Representation RequiredInputRepresentation(int index) const {
3011
+ return Representation::Tagged();
3012
+ }
3013
+
3014
+ DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load_function_prototype")
3015
+
3016
+ protected:
3017
+ virtual bool DataEquals(HValue* other) { return true; }
3018
+ };
3019
+
3020
+
3021
+ class HLoadKeyedFastElement: public HBinaryOperation {
3022
+ public:
3023
+ HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) {
3024
+ set_representation(Representation::Tagged());
3025
+ SetFlag(kDependsOnArrayElements);
3026
+ SetFlag(kUseGVN);
3027
+ }
3028
+
3029
+ HValue* object() { return OperandAt(0); }
3030
+ HValue* key() { return OperandAt(1); }
3031
+
3032
+ virtual Representation RequiredInputRepresentation(int index) const {
3033
+ // The key is supposed to be Integer32.
3034
+ return (index == 1) ? Representation::Integer32()
3035
+ : Representation::Tagged();
3036
+ }
3037
+
3038
+ virtual void PrintDataTo(StringStream* stream);
3039
+
3040
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement,
3041
+ "load_keyed_fast_element")
3042
+
3043
+ protected:
3044
+ virtual bool DataEquals(HValue* other) { return true; }
3045
+ };
3046
+
3047
+
3048
+ class HLoadPixelArrayElement: public HBinaryOperation {
3049
+ public:
3050
+ HLoadPixelArrayElement(HValue* external_elements, HValue* key)
3051
+ : HBinaryOperation(external_elements, key) {
3052
+ set_representation(Representation::Integer32());
3053
+ SetFlag(kDependsOnPixelArrayElements);
3054
+ // Native code could change the pixel array.
3055
+ SetFlag(kDependsOnCalls);
3056
+ SetFlag(kUseGVN);
3057
+ }
3058
+
3059
+ virtual void PrintDataTo(StringStream* stream);
3060
+
3061
+ virtual Representation RequiredInputRepresentation(int index) const {
3062
+ // The key is supposed to be Integer32, but the base pointer
3063
+ // for the element load is a naked pointer.
3064
+ return (index == 1) ? Representation::Integer32()
3065
+ : Representation::External();
3066
+ }
3067
+
3068
+ HValue* external_pointer() { return OperandAt(0); }
3069
+ HValue* key() { return OperandAt(1); }
3070
+
3071
+ DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement,
3072
+ "load_pixel_array_element")
3073
+
3074
+ protected:
3075
+ virtual bool DataEquals(HValue* other) { return true; }
3076
+ };
3077
+
3078
+
3079
+ class HLoadKeyedGeneric: public HTemplateInstruction<3> {
3080
+ public:
3081
+ HLoadKeyedGeneric(HContext* context, HValue* obj, HValue* key) {
3082
+ set_representation(Representation::Tagged());
3083
+ SetOperandAt(0, obj);
3084
+ SetOperandAt(1, key);
3085
+ SetOperandAt(2, context);
3086
+ SetAllSideEffects();
3087
+ }
3088
+
3089
+ HValue* object() { return OperandAt(0); }
3090
+ HValue* key() { return OperandAt(1); }
3091
+ HValue* context() { return OperandAt(2); }
3092
+
3093
+ virtual void PrintDataTo(StringStream* stream);
3094
+
3095
+ virtual Representation RequiredInputRepresentation(int index) const {
3096
+ return Representation::Tagged();
3097
+ }
3098
+
3099
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric, "load_keyed_generic")
3100
+ };
3101
+
3102
+
3103
+ class HStoreNamedField: public HBinaryOperation {
3104
+ public:
3105
+ HStoreNamedField(HValue* obj,
3106
+ Handle<String> name,
3107
+ HValue* val,
3108
+ bool in_object,
3109
+ int offset)
3110
+ : HBinaryOperation(obj, val),
3111
+ name_(name),
3112
+ is_in_object_(in_object),
3113
+ offset_(offset) {
3114
+ if (is_in_object_) {
3115
+ SetFlag(kChangesInobjectFields);
3116
+ } else {
3117
+ SetFlag(kChangesBackingStoreFields);
3118
+ }
3119
+ }
3120
+
3121
+ DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store_named_field")
3122
+
3123
+ virtual Representation RequiredInputRepresentation(int index) const {
3124
+ return Representation::Tagged();
3125
+ }
3126
+ virtual void PrintDataTo(StringStream* stream);
3127
+
3128
+ HValue* object() { return OperandAt(0); }
3129
+ HValue* value() { return OperandAt(1); }
3130
+
3131
+ Handle<String> name() const { return name_; }
3132
+ bool is_in_object() const { return is_in_object_; }
3133
+ int offset() const { return offset_; }
3134
+ Handle<Map> transition() const { return transition_; }
3135
+ void set_transition(Handle<Map> map) { transition_ = map; }
3136
+
3137
+ bool NeedsWriteBarrier() {
3138
+ return StoringValueNeedsWriteBarrier(value());
3139
+ }
3140
+
3141
+ private:
3142
+ Handle<String> name_;
3143
+ bool is_in_object_;
3144
+ int offset_;
3145
+ Handle<Map> transition_;
3146
+ };
3147
+
3148
+
3149
+ class HStoreNamedGeneric: public HTemplateInstruction<3> {
3150
+ public:
3151
+ HStoreNamedGeneric(HValue* context,
3152
+ HValue* object,
3153
+ Handle<String> name,
3154
+ HValue* value)
3155
+ : name_(name) {
3156
+ SetOperandAt(0, object);
3157
+ SetOperandAt(1, value);
3158
+ SetOperandAt(2, context);
3159
+ SetAllSideEffects();
3160
+ }
3161
+
3162
+ HValue* object() { return OperandAt(0); }
3163
+ HValue* value() { return OperandAt(1); }
3164
+ HValue* context() { return OperandAt(2); }
3165
+ Handle<String> name() { return name_; }
3166
+
3167
+ virtual void PrintDataTo(StringStream* stream);
3168
+
3169
+ virtual Representation RequiredInputRepresentation(int index) const {
3170
+ return Representation::Tagged();
3171
+ }
3172
+
3173
+ DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric, "store_named_generic")
3174
+
3175
+ private:
3176
+ Handle<String> name_;
3177
+ };
3178
+
3179
+
3180
+ class HStoreKeyedFastElement: public HTemplateInstruction<3> {
3181
+ public:
3182
+ HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) {
3183
+ SetOperandAt(0, obj);
3184
+ SetOperandAt(1, key);
3185
+ SetOperandAt(2, val);
3186
+ SetFlag(kChangesArrayElements);
3187
+ }
3188
+
3189
+ virtual Representation RequiredInputRepresentation(int index) const {
3190
+ // The key is supposed to be Integer32.
3191
+ return (index == 1) ? Representation::Integer32()
3192
+ : Representation::Tagged();
3193
+ }
3194
+
3195
+ HValue* object() { return OperandAt(0); }
3196
+ HValue* key() { return OperandAt(1); }
3197
+ HValue* value() { return OperandAt(2); }
3198
+
3199
+ bool NeedsWriteBarrier() {
3200
+ return StoringValueNeedsWriteBarrier(value());
3201
+ }
3202
+
3203
+ virtual void PrintDataTo(StringStream* stream);
3204
+
3205
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement,
3206
+ "store_keyed_fast_element")
3207
+ };
3208
+
3209
+
3210
+ class HStorePixelArrayElement: public HTemplateInstruction<3> {
3211
+ public:
3212
+ HStorePixelArrayElement(HValue* external_elements, HValue* key, HValue* val) {
3213
+ SetFlag(kChangesPixelArrayElements);
3214
+ SetOperandAt(0, external_elements);
3215
+ SetOperandAt(1, key);
3216
+ SetOperandAt(2, val);
3217
+ }
3218
+
3219
+ virtual void PrintDataTo(StringStream* stream);
3220
+
3221
+ virtual Representation RequiredInputRepresentation(int index) const {
3222
+ if (index == 0) {
3223
+ return Representation::External();
3224
+ } else {
3225
+ return Representation::Integer32();
3226
+ }
3227
+ }
3228
+
3229
+ HValue* external_pointer() { return OperandAt(0); }
3230
+ HValue* key() { return OperandAt(1); }
3231
+ HValue* value() { return OperandAt(2); }
3232
+
3233
+ DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement,
3234
+ "store_pixel_array_element")
3235
+ };
3236
+
3237
+
3238
+ class HStoreKeyedGeneric: public HTemplateInstruction<4> {
3239
+ public:
3240
+ HStoreKeyedGeneric(HValue* context,
3241
+ HValue* object,
3242
+ HValue* key,
3243
+ HValue* value) {
3244
+ SetOperandAt(0, object);
3245
+ SetOperandAt(1, key);
3246
+ SetOperandAt(2, value);
3247
+ SetOperandAt(3, context);
3248
+ SetAllSideEffects();
3249
+ }
3250
+
3251
+ HValue* object() { return OperandAt(0); }
3252
+ HValue* key() { return OperandAt(1); }
3253
+ HValue* value() { return OperandAt(2); }
3254
+ HValue* context() { return OperandAt(3); }
3255
+
3256
+ virtual Representation RequiredInputRepresentation(int index) const {
3257
+ return Representation::Tagged();
3258
+ }
3259
+
3260
+ virtual void PrintDataTo(StringStream* stream);
3261
+
3262
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric, "store_keyed_generic")
3263
+ };
3264
+
3265
+
3266
+ class HStringCharCodeAt: public HBinaryOperation {
3267
+ public:
3268
+ HStringCharCodeAt(HValue* string, HValue* index)
3269
+ : HBinaryOperation(string, index) {
3270
+ set_representation(Representation::Integer32());
3271
+ SetFlag(kUseGVN);
3272
+ }
3273
+
3274
+ virtual Representation RequiredInputRepresentation(int index) const {
3275
+ // The index is supposed to be Integer32.
3276
+ return (index == 1) ? Representation::Integer32()
3277
+ : Representation::Tagged();
3278
+ }
3279
+
3280
+ HValue* string() { return OperandAt(0); }
3281
+ HValue* index() { return OperandAt(1); }
3282
+
3283
+ DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string_char_code_at")
3284
+
3285
+ protected:
3286
+ virtual bool DataEquals(HValue* other) { return true; }
3287
+
3288
+ virtual Range* InferRange() {
3289
+ return new Range(0, String::kMaxUC16CharCode);
3290
+ }
3291
+ };
3292
+
3293
+
3294
+ class HStringLength: public HUnaryOperation {
3295
+ public:
3296
+ explicit HStringLength(HValue* string) : HUnaryOperation(string) {
3297
+ set_representation(Representation::Tagged());
3298
+ SetFlag(kUseGVN);
3299
+ }
3300
+
3301
+ virtual Representation RequiredInputRepresentation(int index) const {
3302
+ return Representation::Tagged();
3303
+ }
3304
+
3305
+ virtual HType CalculateInferredType() {
3306
+ STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
3307
+ return HType::Smi();
3308
+ }
3309
+
3310
+ DECLARE_CONCRETE_INSTRUCTION(StringLength, "string_length")
3311
+
3312
+ protected:
3313
+ virtual bool DataEquals(HValue* other) { return true; }
3314
+
3315
+ virtual Range* InferRange() {
3316
+ return new Range(0, String::kMaxLength);
3317
+ }
3318
+ };
3319
+
3320
+
3321
+ template <int V>
3322
+ class HMaterializedLiteral: public HTemplateInstruction<V> {
3323
+ public:
3324
+ HMaterializedLiteral<V>(int index, int depth)
3325
+ : literal_index_(index), depth_(depth) {
3326
+ this->set_representation(Representation::Tagged());
3327
+ }
3328
+
3329
+ int literal_index() const { return literal_index_; }
3330
+ int depth() const { return depth_; }
3331
+
3332
+ private:
3333
+ int literal_index_;
3334
+ int depth_;
3335
+ };
3336
+
3337
+
3338
+ class HArrayLiteral: public HMaterializedLiteral<0> {
3339
+ public:
3340
+ HArrayLiteral(Handle<FixedArray> constant_elements,
3341
+ int length,
3342
+ int literal_index,
3343
+ int depth)
3344
+ : HMaterializedLiteral<0>(literal_index, depth),
3345
+ length_(length),
3346
+ constant_elements_(constant_elements) {}
3347
+
3348
+ Handle<FixedArray> constant_elements() const { return constant_elements_; }
3349
+ int length() const { return length_; }
3350
+
3351
+ bool IsCopyOnWrite() const;
3352
+
3353
+ virtual Representation RequiredInputRepresentation(int index) const {
3354
+ return Representation::None();
3355
+ }
3356
+
3357
+ DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral, "array_literal")
3358
+
3359
+ private:
3360
+ int length_;
3361
+ Handle<FixedArray> constant_elements_;
3362
+ };
3363
+
3364
+
3365
+ class HObjectLiteral: public HMaterializedLiteral<1> {
3366
+ public:
3367
+ HObjectLiteral(HValue* context,
3368
+ Handle<FixedArray> constant_properties,
3369
+ bool fast_elements,
3370
+ int literal_index,
3371
+ int depth)
3372
+ : HMaterializedLiteral<1>(literal_index, depth),
3373
+ constant_properties_(constant_properties),
3374
+ fast_elements_(fast_elements) {
3375
+ SetOperandAt(0, context);
3376
+ }
3377
+
3378
+ HValue* context() { return OperandAt(0); }
3379
+ Handle<FixedArray> constant_properties() const {
3380
+ return constant_properties_;
3381
+ }
3382
+ bool fast_elements() const { return fast_elements_; }
3383
+
3384
+ virtual Representation RequiredInputRepresentation(int index) const {
3385
+ return Representation::Tagged();
3386
+ }
3387
+
3388
+ DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral, "object_literal")
3389
+
3390
+ private:
3391
+ Handle<FixedArray> constant_properties_;
3392
+ bool fast_elements_;
3393
+ };
3394
+
3395
+
3396
+ class HRegExpLiteral: public HMaterializedLiteral<0> {
3397
+ public:
3398
+ HRegExpLiteral(Handle<String> pattern,
3399
+ Handle<String> flags,
3400
+ int literal_index)
3401
+ : HMaterializedLiteral<0>(literal_index, 0),
3402
+ pattern_(pattern),
3403
+ flags_(flags) { }
3404
+
3405
+ Handle<String> pattern() { return pattern_; }
3406
+ Handle<String> flags() { return flags_; }
3407
+
3408
+ virtual Representation RequiredInputRepresentation(int index) const {
3409
+ return Representation::None();
3410
+ }
3411
+
3412
+ DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral, "regexp_literal")
3413
+
3414
+ private:
3415
+ Handle<String> pattern_;
3416
+ Handle<String> flags_;
3417
+ };
3418
+
3419
+
3420
+ class HFunctionLiteral: public HTemplateInstruction<0> {
3421
+ public:
3422
+ HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure)
3423
+ : shared_info_(shared), pretenure_(pretenure) {
3424
+ set_representation(Representation::Tagged());
3425
+ }
3426
+
3427
+ virtual Representation RequiredInputRepresentation(int index) const {
3428
+ return Representation::None();
3429
+ }
3430
+
3431
+ DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral, "function_literal")
3432
+
3433
+ Handle<SharedFunctionInfo> shared_info() const { return shared_info_; }
3434
+ bool pretenure() const { return pretenure_; }
3435
+
3436
+ private:
3437
+ Handle<SharedFunctionInfo> shared_info_;
3438
+ bool pretenure_;
3439
+ };
3440
+
3441
+
3442
+ class HTypeof: public HUnaryOperation {
3443
+ public:
3444
+ explicit HTypeof(HValue* value) : HUnaryOperation(value) {
3445
+ set_representation(Representation::Tagged());
3446
+ }
3447
+
3448
+ virtual Representation RequiredInputRepresentation(int index) const {
3449
+ return Representation::Tagged();
3450
+ }
3451
+
3452
+ DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof")
3453
+ };
3454
+
3455
+
3456
+ class HValueOf: public HUnaryOperation {
3457
+ public:
3458
+ explicit HValueOf(HValue* value) : HUnaryOperation(value) {
3459
+ set_representation(Representation::Tagged());
3460
+ }
3461
+
3462
+ virtual Representation RequiredInputRepresentation(int index) const {
3463
+ return Representation::Tagged();
3464
+ }
3465
+
3466
+ DECLARE_CONCRETE_INSTRUCTION(ValueOf, "value_of")
3467
+ };
3468
+
3469
+
3470
+ class HDeleteProperty: public HBinaryOperation {
3471
+ public:
3472
+ HDeleteProperty(HValue* obj, HValue* key)
3473
+ : HBinaryOperation(obj, key) {
3474
+ set_representation(Representation::Tagged());
3475
+ SetAllSideEffects();
3476
+ }
3477
+
3478
+ virtual Representation RequiredInputRepresentation(int index) const {
3479
+ return Representation::Tagged();
3480
+ }
3481
+
3482
+ DECLARE_CONCRETE_INSTRUCTION(DeleteProperty, "delete_property")
3483
+
3484
+ HValue* object() { return left(); }
3485
+ HValue* key() { return right(); }
3486
+ };
3487
+
3488
+ #undef DECLARE_INSTRUCTION
3489
+ #undef DECLARE_CONCRETE_INSTRUCTION
3490
+
3491
+ } } // namespace v8::internal
3492
+
3493
+ #endif // V8_HYDROGEN_INSTRUCTIONS_H_