libv8 3.3.10.4 → 3.5.10.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. data/lib/libv8/scons/CHANGES.txt +24 -231
  2. data/lib/libv8/scons/LICENSE.txt +1 -1
  3. data/lib/libv8/scons/MANIFEST +0 -1
  4. data/lib/libv8/scons/PKG-INFO +1 -1
  5. data/lib/libv8/scons/README.txt +9 -9
  6. data/lib/libv8/scons/RELEASE.txt +75 -77
  7. data/lib/libv8/scons/engine/SCons/Action.py +6 -22
  8. data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
  9. data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
  10. data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
  11. data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
  12. data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
  13. data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
  14. data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
  15. data/lib/libv8/scons/engine/SCons/Job.py +2 -2
  16. data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
  17. data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
  18. data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
  19. data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
  20. data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
  21. data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
  22. data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
  23. data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
  24. data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
  25. data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
  26. data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
  27. data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
  28. data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
  29. data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
  30. data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
  31. data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
  32. data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
  33. data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
  34. data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
  35. data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
  36. data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
  37. data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
  38. data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
  39. data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
  40. data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
  41. data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
  42. data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
  43. data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
  44. data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
  45. data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
  46. data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
  47. data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
  48. data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
  49. data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
  50. data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
  51. data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
  52. data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
  53. data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
  54. data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
  55. data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
  56. data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
  57. data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
  58. data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
  59. data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
  60. data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
  61. data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
  62. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
  63. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
  64. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
  65. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
  66. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
  67. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
  68. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
  69. data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
  70. data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
  71. data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
  72. data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
  73. data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
  74. data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
  75. data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
  76. data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
  77. data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
  78. data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
  79. data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
  80. data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
  81. data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
  82. data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
  83. data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
  84. data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
  85. data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
  86. data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
  87. data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
  88. data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
  89. data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
  90. data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
  91. data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
  92. data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
  93. data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
  94. data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
  95. data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
  96. data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
  97. data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
  98. data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
  99. data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
  100. data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
  101. data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
  102. data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
  103. data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
  104. data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
  105. data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
  106. data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
  107. data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
  108. data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
  109. data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
  110. data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
  111. data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
  112. data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
  113. data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
  114. data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
  115. data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
  116. data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
  117. data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
  118. data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
  119. data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
  120. data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
  121. data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
  122. data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
  123. data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
  124. data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
  125. data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
  126. data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
  127. data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
  128. data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
  129. data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
  130. data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
  131. data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
  132. data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
  133. data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
  134. data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
  135. data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
  136. data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
  137. data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
  138. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
  139. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
  140. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
  141. data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
  142. data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
  143. data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
  144. data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
  145. data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
  146. data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
  147. data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
  148. data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
  149. data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
  150. data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
  151. data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
  152. data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
  153. data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
  154. data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
  155. data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
  156. data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
  157. data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
  158. data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
  159. data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
  160. data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
  161. data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
  162. data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
  163. data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
  164. data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
  165. data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
  166. data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
  167. data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
  168. data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
  169. data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
  170. data/lib/libv8/scons/engine/SCons/Util.py +3 -3
  171. data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
  172. data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
  173. data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
  174. data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
  175. data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
  176. data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
  177. data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
  178. data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
  179. data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
  180. data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
  181. data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
  182. data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
  183. data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
  184. data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
  185. data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
  186. data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
  187. data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
  188. data/lib/libv8/scons/scons-time.1 +3 -3
  189. data/lib/libv8/scons/scons.1 +1164 -1170
  190. data/lib/libv8/scons/sconsign.1 +3 -3
  191. data/lib/libv8/scons/script/scons +22 -22
  192. data/lib/libv8/scons/script/scons-time +2 -2
  193. data/lib/libv8/scons/script/scons.bat +4 -7
  194. data/lib/libv8/scons/script/sconsign +20 -21
  195. data/lib/libv8/scons/setup.cfg +1 -0
  196. data/lib/libv8/scons/setup.py +40 -38
  197. data/lib/libv8/v8/.gitignore +1 -1
  198. data/lib/libv8/v8/AUTHORS +2 -0
  199. data/lib/libv8/v8/ChangeLog +387 -0
  200. data/lib/libv8/v8/Makefile +171 -0
  201. data/lib/libv8/v8/SConstruct +124 -51
  202. data/lib/libv8/v8/build/README.txt +31 -14
  203. data/lib/libv8/v8/build/all.gyp +11 -4
  204. data/lib/libv8/v8/build/armu.gypi +6 -2
  205. data/lib/libv8/v8/build/common.gypi +240 -94
  206. data/lib/libv8/v8/build/gyp_v8 +32 -4
  207. data/lib/libv8/v8/build/standalone.gypi +200 -0
  208. data/lib/libv8/v8/include/v8-debug.h +0 -0
  209. data/lib/libv8/v8/include/v8-profiler.h +8 -11
  210. data/lib/libv8/v8/include/v8.h +191 -108
  211. data/lib/libv8/v8/preparser/SConscript +2 -2
  212. data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
  213. data/lib/libv8/v8/preparser/preparser.gyp +42 -0
  214. data/lib/libv8/v8/src/SConscript +33 -8
  215. data/lib/libv8/v8/src/accessors.cc +77 -43
  216. data/lib/libv8/v8/src/api.cc +393 -191
  217. data/lib/libv8/v8/src/api.h +4 -8
  218. data/lib/libv8/v8/src/apinatives.js +15 -3
  219. data/lib/libv8/v8/src/arguments.h +8 -0
  220. data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
  221. data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
  222. data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
  223. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
  224. data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
  225. data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
  226. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
  227. data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
  228. data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
  229. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
  230. data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
  231. data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
  232. data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
  233. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
  234. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
  235. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
  236. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
  237. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
  238. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
  239. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
  240. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
  241. data/lib/libv8/v8/src/array.js +38 -18
  242. data/lib/libv8/v8/src/assembler.cc +12 -5
  243. data/lib/libv8/v8/src/assembler.h +15 -9
  244. data/lib/libv8/v8/src/ast-inl.h +34 -25
  245. data/lib/libv8/v8/src/ast.cc +141 -72
  246. data/lib/libv8/v8/src/ast.h +255 -181
  247. data/lib/libv8/v8/src/bignum.cc +3 -4
  248. data/lib/libv8/v8/src/bootstrapper.cc +55 -11
  249. data/lib/libv8/v8/src/bootstrapper.h +3 -2
  250. data/lib/libv8/v8/src/builtins.cc +8 -2
  251. data/lib/libv8/v8/src/builtins.h +4 -0
  252. data/lib/libv8/v8/src/cached-powers.cc +8 -4
  253. data/lib/libv8/v8/src/checks.h +3 -3
  254. data/lib/libv8/v8/src/code-stubs.cc +173 -28
  255. data/lib/libv8/v8/src/code-stubs.h +104 -148
  256. data/lib/libv8/v8/src/codegen.cc +8 -8
  257. data/lib/libv8/v8/src/compilation-cache.cc +2 -47
  258. data/lib/libv8/v8/src/compilation-cache.h +0 -10
  259. data/lib/libv8/v8/src/compiler.cc +27 -16
  260. data/lib/libv8/v8/src/compiler.h +13 -18
  261. data/lib/libv8/v8/src/contexts.cc +107 -72
  262. data/lib/libv8/v8/src/contexts.h +70 -34
  263. data/lib/libv8/v8/src/conversions-inl.h +572 -14
  264. data/lib/libv8/v8/src/conversions.cc +9 -707
  265. data/lib/libv8/v8/src/conversions.h +23 -12
  266. data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
  267. data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
  268. data/lib/libv8/v8/src/cpu-profiler.h +8 -17
  269. data/lib/libv8/v8/src/d8-debug.cc +5 -3
  270. data/lib/libv8/v8/src/d8-debug.h +6 -7
  271. data/lib/libv8/v8/src/d8-posix.cc +1 -10
  272. data/lib/libv8/v8/src/d8.cc +721 -219
  273. data/lib/libv8/v8/src/d8.gyp +37 -12
  274. data/lib/libv8/v8/src/d8.h +141 -19
  275. data/lib/libv8/v8/src/d8.js +17 -8
  276. data/lib/libv8/v8/src/date.js +16 -5
  277. data/lib/libv8/v8/src/dateparser-inl.h +242 -39
  278. data/lib/libv8/v8/src/dateparser.cc +38 -4
  279. data/lib/libv8/v8/src/dateparser.h +170 -28
  280. data/lib/libv8/v8/src/debug-agent.cc +5 -3
  281. data/lib/libv8/v8/src/debug-agent.h +11 -7
  282. data/lib/libv8/v8/src/debug-debugger.js +65 -34
  283. data/lib/libv8/v8/src/debug.cc +30 -60
  284. data/lib/libv8/v8/src/debug.h +5 -3
  285. data/lib/libv8/v8/src/deoptimizer.cc +227 -10
  286. data/lib/libv8/v8/src/deoptimizer.h +133 -9
  287. data/lib/libv8/v8/src/disassembler.cc +22 -14
  288. data/lib/libv8/v8/src/diy-fp.cc +4 -3
  289. data/lib/libv8/v8/src/diy-fp.h +3 -3
  290. data/lib/libv8/v8/src/elements.cc +634 -0
  291. data/lib/libv8/v8/src/elements.h +95 -0
  292. data/lib/libv8/v8/src/execution.cc +5 -21
  293. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
  294. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
  295. data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
  296. data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
  297. data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
  298. data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
  299. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
  300. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
  301. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
  302. data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
  303. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
  304. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
  305. data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
  306. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
  307. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
  308. data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
  309. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
  310. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
  311. data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
  312. data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
  313. data/lib/libv8/v8/src/factory.cc +89 -18
  314. data/lib/libv8/v8/src/factory.h +36 -8
  315. data/lib/libv8/v8/src/flag-definitions.h +11 -44
  316. data/lib/libv8/v8/src/frames-inl.h +8 -1
  317. data/lib/libv8/v8/src/frames.cc +39 -3
  318. data/lib/libv8/v8/src/frames.h +10 -3
  319. data/lib/libv8/v8/src/full-codegen.cc +311 -293
  320. data/lib/libv8/v8/src/full-codegen.h +183 -143
  321. data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
  322. data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
  323. data/lib/libv8/v8/src/gdb-jit.cc +658 -55
  324. data/lib/libv8/v8/src/gdb-jit.h +6 -2
  325. data/lib/libv8/v8/src/global-handles.cc +368 -312
  326. data/lib/libv8/v8/src/global-handles.h +29 -36
  327. data/lib/libv8/v8/src/globals.h +3 -1
  328. data/lib/libv8/v8/src/handles.cc +43 -69
  329. data/lib/libv8/v8/src/handles.h +21 -16
  330. data/lib/libv8/v8/src/heap-inl.h +11 -13
  331. data/lib/libv8/v8/src/heap-profiler.cc +0 -999
  332. data/lib/libv8/v8/src/heap-profiler.h +0 -303
  333. data/lib/libv8/v8/src/heap.cc +366 -141
  334. data/lib/libv8/v8/src/heap.h +87 -26
  335. data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
  336. data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
  337. data/lib/libv8/v8/src/hydrogen.cc +1146 -629
  338. data/lib/libv8/v8/src/hydrogen.h +100 -64
  339. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
  340. data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
  341. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
  342. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
  343. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
  344. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
  345. data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
  346. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
  347. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
  348. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
  349. data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
  350. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
  351. data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
  352. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
  353. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
  354. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
  355. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
  356. data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
  357. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
  358. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
  359. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
  360. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
  361. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
  362. data/lib/libv8/v8/src/ic.cc +198 -234
  363. data/lib/libv8/v8/src/ic.h +32 -30
  364. data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
  365. data/lib/libv8/v8/src/isolate.cc +112 -95
  366. data/lib/libv8/v8/src/isolate.h +55 -71
  367. data/lib/libv8/v8/src/json-parser.h +486 -48
  368. data/lib/libv8/v8/src/json.js +28 -23
  369. data/lib/libv8/v8/src/jsregexp.cc +163 -208
  370. data/lib/libv8/v8/src/jsregexp.h +0 -1
  371. data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
  372. data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
  373. data/lib/libv8/v8/src/lithium-allocator.h +8 -8
  374. data/lib/libv8/v8/src/lithium.cc +16 -11
  375. data/lib/libv8/v8/src/lithium.h +31 -34
  376. data/lib/libv8/v8/src/liveedit.cc +111 -15
  377. data/lib/libv8/v8/src/liveedit.h +3 -4
  378. data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
  379. data/lib/libv8/v8/src/liveobjectlist.h +2 -2
  380. data/lib/libv8/v8/src/log-inl.h +0 -4
  381. data/lib/libv8/v8/src/log-utils.cc +25 -143
  382. data/lib/libv8/v8/src/log-utils.h +13 -92
  383. data/lib/libv8/v8/src/log.cc +26 -249
  384. data/lib/libv8/v8/src/log.h +6 -17
  385. data/lib/libv8/v8/src/macros.py +9 -6
  386. data/lib/libv8/v8/src/mark-compact.cc +276 -56
  387. data/lib/libv8/v8/src/mark-compact.h +20 -0
  388. data/lib/libv8/v8/src/messages.js +93 -39
  389. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
  390. data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
  391. data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
  392. data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
  393. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
  394. data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
  395. data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
  396. data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
  397. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
  398. data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
  399. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
  400. data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
  401. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
  402. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
  403. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
  404. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
  405. data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
  406. data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
  407. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
  408. data/lib/libv8/v8/src/mirror-debugger.js +55 -8
  409. data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
  410. data/lib/libv8/v8/src/mksnapshot.cc +36 -4
  411. data/lib/libv8/v8/src/natives.h +5 -2
  412. data/lib/libv8/v8/src/objects-debug.cc +73 -6
  413. data/lib/libv8/v8/src/objects-inl.h +529 -164
  414. data/lib/libv8/v8/src/objects-printer.cc +67 -12
  415. data/lib/libv8/v8/src/objects-visiting.cc +13 -2
  416. data/lib/libv8/v8/src/objects-visiting.h +41 -1
  417. data/lib/libv8/v8/src/objects.cc +2200 -1177
  418. data/lib/libv8/v8/src/objects.h +912 -283
  419. data/lib/libv8/v8/src/parser.cc +566 -371
  420. data/lib/libv8/v8/src/parser.h +35 -33
  421. data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
  422. data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
  423. data/lib/libv8/v8/src/platform-linux.cc +60 -57
  424. data/lib/libv8/v8/src/platform-macos.cc +4 -27
  425. data/lib/libv8/v8/src/platform-nullos.cc +3 -16
  426. data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
  427. data/lib/libv8/v8/src/platform-posix.cc +43 -1
  428. data/lib/libv8/v8/src/platform-solaris.cc +151 -112
  429. data/lib/libv8/v8/src/platform-tls.h +1 -1
  430. data/lib/libv8/v8/src/platform-win32.cc +65 -39
  431. data/lib/libv8/v8/src/platform.h +17 -14
  432. data/lib/libv8/v8/src/preparse-data-format.h +2 -2
  433. data/lib/libv8/v8/src/preparse-data.h +8 -2
  434. data/lib/libv8/v8/src/preparser-api.cc +2 -18
  435. data/lib/libv8/v8/src/preparser.cc +106 -65
  436. data/lib/libv8/v8/src/preparser.h +26 -5
  437. data/lib/libv8/v8/src/prettyprinter.cc +25 -43
  438. data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
  439. data/lib/libv8/v8/src/profile-generator.cc +213 -34
  440. data/lib/libv8/v8/src/profile-generator.h +9 -9
  441. data/lib/libv8/v8/src/property.h +1 -0
  442. data/lib/libv8/v8/src/proxy.js +74 -4
  443. data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
  444. data/lib/libv8/v8/src/regexp.js +16 -11
  445. data/lib/libv8/v8/src/rewriter.cc +24 -133
  446. data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
  447. data/lib/libv8/v8/src/runtime-profiler.h +5 -31
  448. data/lib/libv8/v8/src/runtime.cc +1450 -681
  449. data/lib/libv8/v8/src/runtime.h +47 -31
  450. data/lib/libv8/v8/src/runtime.js +2 -1
  451. data/lib/libv8/v8/src/scanner-base.cc +358 -220
  452. data/lib/libv8/v8/src/scanner-base.h +30 -138
  453. data/lib/libv8/v8/src/scanner.cc +0 -18
  454. data/lib/libv8/v8/src/scanner.h +0 -15
  455. data/lib/libv8/v8/src/scopeinfo.cc +3 -1
  456. data/lib/libv8/v8/src/scopeinfo.h +1 -6
  457. data/lib/libv8/v8/src/scopes.cc +243 -253
  458. data/lib/libv8/v8/src/scopes.h +58 -109
  459. data/lib/libv8/v8/src/serialize.cc +12 -54
  460. data/lib/libv8/v8/src/serialize.h +47 -0
  461. data/lib/libv8/v8/src/small-pointer-list.h +25 -0
  462. data/lib/libv8/v8/src/spaces-inl.h +4 -50
  463. data/lib/libv8/v8/src/spaces.cc +64 -131
  464. data/lib/libv8/v8/src/spaces.h +19 -70
  465. data/lib/libv8/v8/src/string-stream.cc +3 -1
  466. data/lib/libv8/v8/src/string.js +10 -6
  467. data/lib/libv8/v8/src/strtod.cc +7 -3
  468. data/lib/libv8/v8/src/stub-cache.cc +59 -129
  469. data/lib/libv8/v8/src/stub-cache.h +42 -54
  470. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
  471. data/lib/libv8/v8/src/token.cc +4 -4
  472. data/lib/libv8/v8/src/token.h +6 -5
  473. data/lib/libv8/v8/src/type-info.cc +173 -129
  474. data/lib/libv8/v8/src/type-info.h +40 -22
  475. data/lib/libv8/v8/src/utils.cc +25 -304
  476. data/lib/libv8/v8/src/utils.h +118 -3
  477. data/lib/libv8/v8/src/v8-counters.h +3 -6
  478. data/lib/libv8/v8/src/v8.cc +34 -27
  479. data/lib/libv8/v8/src/v8.h +7 -7
  480. data/lib/libv8/v8/src/v8conversions.cc +129 -0
  481. data/lib/libv8/v8/src/v8conversions.h +60 -0
  482. data/lib/libv8/v8/src/v8globals.h +15 -6
  483. data/lib/libv8/v8/src/v8natives.js +300 -78
  484. data/lib/libv8/v8/src/v8threads.cc +14 -6
  485. data/lib/libv8/v8/src/v8threads.h +4 -1
  486. data/lib/libv8/v8/src/v8utils.cc +360 -0
  487. data/lib/libv8/v8/src/v8utils.h +17 -66
  488. data/lib/libv8/v8/src/variables.cc +7 -12
  489. data/lib/libv8/v8/src/variables.h +12 -10
  490. data/lib/libv8/v8/src/version.cc +2 -2
  491. data/lib/libv8/v8/src/vm-state-inl.h +0 -41
  492. data/lib/libv8/v8/src/vm-state.h +0 -11
  493. data/lib/libv8/v8/src/weakmap.js +103 -0
  494. data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
  495. data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
  496. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
  497. data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
  498. data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
  499. data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
  500. data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
  501. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
  502. data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
  503. data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
  504. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
  505. data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
  506. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
  507. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
  508. data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
  509. data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
  510. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
  511. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
  512. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
  513. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
  514. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
  515. data/lib/libv8/v8/src/zone.cc +31 -22
  516. data/lib/libv8/v8/src/zone.h +12 -6
  517. data/lib/libv8/v8/tools/codemap.js +8 -0
  518. data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
  519. data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
  520. data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
  521. data/lib/libv8/v8/tools/grokdump.py +44 -35
  522. data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
  523. data/lib/libv8/v8/tools/js2c.py +83 -52
  524. data/lib/libv8/v8/tools/linux-tick-processor +4 -6
  525. data/lib/libv8/v8/tools/ll_prof.py +3 -3
  526. data/lib/libv8/v8/tools/oom_dump/README +3 -1
  527. data/lib/libv8/v8/tools/presubmit.py +11 -4
  528. data/lib/libv8/v8/tools/profile.js +46 -2
  529. data/lib/libv8/v8/tools/splaytree.js +11 -0
  530. data/lib/libv8/v8/tools/stats-viewer.py +15 -11
  531. data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
  532. data/lib/libv8/v8/tools/test.py +28 -8
  533. data/lib/libv8/v8/tools/tickprocessor.js +0 -16
  534. data/lib/libv8/version.rb +1 -1
  535. data/libv8.gemspec +2 -2
  536. metadata +31 -19
  537. data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
  538. data/lib/libv8/v8/src/json-parser.cc +0 -504
@@ -35,6 +35,8 @@
35
35
  #include "data-flow.h"
36
36
  #include "small-pointer-list.h"
37
37
  #include "string-stream.h"
38
+ #include "v8conversions.h"
39
+ #include "v8utils.h"
38
40
  #include "zone.h"
39
41
 
40
42
  namespace v8 {
@@ -71,6 +73,7 @@ class LChunkBuilder;
71
73
  V(BitXor) \
72
74
  V(BlockEntry) \
73
75
  V(BoundsCheck) \
76
+ V(Branch) \
74
77
  V(CallConstantFunction) \
75
78
  V(CallFunction) \
76
79
  V(CallGlobal) \
@@ -88,36 +91,37 @@ class LChunkBuilder;
88
91
  V(CheckPrototypeMaps) \
89
92
  V(CheckSmi) \
90
93
  V(ClampToUint8) \
91
- V(ClassOfTest) \
92
- V(Compare) \
93
- V(CompareJSObjectEq) \
94
+ V(ClassOfTestAndBranch) \
95
+ V(CompareIDAndBranch) \
96
+ V(CompareGeneric) \
97
+ V(CompareObjectEqAndBranch) \
94
98
  V(CompareMap) \
95
- V(CompareSymbolEq) \
99
+ V(CompareConstantEqAndBranch) \
96
100
  V(Constant) \
97
101
  V(Context) \
98
102
  V(DeleteProperty) \
99
103
  V(Deoptimize) \
100
104
  V(Div) \
105
+ V(ElementsKind) \
101
106
  V(EnterInlined) \
102
- V(ExternalArrayLength) \
103
- V(FixedArrayLength) \
107
+ V(FixedArrayBaseLength) \
104
108
  V(ForceRepresentation) \
105
109
  V(FunctionLiteral) \
106
110
  V(GetCachedArrayIndex) \
107
111
  V(GlobalObject) \
108
112
  V(GlobalReceiver) \
109
113
  V(Goto) \
110
- V(HasInstanceType) \
111
- V(HasCachedArrayIndex) \
114
+ V(HasCachedArrayIndexAndBranch) \
115
+ V(HasInstanceTypeAndBranch) \
112
116
  V(In) \
113
117
  V(InstanceOf) \
114
118
  V(InstanceOfKnownGlobal) \
115
119
  V(InvokeFunction) \
116
- V(IsConstructCall) \
117
- V(IsNull) \
118
- V(IsObject) \
119
- V(IsSmi) \
120
- V(IsUndetectable) \
120
+ V(IsConstructCallAndBranch) \
121
+ V(IsNullAndBranch) \
122
+ V(IsObjectAndBranch) \
123
+ V(IsSmiAndBranch) \
124
+ V(IsUndetectableAndBranch) \
121
125
  V(JSArrayLength) \
122
126
  V(LeaveInlined) \
123
127
  V(LoadContextSlot) \
@@ -126,6 +130,7 @@ class LChunkBuilder;
126
130
  V(LoadFunctionPrototype) \
127
131
  V(LoadGlobalCell) \
128
132
  V(LoadGlobalGeneric) \
133
+ V(LoadKeyedFastDoubleElement) \
129
134
  V(LoadKeyedFastElement) \
130
135
  V(LoadKeyedGeneric) \
131
136
  V(LoadKeyedSpecializedArrayElement) \
@@ -146,13 +151,15 @@ class LChunkBuilder;
146
151
  V(Shl) \
147
152
  V(Shr) \
148
153
  V(Simulate) \
154
+ V(SoftDeoptimize) \
149
155
  V(StackCheck) \
150
156
  V(StoreContextSlot) \
151
157
  V(StoreGlobalCell) \
152
158
  V(StoreGlobalGeneric) \
159
+ V(StoreKeyedFastDoubleElement) \
153
160
  V(StoreKeyedFastElement) \
154
- V(StoreKeyedSpecializedArrayElement) \
155
161
  V(StoreKeyedGeneric) \
162
+ V(StoreKeyedSpecializedArrayElement) \
156
163
  V(StoreNamedField) \
157
164
  V(StoreNamedGeneric) \
158
165
  V(StringAdd) \
@@ -160,13 +167,15 @@ class LChunkBuilder;
160
167
  V(StringCharFromCode) \
161
168
  V(StringLength) \
162
169
  V(Sub) \
163
- V(Test) \
170
+ V(ThisFunction) \
164
171
  V(Throw) \
165
172
  V(ToFastProperties) \
173
+ V(ToInt32) \
166
174
  V(Typeof) \
167
- V(TypeofIs) \
175
+ V(TypeofIsAndBranch) \
168
176
  V(UnaryMathOperation) \
169
177
  V(UnknownOSRValue) \
178
+ V(UseConst) \
170
179
  V(ValueOf)
171
180
 
172
181
  #define GVN_FLAG_LIST(V) \
@@ -174,6 +183,7 @@ class LChunkBuilder;
174
183
  V(InobjectFields) \
175
184
  V(BackingStoreFields) \
176
185
  V(ArrayElements) \
186
+ V(DoubleArrayElements) \
177
187
  V(SpecializedArrayElements) \
178
188
  V(GlobalVars) \
179
189
  V(Maps) \
@@ -217,14 +227,20 @@ class Range: public ZoneObject {
217
227
  Range* next() const { return next_; }
218
228
  Range* CopyClearLower() const { return new Range(kMinInt, upper_); }
219
229
  Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); }
220
- Range* Copy() const { return new Range(lower_, upper_); }
230
+ Range* Copy() const {
231
+ Range* result = new Range(lower_, upper_);
232
+ result->set_can_be_minus_zero(CanBeMinusZero());
233
+ return result;
234
+ }
221
235
  int32_t Mask() const;
222
236
  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
223
237
  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
224
238
  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
225
239
  bool CanBeNegative() const { return lower_ < 0; }
226
240
  bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
227
- bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; }
241
+ bool IsMostGeneric() const {
242
+ return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero();
243
+ }
228
244
  bool IsInSmiRange() const {
229
245
  return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
230
246
  }
@@ -397,7 +413,7 @@ class HType {
397
413
  kBoolean = 0x85, // 0000 0000 1000 0101
398
414
  kNonPrimitive = 0x101, // 0000 0001 0000 0001
399
415
  kJSObject = 0x301, // 0000 0011 0000 0001
400
- kJSArray = 0x701, // 0000 0111 1000 0001
416
+ kJSArray = 0x701, // 0000 0111 0000 0001
401
417
  kUninitialized = 0x1fff // 0001 1111 1111 1111
402
418
  };
403
419
 
@@ -479,10 +495,15 @@ class HValue: public ZoneObject {
479
495
  GVN_FLAG_LIST(DECLARE_DO)
480
496
  #undef DECLARE_DO
481
497
  kFlexibleRepresentation,
498
+ // Participate in Global Value Numbering, i.e. elimination of
499
+ // unnecessary recomputations. If an instruction sets this flag, it must
500
+ // implement DataEquals(), which will be used to determine if other
501
+ // occurrences of the instruction are indeed the same.
482
502
  kUseGVN,
483
503
  kCanOverflow,
484
504
  kBailoutOnMinusZero,
485
505
  kCanBeDivByZero,
506
+ kDeoptimizeOnUndefined,
486
507
  kIsArguments,
487
508
  kTruncatingToInt32,
488
509
  kLastFlag = kTruncatingToInt32
@@ -563,9 +584,9 @@ class HValue: public ZoneObject {
563
584
  virtual bool IsConvertibleToInteger() const { return true; }
564
585
 
565
586
  HType type() const { return type_; }
566
- void set_type(HType type) {
567
- ASSERT(HasNoUses());
568
- type_ = type;
587
+ void set_type(HType new_type) {
588
+ ASSERT(new_type.IsSubtypeOf(type_));
589
+ type_ = new_type;
569
590
  }
570
591
 
571
592
  // An operation needs to override this function iff:
@@ -575,9 +596,9 @@ class HValue: public ZoneObject {
575
596
  // it would otherwise output what should be a minus zero as an int32 zero.
576
597
  // If the operation also exists in a form that takes int32 and outputs int32
577
598
  // then the operation should return its input value so that we can propagate
578
- // back. There are two operations that need to propagate back to more than
579
- // one input. They are phi and binary add. They always return NULL and
580
- // expect the caller to take care of things.
599
+ // back. There are three operations that need to propagate back to more than
600
+ // one input. They are phi and binary div and mul. They always return NULL
601
+ // and expect the caller to take care of things.
581
602
  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) {
582
603
  visited->Add(id());
583
604
  return NULL;
@@ -591,6 +612,7 @@ class HValue: public ZoneObject {
591
612
  void SetOperandAt(int index, HValue* value);
592
613
 
593
614
  void DeleteAndReplaceWith(HValue* other);
615
+ void ReplaceAllUsesWith(HValue* other);
594
616
  bool HasNoUses() const { return use_list_ == NULL; }
595
617
  bool HasMultipleUses() const {
596
618
  return use_list_ != NULL && use_list_->tail() != NULL;
@@ -680,8 +702,6 @@ class HValue: public ZoneObject {
680
702
  // removed list node or NULL.
681
703
  HUseListNode* RemoveUse(HValue* value, int index);
682
704
 
683
- void ReplaceAllUsesWith(HValue* other);
684
-
685
705
  void RegisterUse(int index, HValue* new_value);
686
706
 
687
707
  HBasicBlock* block_;
@@ -723,10 +743,6 @@ class HInstruction: public HValue {
723
743
  virtual void Verify();
724
744
  #endif
725
745
 
726
- // Returns whether this is some kind of deoptimizing check
727
- // instruction.
728
- virtual bool IsCheckInstruction() const { return false; }
729
-
730
746
  virtual bool IsCall() { return false; }
731
747
 
732
748
  DECLARE_ABSTRACT_INSTRUCTION(Instruction)
@@ -757,80 +773,71 @@ class HInstruction: public HValue {
757
773
  };
758
774
 
759
775
 
760
- class HControlInstruction: public HInstruction {
776
+ template<int V>
777
+ class HTemplateInstruction : public HInstruction {
761
778
  public:
762
- HControlInstruction(HBasicBlock* first, HBasicBlock* second)
763
- : first_successor_(first), second_successor_(second) {
764
- }
765
-
766
- HBasicBlock* FirstSuccessor() const { return first_successor_; }
767
- HBasicBlock* SecondSuccessor() const { return second_successor_; }
768
-
769
- virtual void PrintDataTo(StringStream* stream);
779
+ int OperandCount() { return V; }
780
+ HValue* OperandAt(int i) { return inputs_[i]; }
770
781
 
771
- DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
782
+ protected:
783
+ void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
772
784
 
773
785
  private:
774
- HBasicBlock* first_successor_;
775
- HBasicBlock* second_successor_;
786
+ EmbeddedContainer<HValue*, V> inputs_;
776
787
  };
777
788
 
778
789
 
779
- template<int NumElements>
780
- class HOperandContainer {
790
+ class HControlInstruction: public HInstruction {
781
791
  public:
782
- HOperandContainer() : elems_() { }
783
-
784
- int length() { return NumElements; }
785
- HValue*& operator[](int i) {
786
- ASSERT(i < length());
787
- return elems_[i];
788
- }
789
-
790
- private:
791
- HValue* elems_[NumElements];
792
- };
792
+ virtual HBasicBlock* SuccessorAt(int i) = 0;
793
+ virtual int SuccessorCount() = 0;
794
+ virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0;
793
795
 
796
+ virtual void PrintDataTo(StringStream* stream);
794
797
 
795
- template<>
796
- class HOperandContainer<0> {
797
- public:
798
- int length() { return 0; }
799
- HValue*& operator[](int i) {
800
- UNREACHABLE();
801
- static HValue* t = 0;
802
- return t;
798
+ HBasicBlock* FirstSuccessor() {
799
+ return SuccessorCount() > 0 ? SuccessorAt(0) : NULL;
803
800
  }
801
+ HBasicBlock* SecondSuccessor() {
802
+ return SuccessorCount() > 1 ? SuccessorAt(1) : NULL;
803
+ }
804
+
805
+ DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction)
804
806
  };
805
807
 
806
808
 
807
- template<int V>
808
- class HTemplateInstruction : public HInstruction {
809
+ class HSuccessorIterator BASE_EMBEDDED {
809
810
  public:
810
- int OperandCount() { return V; }
811
- HValue* OperandAt(int i) { return inputs_[i]; }
811
+ explicit HSuccessorIterator(HControlInstruction* instr)
812
+ : instr_(instr), current_(0) { }
812
813
 
813
- protected:
814
- void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
814
+ bool Done() { return current_ >= instr_->SuccessorCount(); }
815
+ HBasicBlock* Current() { return instr_->SuccessorAt(current_); }
816
+ void Advance() { current_++; }
815
817
 
816
818
  private:
817
- HOperandContainer<V> inputs_;
819
+ HControlInstruction* instr_;
820
+ int current_;
818
821
  };
819
822
 
820
823
 
821
- template<int V>
822
- class HTemplateControlInstruction : public HControlInstruction {
824
+ template<int S, int V>
825
+ class HTemplateControlInstruction: public HControlInstruction {
823
826
  public:
824
- HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second)
825
- : HControlInstruction(first, second) { }
827
+ int SuccessorCount() { return S; }
828
+ HBasicBlock* SuccessorAt(int i) { return successors_[i]; }
829
+ void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; }
830
+
826
831
  int OperandCount() { return V; }
827
832
  HValue* OperandAt(int i) { return inputs_[i]; }
828
833
 
834
+
829
835
  protected:
830
836
  void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; }
831
837
 
832
838
  private:
833
- HOperandContainer<V> inputs_;
839
+ EmbeddedContainer<HBasicBlock*, S> successors_;
840
+ EmbeddedContainer<HValue*, V> inputs_;
834
841
  };
835
842
 
836
843
 
@@ -844,11 +851,22 @@ class HBlockEntry: public HTemplateInstruction<0> {
844
851
  };
845
852
 
846
853
 
854
+ // We insert soft-deoptimize when we hit code with unknown typefeedback,
855
+ // so that we get a chance of re-optimizing with useful typefeedback.
856
+ // HSoftDeoptimize does not end a basic block as opposed to HDeoptimize.
857
+ class HSoftDeoptimize: public HTemplateInstruction<0> {
858
+ public:
859
+ virtual Representation RequiredInputRepresentation(int index) const {
860
+ return Representation::None();
861
+ }
862
+
863
+ DECLARE_CONCRETE_INSTRUCTION(SoftDeoptimize)
864
+ };
865
+
866
+
847
867
  class HDeoptimize: public HControlInstruction {
848
868
  public:
849
- explicit HDeoptimize(int environment_length)
850
- : HControlInstruction(NULL, NULL),
851
- values_(environment_length) { }
869
+ explicit HDeoptimize(int environment_length) : values_(environment_length) { }
852
870
 
853
871
  virtual Representation RequiredInputRepresentation(int index) const {
854
872
  return Representation::None();
@@ -856,6 +874,16 @@ class HDeoptimize: public HControlInstruction {
856
874
 
857
875
  virtual int OperandCount() { return values_.length(); }
858
876
  virtual HValue* OperandAt(int index) { return values_[index]; }
877
+ virtual void PrintDataTo(StringStream* stream);
878
+
879
+ virtual int SuccessorCount() { return 0; }
880
+ virtual HBasicBlock* SuccessorAt(int i) {
881
+ UNREACHABLE();
882
+ return NULL;
883
+ }
884
+ virtual void SetSuccessorAt(int i, HBasicBlock* block) {
885
+ UNREACHABLE();
886
+ }
859
887
 
860
888
  void AddEnvironmentValue(HValue* value) {
861
889
  values_.Add(NULL);
@@ -879,35 +907,28 @@ class HDeoptimize: public HControlInstruction {
879
907
  };
880
908
 
881
909
 
882
- class HGoto: public HTemplateControlInstruction<0> {
910
+ class HGoto: public HTemplateControlInstruction<1, 0> {
883
911
  public:
884
- explicit HGoto(HBasicBlock* target)
885
- : HTemplateControlInstruction<0>(target, NULL),
886
- include_stack_check_(false) { }
887
-
888
- void set_include_stack_check(bool include_stack_check) {
889
- include_stack_check_ = include_stack_check;
890
- }
891
- bool include_stack_check() const { return include_stack_check_; }
912
+ explicit HGoto(HBasicBlock* target) {
913
+ SetSuccessorAt(0, target);
914
+ }
892
915
 
893
916
  virtual Representation RequiredInputRepresentation(int index) const {
894
917
  return Representation::None();
895
918
  }
896
919
 
897
920
  DECLARE_CONCRETE_INSTRUCTION(Goto)
898
-
899
- private:
900
- bool include_stack_check_;
901
921
  };
902
922
 
903
923
 
904
- class HUnaryControlInstruction: public HTemplateControlInstruction<1> {
924
+ class HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> {
905
925
  public:
906
- explicit HUnaryControlInstruction(HValue* value,
907
- HBasicBlock* true_target,
908
- HBasicBlock* false_target)
909
- : HTemplateControlInstruction<1>(true_target, false_target) {
926
+ HUnaryControlInstruction(HValue* value,
927
+ HBasicBlock* true_target,
928
+ HBasicBlock* false_target) {
910
929
  SetOperandAt(0, value);
930
+ SetSuccessorAt(0, true_target);
931
+ SetSuccessorAt(1, false_target);
911
932
  }
912
933
 
913
934
  virtual void PrintDataTo(StringStream* stream);
@@ -916,18 +937,32 @@ class HUnaryControlInstruction: public HTemplateControlInstruction<1> {
916
937
  };
917
938
 
918
939
 
919
- class HTest: public HUnaryControlInstruction {
940
+ class HBranch: public HUnaryControlInstruction {
920
941
  public:
921
- HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target)
922
- : HUnaryControlInstruction(value, true_target, false_target) {
942
+ HBranch(HValue* value,
943
+ HBasicBlock* true_target,
944
+ HBasicBlock* false_target,
945
+ ToBooleanStub::Types expected_input_types = ToBooleanStub::no_types())
946
+ : HUnaryControlInstruction(value, true_target, false_target),
947
+ expected_input_types_(expected_input_types) {
923
948
  ASSERT(true_target != NULL && false_target != NULL);
924
949
  }
950
+ explicit HBranch(HValue* value)
951
+ : HUnaryControlInstruction(value, NULL, NULL) { }
952
+
925
953
 
926
954
  virtual Representation RequiredInputRepresentation(int index) const {
927
955
  return Representation::None();
928
956
  }
929
957
 
930
- DECLARE_CONCRETE_INSTRUCTION(Test)
958
+ ToBooleanStub::Types expected_input_types() const {
959
+ return expected_input_types_;
960
+ }
961
+
962
+ DECLARE_CONCRETE_INSTRUCTION(Branch)
963
+
964
+ private:
965
+ ToBooleanStub::Types expected_input_types_;
931
966
  };
932
967
 
933
968
 
@@ -959,24 +994,26 @@ class HCompareMap: public HUnaryControlInstruction {
959
994
  };
960
995
 
961
996
 
962
- class HReturn: public HUnaryControlInstruction {
997
+ class HReturn: public HTemplateControlInstruction<0, 1> {
963
998
  public:
964
- explicit HReturn(HValue* value)
965
- : HUnaryControlInstruction(value, NULL, NULL) {
999
+ explicit HReturn(HValue* value) {
1000
+ SetOperandAt(0, value);
966
1001
  }
967
1002
 
968
1003
  virtual Representation RequiredInputRepresentation(int index) const {
969
1004
  return Representation::Tagged();
970
1005
  }
971
1006
 
1007
+ virtual void PrintDataTo(StringStream* stream);
1008
+
1009
+ HValue* value() { return OperandAt(0); }
1010
+
972
1011
  DECLARE_CONCRETE_INSTRUCTION(Return)
973
1012
  };
974
1013
 
975
1014
 
976
- class HAbnormalExit: public HTemplateControlInstruction<0> {
1015
+ class HAbnormalExit: public HTemplateControlInstruction<0, 0> {
977
1016
  public:
978
- HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { }
979
-
980
1017
  virtual Representation RequiredInputRepresentation(int index) const {
981
1018
  return Representation::None();
982
1019
  }
@@ -991,14 +1028,24 @@ class HUnaryOperation: public HTemplateInstruction<1> {
991
1028
  SetOperandAt(0, value);
992
1029
  }
993
1030
 
1031
+ static HUnaryOperation* cast(HValue* value) {
1032
+ return reinterpret_cast<HUnaryOperation*>(value);
1033
+ }
1034
+
1035
+ virtual bool CanTruncateToInt32() const {
1036
+ return CheckFlag(kTruncatingToInt32);
1037
+ }
1038
+
994
1039
  HValue* value() { return OperandAt(0); }
995
1040
  virtual void PrintDataTo(StringStream* stream);
996
1041
  };
997
1042
 
998
1043
 
999
- class HThrow: public HUnaryOperation {
1044
+ class HThrow: public HTemplateInstruction<2> {
1000
1045
  public:
1001
- explicit HThrow(HValue* value) : HUnaryOperation(value) {
1046
+ HThrow(HValue* context, HValue* value) {
1047
+ SetOperandAt(0, context);
1048
+ SetOperandAt(1, value);
1002
1049
  SetAllSideEffects();
1003
1050
  }
1004
1051
 
@@ -1006,10 +1053,25 @@ class HThrow: public HUnaryOperation {
1006
1053
  return Representation::Tagged();
1007
1054
  }
1008
1055
 
1056
+ HValue* context() { return OperandAt(0); }
1057
+ HValue* value() { return OperandAt(1); }
1058
+
1009
1059
  DECLARE_CONCRETE_INSTRUCTION(Throw)
1010
1060
  };
1011
1061
 
1012
1062
 
1063
+ class HUseConst: public HUnaryOperation {
1064
+ public:
1065
+ explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { }
1066
+
1067
+ virtual Representation RequiredInputRepresentation(int index) const {
1068
+ return Representation::None();
1069
+ }
1070
+
1071
+ DECLARE_CONCRETE_INSTRUCTION(UseConst)
1072
+ };
1073
+
1074
+
1013
1075
  class HForceRepresentation: public HTemplateInstruction<1> {
1014
1076
  public:
1015
1077
  HForceRepresentation(HValue* value, Representation required_representation) {
@@ -1034,28 +1096,28 @@ class HChange: public HUnaryOperation {
1034
1096
  HChange(HValue* value,
1035
1097
  Representation from,
1036
1098
  Representation to,
1037
- bool is_truncating)
1038
- : HUnaryOperation(value), from_(from) {
1099
+ bool is_truncating,
1100
+ bool deoptimize_on_undefined)
1101
+ : HUnaryOperation(value),
1102
+ from_(from),
1103
+ deoptimize_on_undefined_(deoptimize_on_undefined) {
1039
1104
  ASSERT(!from.IsNone() && !to.IsNone());
1040
1105
  ASSERT(!from.Equals(to));
1041
1106
  set_representation(to);
1042
1107
  SetFlag(kUseGVN);
1043
1108
  if (is_truncating) SetFlag(kTruncatingToInt32);
1044
- if (from.IsInteger32() && to.IsTagged() && value->range() != NULL &&
1045
- value->range()->IsInSmiRange()) {
1046
- set_type(HType::Smi());
1047
- }
1048
1109
  }
1049
1110
 
1050
1111
  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1051
1112
 
1052
1113
  Representation from() const { return from_; }
1053
1114
  Representation to() const { return representation(); }
1115
+ bool deoptimize_on_undefined() const { return deoptimize_on_undefined_; }
1054
1116
  virtual Representation RequiredInputRepresentation(int index) const {
1055
1117
  return from_;
1056
1118
  }
1057
1119
 
1058
- bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
1120
+ virtual Range* InferRange();
1059
1121
 
1060
1122
  virtual void PrintDataTo(StringStream* stream);
1061
1123
 
@@ -1065,52 +1127,63 @@ class HChange: public HUnaryOperation {
1065
1127
  virtual bool DataEquals(HValue* other) {
1066
1128
  if (!other->IsChange()) return false;
1067
1129
  HChange* change = HChange::cast(other);
1068
- return value() == change->value()
1069
- && to().Equals(change->to());
1130
+ return to().Equals(change->to())
1131
+ && deoptimize_on_undefined() == change->deoptimize_on_undefined();
1070
1132
  }
1071
1133
 
1072
1134
  private:
1073
1135
  Representation from_;
1136
+ bool deoptimize_on_undefined_;
1074
1137
  };
1075
1138
 
1076
1139
 
1077
1140
  class HClampToUint8: public HUnaryOperation {
1078
1141
  public:
1079
1142
  explicit HClampToUint8(HValue* value)
1080
- : HUnaryOperation(value),
1081
- input_rep_(Representation::None()) {
1082
- SetFlag(kFlexibleRepresentation);
1083
- set_representation(Representation::Tagged());
1143
+ : HUnaryOperation(value) {
1144
+ set_representation(Representation::Integer32());
1084
1145
  SetFlag(kUseGVN);
1085
1146
  }
1086
1147
 
1087
1148
  virtual Representation RequiredInputRepresentation(int index) const {
1088
- return input_rep_;
1149
+ return Representation::None();
1089
1150
  }
1090
1151
 
1091
- virtual Representation InferredRepresentation() {
1092
- // TODO(danno): Inference on input types should happen separately from
1093
- // return representation.
1094
- Representation new_rep = value()->representation();
1095
- if (input_rep_.IsNone()) {
1096
- if (!new_rep.IsNone()) {
1097
- input_rep_ = new_rep;
1098
- return Representation::Integer32();
1099
- } else {
1100
- return Representation::None();
1101
- }
1152
+ DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1153
+
1154
+ protected:
1155
+ virtual bool DataEquals(HValue* other) { return true; }
1156
+ };
1157
+
1158
+
1159
+ class HToInt32: public HUnaryOperation {
1160
+ public:
1161
+ explicit HToInt32(HValue* value)
1162
+ : HUnaryOperation(value) {
1163
+ set_representation(Representation::Integer32());
1164
+ SetFlag(kUseGVN);
1165
+ }
1166
+
1167
+ virtual Representation RequiredInputRepresentation(int index) const {
1168
+ return Representation::None();
1169
+ }
1170
+
1171
+ virtual bool CanTruncateToInt32() const {
1172
+ return true;
1173
+ }
1174
+
1175
+ virtual HValue* Canonicalize() {
1176
+ if (value()->representation().IsInteger32()) {
1177
+ return value();
1102
1178
  } else {
1103
- return Representation::Integer32();
1179
+ return this;
1104
1180
  }
1105
1181
  }
1106
1182
 
1107
- DECLARE_CONCRETE_INSTRUCTION(ClampToUint8)
1183
+ DECLARE_CONCRETE_INSTRUCTION(ToInt32)
1108
1184
 
1109
1185
  protected:
1110
1186
  virtual bool DataEquals(HValue* other) { return true; }
1111
-
1112
- private:
1113
- Representation input_rep_;
1114
1187
  };
1115
1188
 
1116
1189
 
@@ -1182,15 +1255,38 @@ class HSimulate: public HInstruction {
1182
1255
  };
1183
1256
 
1184
1257
 
1185
- class HStackCheck: public HTemplateInstruction<0> {
1258
+ class HStackCheck: public HTemplateInstruction<1> {
1186
1259
  public:
1187
- HStackCheck() { }
1260
+ enum Type {
1261
+ kFunctionEntry,
1262
+ kBackwardsBranch
1263
+ };
1264
+
1265
+ HStackCheck(HValue* context, Type type) : type_(type) {
1266
+ SetOperandAt(0, context);
1267
+ }
1268
+
1269
+ HValue* context() { return OperandAt(0); }
1188
1270
 
1189
1271
  virtual Representation RequiredInputRepresentation(int index) const {
1190
- return Representation::None();
1272
+ return Representation::Tagged();
1191
1273
  }
1192
1274
 
1275
+ void Eliminate() {
1276
+ // The stack check eliminator might try to eliminate the same stack
1277
+ // check instruction multiple times.
1278
+ if (IsLinked()) {
1279
+ DeleteFromGraph();
1280
+ }
1281
+ }
1282
+
1283
+ bool is_function_entry() { return type_ == kFunctionEntry; }
1284
+ bool is_backwards_branch() { return type_ == kBackwardsBranch; }
1285
+
1193
1286
  DECLARE_CONCRETE_INSTRUCTION(StackCheck)
1287
+
1288
+ private:
1289
+ Type type_;
1194
1290
  };
1195
1291
 
1196
1292
 
@@ -1251,6 +1347,24 @@ class HPushArgument: public HUnaryOperation {
1251
1347
  };
1252
1348
 
1253
1349
 
1350
+ class HThisFunction: public HTemplateInstruction<0> {
1351
+ public:
1352
+ HThisFunction() {
1353
+ set_representation(Representation::Tagged());
1354
+ SetFlag(kUseGVN);
1355
+ }
1356
+
1357
+ virtual Representation RequiredInputRepresentation(int index) const {
1358
+ return Representation::None();
1359
+ }
1360
+
1361
+ DECLARE_CONCRETE_INSTRUCTION(ThisFunction)
1362
+
1363
+ protected:
1364
+ virtual bool DataEquals(HValue* other) { return true; }
1365
+ };
1366
+
1367
+
1254
1368
  class HContext: public HTemplateInstruction<0> {
1255
1369
  public:
1256
1370
  HContext() {
@@ -1262,7 +1376,7 @@ class HContext: public HTemplateInstruction<0> {
1262
1376
  return Representation::None();
1263
1377
  }
1264
1378
 
1265
- DECLARE_CONCRETE_INSTRUCTION(Context);
1379
+ DECLARE_CONCRETE_INSTRUCTION(Context)
1266
1380
 
1267
1381
  protected:
1268
1382
  virtual bool DataEquals(HValue* other) { return true; }
@@ -1536,19 +1650,24 @@ class HCallNew: public HBinaryCall {
1536
1650
  };
1537
1651
 
1538
1652
 
1539
- class HCallRuntime: public HCall<0> {
1653
+ class HCallRuntime: public HCall<1> {
1540
1654
  public:
1541
- HCallRuntime(Handle<String> name,
1655
+ HCallRuntime(HValue* context,
1656
+ Handle<String> name,
1542
1657
  const Runtime::Function* c_function,
1543
1658
  int argument_count)
1544
- : HCall<0>(argument_count), c_function_(c_function), name_(name) { }
1659
+ : HCall<1>(argument_count), c_function_(c_function), name_(name) {
1660
+ SetOperandAt(0, context);
1661
+ }
1662
+
1545
1663
  virtual void PrintDataTo(StringStream* stream);
1546
1664
 
1665
+ HValue* context() { return OperandAt(0); }
1547
1666
  const Runtime::Function* function() const { return c_function_; }
1548
1667
  Handle<String> name() const { return name_; }
1549
1668
 
1550
1669
  virtual Representation RequiredInputRepresentation(int index) const {
1551
- return Representation::None();
1670
+ return Representation::Tagged();
1552
1671
  }
1553
1672
 
1554
1673
  DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
@@ -1559,12 +1678,14 @@ class HCallRuntime: public HCall<0> {
1559
1678
  };
1560
1679
 
1561
1680
 
1562
- class HJSArrayLength: public HUnaryOperation {
1681
+ class HJSArrayLength: public HTemplateInstruction<2> {
1563
1682
  public:
1564
- explicit HJSArrayLength(HValue* value) : HUnaryOperation(value) {
1683
+ HJSArrayLength(HValue* value, HValue* typecheck) {
1565
1684
  // The length of an array is stored as a tagged value in the array
1566
1685
  // object. It is guaranteed to be 32 bit integer, but it can be
1567
1686
  // represented as either a smi or heap number.
1687
+ SetOperandAt(0, value);
1688
+ SetOperandAt(1, typecheck);
1568
1689
  set_representation(Representation::Tagged());
1569
1690
  SetFlag(kUseGVN);
1570
1691
  SetFlag(kDependsOnArrayLengths);
@@ -1575,6 +1696,8 @@ class HJSArrayLength: public HUnaryOperation {
1575
1696
  return Representation::Tagged();
1576
1697
  }
1577
1698
 
1699
+ HValue* value() { return OperandAt(0); }
1700
+
1578
1701
  DECLARE_CONCRETE_INSTRUCTION(JSArrayLength)
1579
1702
 
1580
1703
  protected:
@@ -1582,9 +1705,9 @@ class HJSArrayLength: public HUnaryOperation {
1582
1705
  };
1583
1706
 
1584
1707
 
1585
- class HFixedArrayLength: public HUnaryOperation {
1708
+ class HFixedArrayBaseLength: public HUnaryOperation {
1586
1709
  public:
1587
- explicit HFixedArrayLength(HValue* value) : HUnaryOperation(value) {
1710
+ explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) {
1588
1711
  set_representation(Representation::Tagged());
1589
1712
  SetFlag(kUseGVN);
1590
1713
  SetFlag(kDependsOnArrayLengths);
@@ -1594,28 +1717,26 @@ class HFixedArrayLength: public HUnaryOperation {
1594
1717
  return Representation::Tagged();
1595
1718
  }
1596
1719
 
1597
- DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength)
1720
+ DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength)
1598
1721
 
1599
1722
  protected:
1600
1723
  virtual bool DataEquals(HValue* other) { return true; }
1601
1724
  };
1602
1725
 
1603
1726
 
1604
- class HExternalArrayLength: public HUnaryOperation {
1727
+ class HElementsKind: public HUnaryOperation {
1605
1728
  public:
1606
- explicit HExternalArrayLength(HValue* value) : HUnaryOperation(value) {
1729
+ explicit HElementsKind(HValue* value) : HUnaryOperation(value) {
1607
1730
  set_representation(Representation::Integer32());
1608
- // The result of this instruction is idempotent as long as its inputs don't
1609
- // change. The length of a pixel array cannot change once set, so it's not
1610
- // necessary to introduce a kDependsOnArrayLengths or any other dependency.
1611
1731
  SetFlag(kUseGVN);
1732
+ SetFlag(kDependsOnMaps);
1612
1733
  }
1613
1734
 
1614
1735
  virtual Representation RequiredInputRepresentation(int index) const {
1615
1736
  return Representation::Tagged();
1616
1737
  }
1617
1738
 
1618
- DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength)
1739
+ DECLARE_CONCRETE_INSTRUCTION(ElementsKind)
1619
1740
 
1620
1741
  protected:
1621
1742
  virtual bool DataEquals(HValue* other) { return true; }
@@ -1642,10 +1763,12 @@ class HBitNot: public HUnaryOperation {
1642
1763
  };
1643
1764
 
1644
1765
 
1645
- class HUnaryMathOperation: public HUnaryOperation {
1766
+ class HUnaryMathOperation: public HTemplateInstruction<2> {
1646
1767
  public:
1647
- HUnaryMathOperation(HValue* value, BuiltinFunctionId op)
1648
- : HUnaryOperation(value), op_(op) {
1768
+ HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
1769
+ : op_(op) {
1770
+ SetOperandAt(0, context);
1771
+ SetOperandAt(1, value);
1649
1772
  switch (op) {
1650
1773
  case kMathFloor:
1651
1774
  case kMathRound:
@@ -1669,6 +1792,9 @@ class HUnaryMathOperation: public HUnaryOperation {
1669
1792
  SetFlag(kUseGVN);
1670
1793
  }
1671
1794
 
1795
+ HValue* context() { return OperandAt(0); }
1796
+ HValue* value() { return OperandAt(1); }
1797
+
1672
1798
  virtual void PrintDataTo(StringStream* stream);
1673
1799
 
1674
1800
  virtual HType CalculateInferredType();
@@ -1676,21 +1802,25 @@ class HUnaryMathOperation: public HUnaryOperation {
1676
1802
  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
1677
1803
 
1678
1804
  virtual Representation RequiredInputRepresentation(int index) const {
1679
- switch (op_) {
1680
- case kMathFloor:
1681
- case kMathRound:
1682
- case kMathCeil:
1683
- case kMathSqrt:
1684
- case kMathPowHalf:
1685
- case kMathLog:
1686
- case kMathSin:
1687
- case kMathCos:
1688
- return Representation::Double();
1689
- case kMathAbs:
1690
- return representation();
1691
- default:
1692
- UNREACHABLE();
1693
- return Representation::None();
1805
+ if (index == 0) {
1806
+ return Representation::Tagged();
1807
+ } else {
1808
+ switch (op_) {
1809
+ case kMathFloor:
1810
+ case kMathRound:
1811
+ case kMathCeil:
1812
+ case kMathSqrt:
1813
+ case kMathPowHalf:
1814
+ case kMathLog:
1815
+ case kMathSin:
1816
+ case kMathCos:
1817
+ return Representation::Double();
1818
+ case kMathAbs:
1819
+ return representation();
1820
+ default:
1821
+ UNREACHABLE();
1822
+ return Representation::None();
1823
+ }
1694
1824
  }
1695
1825
  }
1696
1826
 
@@ -1762,27 +1892,26 @@ class HLoadExternalArrayPointer: public HUnaryOperation {
1762
1892
  };
1763
1893
 
1764
1894
 
1765
- class HCheckMap: public HUnaryOperation {
1895
+ class HCheckMap: public HTemplateInstruction<2> {
1766
1896
  public:
1767
- HCheckMap(HValue* value, Handle<Map> map)
1768
- : HUnaryOperation(value), map_(map) {
1897
+ HCheckMap(HValue* value, Handle<Map> map, HValue* typecheck = NULL)
1898
+ : map_(map) {
1899
+ SetOperandAt(0, value);
1900
+ // If callers don't depend on a typecheck, they can pass in NULL. In that
1901
+ // case we use a copy of the |value| argument as a dummy value.
1902
+ SetOperandAt(1, typecheck != NULL ? typecheck : value);
1769
1903
  set_representation(Representation::Tagged());
1770
1904
  SetFlag(kUseGVN);
1771
1905
  SetFlag(kDependsOnMaps);
1772
1906
  }
1773
1907
 
1774
- virtual bool IsCheckInstruction() const { return true; }
1775
-
1776
1908
  virtual Representation RequiredInputRepresentation(int index) const {
1777
1909
  return Representation::Tagged();
1778
1910
  }
1779
1911
  virtual void PrintDataTo(StringStream* stream);
1780
1912
  virtual HType CalculateInferredType();
1781
1913
 
1782
- #ifdef DEBUG
1783
- virtual void Verify();
1784
- #endif
1785
-
1914
+ HValue* value() { return OperandAt(0); }
1786
1915
  Handle<Map> map() const { return map_; }
1787
1916
 
1788
1917
  DECLARE_CONCRETE_INSTRUCTION(CheckMap)
@@ -1806,8 +1935,6 @@ class HCheckFunction: public HUnaryOperation {
1806
1935
  SetFlag(kUseGVN);
1807
1936
  }
1808
1937
 
1809
- virtual bool IsCheckInstruction() const { return true; }
1810
-
1811
1938
  virtual Representation RequiredInputRepresentation(int index) const {
1812
1939
  return Representation::Tagged();
1813
1940
  }
@@ -1835,8 +1962,8 @@ class HCheckFunction: public HUnaryOperation {
1835
1962
 
1836
1963
  class HCheckInstanceType: public HUnaryOperation {
1837
1964
  public:
1838
- static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value) {
1839
- return new HCheckInstanceType(value, IS_JS_OBJECT_OR_JS_FUNCTION);
1965
+ static HCheckInstanceType* NewIsSpecObject(HValue* value) {
1966
+ return new HCheckInstanceType(value, IS_SPEC_OBJECT);
1840
1967
  }
1841
1968
  static HCheckInstanceType* NewIsJSArray(HValue* value) {
1842
1969
  return new HCheckInstanceType(value, IS_JS_ARRAY);
@@ -1848,24 +1975,11 @@ class HCheckInstanceType: public HUnaryOperation {
1848
1975
  return new HCheckInstanceType(value, IS_SYMBOL);
1849
1976
  }
1850
1977
 
1851
- virtual bool IsCheckInstruction() const { return true; }
1852
-
1853
1978
  virtual Representation RequiredInputRepresentation(int index) const {
1854
1979
  return Representation::Tagged();
1855
1980
  }
1856
1981
 
1857
- #ifdef DEBUG
1858
- virtual void Verify();
1859
- #endif
1860
-
1861
- virtual HValue* Canonicalize() {
1862
- if (!value()->type().IsUninitialized() &&
1863
- value()->type().IsString() &&
1864
- check_ == IS_STRING) {
1865
- return NULL;
1866
- }
1867
- return this;
1868
- }
1982
+ virtual HValue* Canonicalize();
1869
1983
 
1870
1984
  bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; }
1871
1985
  void GetCheckInterval(InstanceType* first, InstanceType* last);
@@ -1884,7 +1998,7 @@ class HCheckInstanceType: public HUnaryOperation {
1884
1998
 
1885
1999
  private:
1886
2000
  enum Check {
1887
- IS_JS_OBJECT_OR_JS_FUNCTION,
2001
+ IS_SPEC_OBJECT,
1888
2002
  IS_JS_ARRAY,
1889
2003
  IS_STRING,
1890
2004
  IS_SYMBOL,
@@ -1908,8 +2022,6 @@ class HCheckNonSmi: public HUnaryOperation {
1908
2022
  SetFlag(kUseGVN);
1909
2023
  }
1910
2024
 
1911
- virtual bool IsCheckInstruction() const { return true; }
1912
-
1913
2025
  virtual Representation RequiredInputRepresentation(int index) const {
1914
2026
  return Representation::Tagged();
1915
2027
  }
@@ -1947,8 +2059,6 @@ class HCheckPrototypeMaps: public HTemplateInstruction<0> {
1947
2059
  SetFlag(kDependsOnMaps);
1948
2060
  }
1949
2061
 
1950
- virtual bool IsCheckInstruction() const { return true; }
1951
-
1952
2062
  #ifdef DEBUG
1953
2063
  virtual void Verify();
1954
2064
  #endif
@@ -1989,8 +2099,6 @@ class HCheckSmi: public HUnaryOperation {
1989
2099
  SetFlag(kUseGVN);
1990
2100
  }
1991
2101
 
1992
- virtual bool IsCheckInstruction() const { return true; }
1993
-
1994
2102
  virtual Representation RequiredInputRepresentation(int index) const {
1995
2103
  return Representation::Tagged();
1996
2104
  }
@@ -2205,16 +2313,18 @@ class HConstant: public HTemplateInstruction<0> {
2205
2313
  };
2206
2314
 
2207
2315
 
2208
- class HBinaryOperation: public HTemplateInstruction<2> {
2316
+ class HBinaryOperation: public HTemplateInstruction<3> {
2209
2317
  public:
2210
- HBinaryOperation(HValue* left, HValue* right) {
2318
+ HBinaryOperation(HValue* context, HValue* left, HValue* right) {
2211
2319
  ASSERT(left != NULL && right != NULL);
2212
- SetOperandAt(0, left);
2213
- SetOperandAt(1, right);
2320
+ SetOperandAt(0, context);
2321
+ SetOperandAt(1, left);
2322
+ SetOperandAt(2, right);
2214
2323
  }
2215
2324
 
2216
- HValue* left() { return OperandAt(0); }
2217
- HValue* right() { return OperandAt(1); }
2325
+ HValue* context() { return OperandAt(0); }
2326
+ HValue* left() { return OperandAt(1); }
2327
+ HValue* right() { return OperandAt(2); }
2218
2328
 
2219
2329
  // TODO(kasperl): Move these helpers to the IA-32 Lithium
2220
2330
  // instruction sequence builder.
@@ -2330,25 +2440,23 @@ class HAccessArgumentsAt: public HTemplateInstruction<3> {
2330
2440
  };
2331
2441
 
2332
2442
 
2333
- class HBoundsCheck: public HBinaryOperation {
2443
+ class HBoundsCheck: public HTemplateInstruction<2> {
2334
2444
  public:
2335
- HBoundsCheck(HValue* index, HValue* length)
2336
- : HBinaryOperation(index, length) {
2445
+ HBoundsCheck(HValue* index, HValue* length) {
2446
+ SetOperandAt(0, index);
2447
+ SetOperandAt(1, length);
2448
+ set_representation(Representation::Integer32());
2337
2449
  SetFlag(kUseGVN);
2338
2450
  }
2339
2451
 
2340
- virtual bool IsCheckInstruction() const { return true; }
2341
-
2342
2452
  virtual Representation RequiredInputRepresentation(int index) const {
2343
2453
  return Representation::Integer32();
2344
2454
  }
2345
2455
 
2346
- #ifdef DEBUG
2347
- virtual void Verify();
2348
- #endif
2456
+ virtual void PrintDataTo(StringStream* stream);
2349
2457
 
2350
- HValue* index() { return left(); }
2351
- HValue* length() { return right(); }
2458
+ HValue* index() { return OperandAt(0); }
2459
+ HValue* length() { return OperandAt(1); }
2352
2460
 
2353
2461
  DECLARE_CONCRETE_INSTRUCTION(BoundsCheck)
2354
2462
 
@@ -2359,15 +2467,17 @@ class HBoundsCheck: public HBinaryOperation {
2359
2467
 
2360
2468
  class HBitwiseBinaryOperation: public HBinaryOperation {
2361
2469
  public:
2362
- HBitwiseBinaryOperation(HValue* left, HValue* right)
2363
- : HBinaryOperation(left, right) {
2470
+ HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right)
2471
+ : HBinaryOperation(context, left, right) {
2364
2472
  set_representation(Representation::Tagged());
2365
2473
  SetFlag(kFlexibleRepresentation);
2366
2474
  SetAllSideEffects();
2367
2475
  }
2368
2476
 
2369
2477
  virtual Representation RequiredInputRepresentation(int index) const {
2370
- return representation();
2478
+ return index == 0
2479
+ ? Representation::Tagged()
2480
+ : representation();
2371
2481
  }
2372
2482
 
2373
2483
  virtual void RepresentationChanged(Representation to) {
@@ -2387,8 +2497,8 @@ class HBitwiseBinaryOperation: public HBinaryOperation {
2387
2497
 
2388
2498
  class HArithmeticBinaryOperation: public HBinaryOperation {
2389
2499
  public:
2390
- HArithmeticBinaryOperation(HValue* left, HValue* right)
2391
- : HBinaryOperation(left, right) {
2500
+ HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
2501
+ : HBinaryOperation(context, left, right) {
2392
2502
  set_representation(Representation::Tagged());
2393
2503
  SetFlag(kFlexibleRepresentation);
2394
2504
  SetAllSideEffects();
@@ -2403,8 +2513,11 @@ class HArithmeticBinaryOperation: public HBinaryOperation {
2403
2513
 
2404
2514
  virtual HType CalculateInferredType();
2405
2515
  virtual Representation RequiredInputRepresentation(int index) const {
2406
- return representation();
2516
+ return index == 0
2517
+ ? Representation::Tagged()
2518
+ : representation();
2407
2519
  }
2520
+
2408
2521
  virtual Representation InferredRepresentation() {
2409
2522
  if (left()->representation().Equals(right()->representation())) {
2410
2523
  return left()->representation();
@@ -2414,208 +2527,186 @@ class HArithmeticBinaryOperation: public HBinaryOperation {
2414
2527
  };
2415
2528
 
2416
2529
 
2417
- class HCompare: public HBinaryOperation {
2530
+ class HCompareGeneric: public HBinaryOperation {
2418
2531
  public:
2419
- HCompare(HValue* left, HValue* right, Token::Value token)
2420
- : HBinaryOperation(left, right), token_(token) {
2532
+ HCompareGeneric(HValue* context,
2533
+ HValue* left,
2534
+ HValue* right,
2535
+ Token::Value token)
2536
+ : HBinaryOperation(context, left, right), token_(token) {
2421
2537
  ASSERT(Token::IsCompareOp(token));
2422
2538
  set_representation(Representation::Tagged());
2423
2539
  SetAllSideEffects();
2424
2540
  }
2425
2541
 
2426
- void SetInputRepresentation(Representation r);
2427
-
2428
- virtual bool EmitAtUses() {
2429
- return !HasSideEffects() && !HasMultipleUses();
2430
- }
2431
-
2432
2542
  virtual Representation RequiredInputRepresentation(int index) const {
2433
- return input_representation_;
2543
+ return Representation::Tagged();
2434
2544
  }
2545
+
2435
2546
  Representation GetInputRepresentation() const {
2436
- return input_representation_;
2547
+ return Representation::Tagged();
2437
2548
  }
2549
+
2438
2550
  Token::Value token() const { return token_; }
2439
2551
  virtual void PrintDataTo(StringStream* stream);
2440
2552
 
2441
2553
  virtual HType CalculateInferredType();
2442
2554
 
2443
- virtual intptr_t Hashcode() {
2444
- return HValue::Hashcode() * 7 + token_;
2445
- }
2446
-
2447
- DECLARE_CONCRETE_INSTRUCTION(Compare)
2448
-
2449
- protected:
2450
- virtual bool DataEquals(HValue* other) {
2451
- HCompare* comp = HCompare::cast(other);
2452
- return token_ == comp->token();
2453
- }
2555
+ DECLARE_CONCRETE_INSTRUCTION(CompareGeneric)
2454
2556
 
2455
2557
  private:
2456
- Representation input_representation_;
2457
2558
  Token::Value token_;
2458
2559
  };
2459
2560
 
2460
2561
 
2461
- class HCompareJSObjectEq: public HBinaryOperation {
2562
+ class HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> {
2462
2563
  public:
2463
- HCompareJSObjectEq(HValue* left, HValue* right)
2464
- : HBinaryOperation(left, right) {
2465
- set_representation(Representation::Tagged());
2466
- SetFlag(kUseGVN);
2467
- SetFlag(kDependsOnMaps);
2564
+ HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token)
2565
+ : token_(token) {
2566
+ ASSERT(Token::IsCompareOp(token));
2567
+ SetOperandAt(0, left);
2568
+ SetOperandAt(1, right);
2468
2569
  }
2469
2570
 
2470
- virtual bool EmitAtUses() {
2471
- return !HasSideEffects() && !HasMultipleUses();
2571
+ HValue* left() { return OperandAt(0); }
2572
+ HValue* right() { return OperandAt(1); }
2573
+ Token::Value token() const { return token_; }
2574
+
2575
+ void SetInputRepresentation(Representation r);
2576
+ Representation GetInputRepresentation() const {
2577
+ return input_representation_;
2472
2578
  }
2473
2579
 
2474
2580
  virtual Representation RequiredInputRepresentation(int index) const {
2475
- return Representation::Tagged();
2581
+ return input_representation_;
2476
2582
  }
2477
- virtual HType CalculateInferredType();
2583
+ virtual void PrintDataTo(StringStream* stream);
2478
2584
 
2479
- DECLARE_CONCRETE_INSTRUCTION(CompareJSObjectEq)
2585
+ DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch)
2480
2586
 
2481
- protected:
2482
- virtual bool DataEquals(HValue* other) { return true; }
2587
+ private:
2588
+ Representation input_representation_;
2589
+ Token::Value token_;
2483
2590
  };
2484
2591
 
2485
2592
 
2486
- class HCompareSymbolEq: public HBinaryOperation {
2593
+ class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
2487
2594
  public:
2488
- HCompareSymbolEq(HValue* left, HValue* right, Token::Value op)
2489
- : HBinaryOperation(left, right), op_(op) {
2490
- ASSERT(op == Token::EQ || op == Token::EQ_STRICT);
2491
- set_representation(Representation::Tagged());
2492
- SetFlag(kUseGVN);
2493
- SetFlag(kDependsOnMaps);
2595
+ HCompareObjectEqAndBranch(HValue* left, HValue* right) {
2596
+ SetOperandAt(0, left);
2597
+ SetOperandAt(1, right);
2494
2598
  }
2495
2599
 
2496
- Token::Value op() const { return op_; }
2497
-
2498
- virtual bool EmitAtUses() {
2499
- return !HasSideEffects() && !HasMultipleUses();
2500
- }
2600
+ HValue* left() { return OperandAt(0); }
2601
+ HValue* right() { return OperandAt(1); }
2501
2602
 
2502
2603
  virtual Representation RequiredInputRepresentation(int index) const {
2503
2604
  return Representation::Tagged();
2504
2605
  }
2505
2606
 
2506
- virtual HType CalculateInferredType() { return HType::Boolean(); }
2507
-
2508
- DECLARE_CONCRETE_INSTRUCTION(CompareSymbolEq);
2509
-
2510
- protected:
2511
- virtual bool DataEquals(HValue* other) {
2512
- return op_ == HCompareSymbolEq::cast(other)->op_;
2513
- }
2514
-
2515
- private:
2516
- const Token::Value op_;
2607
+ DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch)
2517
2608
  };
2518
2609
 
2519
2610
 
2520
- class HUnaryPredicate: public HUnaryOperation {
2611
+ class HCompareConstantEqAndBranch: public HUnaryControlInstruction {
2521
2612
  public:
2522
- explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) {
2523
- set_representation(Representation::Tagged());
2524
- SetFlag(kUseGVN);
2613
+ HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op)
2614
+ : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) {
2615
+ ASSERT(op == Token::EQ_STRICT);
2525
2616
  }
2526
2617
 
2527
- virtual bool EmitAtUses() {
2528
- return !HasSideEffects() && !HasMultipleUses();
2529
- }
2618
+ Token::Value op() const { return op_; }
2619
+ HValue* left() { return value(); }
2620
+ int right() const { return right_; }
2530
2621
 
2531
2622
  virtual Representation RequiredInputRepresentation(int index) const {
2532
- return Representation::Tagged();
2623
+ return Representation::Integer32();
2533
2624
  }
2534
- virtual HType CalculateInferredType();
2625
+
2626
+ DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch);
2627
+
2628
+ private:
2629
+ const Token::Value op_;
2630
+ const int right_;
2535
2631
  };
2536
2632
 
2537
2633
 
2538
- class HIsNull: public HUnaryPredicate {
2634
+ class HIsNullAndBranch: public HUnaryControlInstruction {
2539
2635
  public:
2540
- HIsNull(HValue* value, bool is_strict)
2541
- : HUnaryPredicate(value), is_strict_(is_strict) { }
2636
+ HIsNullAndBranch(HValue* value, bool is_strict)
2637
+ : HUnaryControlInstruction(value, NULL, NULL), is_strict_(is_strict) { }
2542
2638
 
2543
2639
  bool is_strict() const { return is_strict_; }
2544
2640
 
2545
- DECLARE_CONCRETE_INSTRUCTION(IsNull)
2546
-
2547
- protected:
2548
- virtual bool DataEquals(HValue* other) {
2549
- HIsNull* b = HIsNull::cast(other);
2550
- return is_strict_ == b->is_strict();
2641
+ virtual Representation RequiredInputRepresentation(int index) const {
2642
+ return Representation::Tagged();
2551
2643
  }
2552
2644
 
2645
+ DECLARE_CONCRETE_INSTRUCTION(IsNullAndBranch)
2646
+
2553
2647
  private:
2554
2648
  bool is_strict_;
2555
2649
  };
2556
2650
 
2557
2651
 
2558
- class HIsObject: public HUnaryPredicate {
2652
+ class HIsObjectAndBranch: public HUnaryControlInstruction {
2559
2653
  public:
2560
- explicit HIsObject(HValue* value) : HUnaryPredicate(value) { }
2654
+ explicit HIsObjectAndBranch(HValue* value)
2655
+ : HUnaryControlInstruction(value, NULL, NULL) { }
2561
2656
 
2562
- DECLARE_CONCRETE_INSTRUCTION(IsObject)
2657
+ virtual Representation RequiredInputRepresentation(int index) const {
2658
+ return Representation::Tagged();
2659
+ }
2563
2660
 
2564
- protected:
2565
- virtual bool DataEquals(HValue* other) { return true; }
2661
+ DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch)
2566
2662
  };
2567
2663
 
2568
2664
 
2569
- class HIsSmi: public HUnaryPredicate {
2665
+ class HIsSmiAndBranch: public HUnaryControlInstruction {
2570
2666
  public:
2571
- explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { }
2667
+ explicit HIsSmiAndBranch(HValue* value)
2668
+ : HUnaryControlInstruction(value, NULL, NULL) { }
2572
2669
 
2573
- DECLARE_CONCRETE_INSTRUCTION(IsSmi)
2670
+ DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch)
2671
+
2672
+ virtual Representation RequiredInputRepresentation(int index) const {
2673
+ return Representation::Tagged();
2674
+ }
2574
2675
 
2575
2676
  protected:
2576
2677
  virtual bool DataEquals(HValue* other) { return true; }
2577
2678
  };
2578
2679
 
2579
2680
 
2580
- class HIsUndetectable: public HUnaryPredicate {
2681
+ class HIsUndetectableAndBranch: public HUnaryControlInstruction {
2581
2682
  public:
2582
- explicit HIsUndetectable(HValue* value) : HUnaryPredicate(value) { }
2683
+ explicit HIsUndetectableAndBranch(HValue* value)
2684
+ : HUnaryControlInstruction(value, NULL, NULL) { }
2583
2685
 
2584
- DECLARE_CONCRETE_INSTRUCTION(IsUndetectable)
2686
+ virtual Representation RequiredInputRepresentation(int index) const {
2687
+ return Representation::Tagged();
2688
+ }
2585
2689
 
2586
- protected:
2587
- virtual bool DataEquals(HValue* other) { return true; }
2690
+ DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch)
2588
2691
  };
2589
2692
 
2590
2693
 
2591
- class HIsConstructCall: public HTemplateInstruction<0> {
2694
+ class HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> {
2592
2695
  public:
2593
- HIsConstructCall() {
2594
- set_representation(Representation::Tagged());
2595
- SetFlag(kUseGVN);
2596
- }
2597
-
2598
- virtual bool EmitAtUses() {
2599
- return !HasSideEffects() && !HasMultipleUses();
2600
- }
2601
-
2602
2696
  virtual Representation RequiredInputRepresentation(int index) const {
2603
2697
  return Representation::None();
2604
2698
  }
2605
2699
 
2606
- DECLARE_CONCRETE_INSTRUCTION(IsConstructCall)
2607
-
2608
- protected:
2609
- virtual bool DataEquals(HValue* other) { return true; }
2700
+ DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch)
2610
2701
  };
2611
2702
 
2612
2703
 
2613
- class HHasInstanceType: public HUnaryPredicate {
2704
+ class HHasInstanceTypeAndBranch: public HUnaryControlInstruction {
2614
2705
  public:
2615
- HHasInstanceType(HValue* value, InstanceType type)
2616
- : HUnaryPredicate(value), from_(type), to_(type) { }
2617
- HHasInstanceType(HValue* value, InstanceType from, InstanceType to)
2618
- : HUnaryPredicate(value), from_(from), to_(to) {
2706
+ HHasInstanceTypeAndBranch(HValue* value, InstanceType type)
2707
+ : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { }
2708
+ HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to)
2709
+ : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) {
2619
2710
  ASSERT(to == LAST_TYPE); // Others not implemented yet in backend.
2620
2711
  }
2621
2712
 
@@ -2624,34 +2715,41 @@ class HHasInstanceType: public HUnaryPredicate {
2624
2715
 
2625
2716
  virtual void PrintDataTo(StringStream* stream);
2626
2717
 
2627
- DECLARE_CONCRETE_INSTRUCTION(HasInstanceType)
2628
-
2629
- protected:
2630
- virtual bool DataEquals(HValue* other) {
2631
- HHasInstanceType* b = HHasInstanceType::cast(other);
2632
- return (from_ == b->from()) && (to_ == b->to());
2718
+ virtual Representation RequiredInputRepresentation(int index) const {
2719
+ return Representation::Tagged();
2633
2720
  }
2634
2721
 
2722
+ DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch)
2723
+
2635
2724
  private:
2636
2725
  InstanceType from_;
2637
2726
  InstanceType to_; // Inclusive range, not all combinations work.
2638
2727
  };
2639
2728
 
2640
2729
 
2641
- class HHasCachedArrayIndex: public HUnaryPredicate {
2730
+ class HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction {
2642
2731
  public:
2643
- explicit HHasCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2732
+ explicit HHasCachedArrayIndexAndBranch(HValue* value)
2733
+ : HUnaryControlInstruction(value, NULL, NULL) { }
2644
2734
 
2645
- DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex)
2735
+ virtual Representation RequiredInputRepresentation(int index) const {
2736
+ return Representation::Tagged();
2737
+ }
2646
2738
 
2647
- protected:
2648
- virtual bool DataEquals(HValue* other) { return true; }
2739
+ DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch)
2649
2740
  };
2650
2741
 
2651
2742
 
2652
- class HGetCachedArrayIndex: public HUnaryPredicate {
2743
+ class HGetCachedArrayIndex: public HUnaryOperation {
2653
2744
  public:
2654
- explicit HGetCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { }
2745
+ explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) {
2746
+ set_representation(Representation::Tagged());
2747
+ SetFlag(kUseGVN);
2748
+ }
2749
+
2750
+ virtual Representation RequiredInputRepresentation(int index) const {
2751
+ return Representation::Tagged();
2752
+ }
2655
2753
 
2656
2754
  DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex)
2657
2755
 
@@ -2660,42 +2758,40 @@ class HGetCachedArrayIndex: public HUnaryPredicate {
2660
2758
  };
2661
2759
 
2662
2760
 
2663
- class HClassOfTest: public HUnaryPredicate {
2761
+ class HClassOfTestAndBranch: public HUnaryControlInstruction {
2664
2762
  public:
2665
- HClassOfTest(HValue* value, Handle<String> class_name)
2666
- : HUnaryPredicate(value), class_name_(class_name) { }
2763
+ HClassOfTestAndBranch(HValue* value, Handle<String> class_name)
2764
+ : HUnaryControlInstruction(value, NULL, NULL),
2765
+ class_name_(class_name) { }
2766
+
2767
+ DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch)
2667
2768
 
2668
- DECLARE_CONCRETE_INSTRUCTION(ClassOfTest)
2769
+ virtual Representation RequiredInputRepresentation(int index) const {
2770
+ return Representation::Tagged();
2771
+ }
2669
2772
 
2670
2773
  virtual void PrintDataTo(StringStream* stream);
2671
2774
 
2672
2775
  Handle<String> class_name() const { return class_name_; }
2673
2776
 
2674
- protected:
2675
- virtual bool DataEquals(HValue* other) {
2676
- HClassOfTest* b = HClassOfTest::cast(other);
2677
- return class_name_.is_identical_to(b->class_name_);
2678
- }
2679
-
2680
2777
  private:
2681
2778
  Handle<String> class_name_;
2682
2779
  };
2683
2780
 
2684
2781
 
2685
- class HTypeofIs: public HUnaryPredicate {
2782
+ class HTypeofIsAndBranch: public HUnaryControlInstruction {
2686
2783
  public:
2687
- HTypeofIs(HValue* value, Handle<String> type_literal)
2688
- : HUnaryPredicate(value), type_literal_(type_literal) { }
2784
+ HTypeofIsAndBranch(HValue* value, Handle<String> type_literal)
2785
+ : HUnaryControlInstruction(value, NULL, NULL),
2786
+ type_literal_(type_literal) { }
2689
2787
 
2690
2788
  Handle<String> type_literal() { return type_literal_; }
2691
2789
  virtual void PrintDataTo(StringStream* stream);
2692
2790
 
2693
- DECLARE_CONCRETE_INSTRUCTION(TypeofIs)
2791
+ DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch)
2694
2792
 
2695
- protected:
2696
- virtual bool DataEquals(HValue* other) {
2697
- HTypeofIs* b = HTypeofIs::cast(other);
2698
- return type_literal_.is_identical_to(b->type_literal_);
2793
+ virtual Representation RequiredInputRepresentation(int index) const {
2794
+ return Representation::Tagged();
2699
2795
  }
2700
2796
 
2701
2797
  private:
@@ -2703,48 +2799,48 @@ class HTypeofIs: public HUnaryPredicate {
2703
2799
  };
2704
2800
 
2705
2801
 
2706
- class HInstanceOf: public HTemplateInstruction<3> {
2802
+ class HInstanceOf: public HBinaryOperation {
2707
2803
  public:
2708
- HInstanceOf(HValue* context, HValue* left, HValue* right) {
2709
- SetOperandAt(0, context);
2710
- SetOperandAt(1, left);
2711
- SetOperandAt(2, right);
2804
+ HInstanceOf(HValue* context, HValue* left, HValue* right)
2805
+ : HBinaryOperation(context, left, right) {
2712
2806
  set_representation(Representation::Tagged());
2713
2807
  SetAllSideEffects();
2714
2808
  }
2715
2809
 
2716
- HValue* context() { return OperandAt(0); }
2717
- HValue* left() { return OperandAt(1); }
2718
- HValue* right() { return OperandAt(2); }
2719
-
2720
- virtual bool EmitAtUses() {
2721
- return !HasSideEffects() && !HasMultipleUses();
2722
- }
2723
-
2724
2810
  virtual Representation RequiredInputRepresentation(int index) const {
2725
2811
  return Representation::Tagged();
2726
2812
  }
2727
2813
 
2814
+ virtual HType CalculateInferredType();
2815
+
2728
2816
  virtual void PrintDataTo(StringStream* stream);
2729
2817
 
2730
2818
  DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
2731
2819
  };
2732
2820
 
2733
2821
 
2734
- class HInstanceOfKnownGlobal: public HUnaryOperation {
2822
+ class HInstanceOfKnownGlobal: public HTemplateInstruction<2> {
2735
2823
  public:
2736
- HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right)
2737
- : HUnaryOperation(left), function_(right) {
2824
+ HInstanceOfKnownGlobal(HValue* context,
2825
+ HValue* left,
2826
+ Handle<JSFunction> right)
2827
+ : function_(right) {
2828
+ SetOperandAt(0, context);
2829
+ SetOperandAt(1, left);
2738
2830
  set_representation(Representation::Tagged());
2739
2831
  SetAllSideEffects();
2740
2832
  }
2741
2833
 
2834
+ HValue* context() { return OperandAt(0); }
2835
+ HValue* left() { return OperandAt(1); }
2742
2836
  Handle<JSFunction> function() { return function_; }
2743
2837
 
2744
2838
  virtual Representation RequiredInputRepresentation(int index) const {
2745
2839
  return Representation::Tagged();
2746
2840
  }
2747
2841
 
2842
+ virtual HType CalculateInferredType();
2843
+
2748
2844
  DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal)
2749
2845
 
2750
2846
  private:
@@ -2752,16 +2848,22 @@ class HInstanceOfKnownGlobal: public HUnaryOperation {
2752
2848
  };
2753
2849
 
2754
2850
 
2755
- class HPower: public HBinaryOperation {
2851
+ class HPower: public HTemplateInstruction<2> {
2756
2852
  public:
2757
- HPower(HValue* left, HValue* right)
2758
- : HBinaryOperation(left, right) {
2853
+ HPower(HValue* left, HValue* right) {
2854
+ SetOperandAt(0, left);
2855
+ SetOperandAt(1, right);
2759
2856
  set_representation(Representation::Double());
2760
2857
  SetFlag(kUseGVN);
2761
2858
  }
2762
2859
 
2860
+ HValue* left() { return OperandAt(0); }
2861
+ HValue* right() { return OperandAt(1); }
2862
+
2763
2863
  virtual Representation RequiredInputRepresentation(int index) const {
2764
- return (index == 1) ? Representation::None() : Representation::Double();
2864
+ return index == 0
2865
+ ? Representation::Double()
2866
+ : Representation::None();
2765
2867
  }
2766
2868
 
2767
2869
  DECLARE_CONCRETE_INSTRUCTION(Power)
@@ -2773,7 +2875,8 @@ class HPower: public HBinaryOperation {
2773
2875
 
2774
2876
  class HAdd: public HArithmeticBinaryOperation {
2775
2877
  public:
2776
- HAdd(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2878
+ HAdd(HValue* context, HValue* left, HValue* right)
2879
+ : HArithmeticBinaryOperation(context, left, right) {
2777
2880
  SetFlag(kCanOverflow);
2778
2881
  }
2779
2882
 
@@ -2798,7 +2901,8 @@ class HAdd: public HArithmeticBinaryOperation {
2798
2901
 
2799
2902
  class HSub: public HArithmeticBinaryOperation {
2800
2903
  public:
2801
- HSub(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2904
+ HSub(HValue* context, HValue* left, HValue* right)
2905
+ : HArithmeticBinaryOperation(context, left, right) {
2802
2906
  SetFlag(kCanOverflow);
2803
2907
  }
2804
2908
 
@@ -2815,7 +2919,8 @@ class HSub: public HArithmeticBinaryOperation {
2815
2919
 
2816
2920
  class HMul: public HArithmeticBinaryOperation {
2817
2921
  public:
2818
- HMul(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2922
+ HMul(HValue* context, HValue* left, HValue* right)
2923
+ : HArithmeticBinaryOperation(context, left, right) {
2819
2924
  SetFlag(kCanOverflow);
2820
2925
  }
2821
2926
 
@@ -2837,7 +2942,8 @@ class HMul: public HArithmeticBinaryOperation {
2837
2942
 
2838
2943
  class HMod: public HArithmeticBinaryOperation {
2839
2944
  public:
2840
- HMod(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2945
+ HMod(HValue* context, HValue* left, HValue* right)
2946
+ : HArithmeticBinaryOperation(context, left, right) {
2841
2947
  SetFlag(kCanBeDivByZero);
2842
2948
  }
2843
2949
 
@@ -2864,7 +2970,8 @@ class HMod: public HArithmeticBinaryOperation {
2864
2970
 
2865
2971
  class HDiv: public HArithmeticBinaryOperation {
2866
2972
  public:
2867
- HDiv(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) {
2973
+ HDiv(HValue* context, HValue* left, HValue* right)
2974
+ : HArithmeticBinaryOperation(context, left, right) {
2868
2975
  SetFlag(kCanBeDivByZero);
2869
2976
  SetFlag(kCanOverflow);
2870
2977
  }
@@ -2882,8 +2989,8 @@ class HDiv: public HArithmeticBinaryOperation {
2882
2989
 
2883
2990
  class HBitAnd: public HBitwiseBinaryOperation {
2884
2991
  public:
2885
- HBitAnd(HValue* left, HValue* right)
2886
- : HBitwiseBinaryOperation(left, right) { }
2992
+ HBitAnd(HValue* context, HValue* left, HValue* right)
2993
+ : HBitwiseBinaryOperation(context, left, right) { }
2887
2994
 
2888
2995
  virtual bool IsCommutative() const { return true; }
2889
2996
  virtual HType CalculateInferredType();
@@ -2899,8 +3006,8 @@ class HBitAnd: public HBitwiseBinaryOperation {
2899
3006
 
2900
3007
  class HBitXor: public HBitwiseBinaryOperation {
2901
3008
  public:
2902
- HBitXor(HValue* left, HValue* right)
2903
- : HBitwiseBinaryOperation(left, right) { }
3009
+ HBitXor(HValue* context, HValue* left, HValue* right)
3010
+ : HBitwiseBinaryOperation(context, left, right) { }
2904
3011
 
2905
3012
  virtual bool IsCommutative() const { return true; }
2906
3013
  virtual HType CalculateInferredType();
@@ -2914,8 +3021,8 @@ class HBitXor: public HBitwiseBinaryOperation {
2914
3021
 
2915
3022
  class HBitOr: public HBitwiseBinaryOperation {
2916
3023
  public:
2917
- HBitOr(HValue* left, HValue* right)
2918
- : HBitwiseBinaryOperation(left, right) { }
3024
+ HBitOr(HValue* context, HValue* left, HValue* right)
3025
+ : HBitwiseBinaryOperation(context, left, right) { }
2919
3026
 
2920
3027
  virtual bool IsCommutative() const { return true; }
2921
3028
  virtual HType CalculateInferredType();
@@ -2931,8 +3038,8 @@ class HBitOr: public HBitwiseBinaryOperation {
2931
3038
 
2932
3039
  class HShl: public HBitwiseBinaryOperation {
2933
3040
  public:
2934
- HShl(HValue* left, HValue* right)
2935
- : HBitwiseBinaryOperation(left, right) { }
3041
+ HShl(HValue* context, HValue* left, HValue* right)
3042
+ : HBitwiseBinaryOperation(context, left, right) { }
2936
3043
 
2937
3044
  virtual Range* InferRange();
2938
3045
  virtual HType CalculateInferredType();
@@ -2946,9 +3053,10 @@ class HShl: public HBitwiseBinaryOperation {
2946
3053
 
2947
3054
  class HShr: public HBitwiseBinaryOperation {
2948
3055
  public:
2949
- HShr(HValue* left, HValue* right)
2950
- : HBitwiseBinaryOperation(left, right) { }
3056
+ HShr(HValue* context, HValue* left, HValue* right)
3057
+ : HBitwiseBinaryOperation(context, left, right) { }
2951
3058
 
3059
+ virtual Range* InferRange();
2952
3060
  virtual HType CalculateInferredType();
2953
3061
 
2954
3062
  DECLARE_CONCRETE_INSTRUCTION(Shr)
@@ -2960,8 +3068,8 @@ class HShr: public HBitwiseBinaryOperation {
2960
3068
 
2961
3069
  class HSar: public HBitwiseBinaryOperation {
2962
3070
  public:
2963
- HSar(HValue* left, HValue* right)
2964
- : HBitwiseBinaryOperation(left, right) { }
3071
+ HSar(HValue* context, HValue* left, HValue* right)
3072
+ : HBitwiseBinaryOperation(context, left, right) { }
2965
3073
 
2966
3074
  virtual Range* InferRange();
2967
3075
  virtual HType CalculateInferredType();
@@ -3095,15 +3203,16 @@ class HLoadGlobalCell: public HTemplateInstruction<0> {
3095
3203
  };
3096
3204
 
3097
3205
 
3098
- class HLoadGlobalGeneric: public HBinaryOperation {
3206
+ class HLoadGlobalGeneric: public HTemplateInstruction<2> {
3099
3207
  public:
3100
3208
  HLoadGlobalGeneric(HValue* context,
3101
3209
  HValue* global_object,
3102
3210
  Handle<Object> name,
3103
3211
  bool for_typeof)
3104
- : HBinaryOperation(context, global_object),
3105
- name_(name),
3212
+ : name_(name),
3106
3213
  for_typeof_(for_typeof) {
3214
+ SetOperandAt(0, context);
3215
+ SetOperandAt(1, global_object);
3107
3216
  set_representation(Representation::Tagged());
3108
3217
  SetAllSideEffects();
3109
3218
  }
@@ -3221,15 +3330,18 @@ class HLoadContextSlot: public HUnaryOperation {
3221
3330
 
3222
3331
 
3223
3332
  static inline bool StoringValueNeedsWriteBarrier(HValue* value) {
3224
- return !value->type().IsSmi() &&
3225
- !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
3333
+ return !value->type().IsBoolean()
3334
+ && !value->type().IsSmi()
3335
+ && !(value->IsConstant() && HConstant::cast(value)->InOldSpace());
3226
3336
  }
3227
3337
 
3228
3338
 
3229
- class HStoreContextSlot: public HBinaryOperation {
3339
+ class HStoreContextSlot: public HTemplateInstruction<2> {
3230
3340
  public:
3231
3341
  HStoreContextSlot(HValue* context, int slot_index, HValue* value)
3232
- : HBinaryOperation(context, value), slot_index_(slot_index) {
3342
+ : slot_index_(slot_index) {
3343
+ SetOperandAt(0, context);
3344
+ SetOperandAt(1, value);
3233
3345
  SetFlag(kChangesContextSlots);
3234
3346
  }
3235
3347
 
@@ -3293,14 +3405,16 @@ class HLoadNamedField: public HUnaryOperation {
3293
3405
  };
3294
3406
 
3295
3407
 
3296
- class HLoadNamedFieldPolymorphic: public HUnaryOperation {
3408
+ class HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> {
3297
3409
  public:
3298
- HLoadNamedFieldPolymorphic(HValue* object,
3299
- ZoneMapList* types,
3410
+ HLoadNamedFieldPolymorphic(HValue* context,
3411
+ HValue* object,
3412
+ SmallMapList* types,
3300
3413
  Handle<String> name);
3301
3414
 
3302
- HValue* object() { return OperandAt(0); }
3303
- ZoneMapList* types() { return &types_; }
3415
+ HValue* context() { return OperandAt(0); }
3416
+ HValue* object() { return OperandAt(1); }
3417
+ SmallMapList* types() { return &types_; }
3304
3418
  Handle<String> name() { return name_; }
3305
3419
  bool need_generic() { return need_generic_; }
3306
3420
 
@@ -3308,6 +3422,8 @@ class HLoadNamedFieldPolymorphic: public HUnaryOperation {
3308
3422
  return Representation::Tagged();
3309
3423
  }
3310
3424
 
3425
+ virtual void PrintDataTo(StringStream* stream);
3426
+
3311
3427
  DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic)
3312
3428
 
3313
3429
  static const int kMaxLoadPolymorphism = 4;
@@ -3316,17 +3432,19 @@ class HLoadNamedFieldPolymorphic: public HUnaryOperation {
3316
3432
  virtual bool DataEquals(HValue* value);
3317
3433
 
3318
3434
  private:
3319
- ZoneMapList types_;
3435
+ SmallMapList types_;
3320
3436
  Handle<String> name_;
3321
3437
  bool need_generic_;
3322
3438
  };
3323
3439
 
3324
3440
 
3325
3441
 
3326
- class HLoadNamedGeneric: public HBinaryOperation {
3442
+ class HLoadNamedGeneric: public HTemplateInstruction<2> {
3327
3443
  public:
3328
3444
  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
3329
- : HBinaryOperation(context, object), name_(name) {
3445
+ : name_(name) {
3446
+ SetOperandAt(0, context);
3447
+ SetOperandAt(1, object);
3330
3448
  set_representation(Representation::Tagged());
3331
3449
  SetAllSideEffects();
3332
3450
  }
@@ -3339,6 +3457,8 @@ class HLoadNamedGeneric: public HBinaryOperation {
3339
3457
  return Representation::Tagged();
3340
3458
  }
3341
3459
 
3460
+ virtual void PrintDataTo(StringStream* stream);
3461
+
3342
3462
  DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric)
3343
3463
 
3344
3464
  private:
@@ -3368,9 +3488,11 @@ class HLoadFunctionPrototype: public HUnaryOperation {
3368
3488
  };
3369
3489
 
3370
3490
 
3371
- class HLoadKeyedFastElement: public HBinaryOperation {
3491
+ class HLoadKeyedFastElement: public HTemplateInstruction<2> {
3372
3492
  public:
3373
- HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) {
3493
+ HLoadKeyedFastElement(HValue* obj, HValue* key) {
3494
+ SetOperandAt(0, obj);
3495
+ SetOperandAt(1, key);
3374
3496
  set_representation(Representation::Tagged());
3375
3497
  SetFlag(kDependsOnArrayElements);
3376
3498
  SetFlag(kUseGVN);
@@ -3381,8 +3503,9 @@ class HLoadKeyedFastElement: public HBinaryOperation {
3381
3503
 
3382
3504
  virtual Representation RequiredInputRepresentation(int index) const {
3383
3505
  // The key is supposed to be Integer32.
3384
- return (index == 1) ? Representation::Integer32()
3385
- : Representation::Tagged();
3506
+ return index == 0
3507
+ ? Representation::Tagged()
3508
+ : Representation::Integer32();
3386
3509
  }
3387
3510
 
3388
3511
  virtual void PrintDataTo(StringStream* stream);
@@ -3396,15 +3519,47 @@ class HLoadKeyedFastElement: public HBinaryOperation {
3396
3519
  };
3397
3520
 
3398
3521
 
3399
- class HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
3522
+ class HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> {
3523
+ public:
3524
+ HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) {
3525
+ SetOperandAt(0, elements);
3526
+ SetOperandAt(1, key);
3527
+ set_representation(Representation::Double());
3528
+ SetFlag(kDependsOnDoubleArrayElements);
3529
+ SetFlag(kUseGVN);
3530
+ }
3531
+
3532
+ HValue* elements() { return OperandAt(0); }
3533
+ HValue* key() { return OperandAt(1); }
3534
+
3535
+ virtual Representation RequiredInputRepresentation(int index) const {
3536
+ // The key is supposed to be Integer32.
3537
+ return index == 0
3538
+ ? Representation::Tagged()
3539
+ : Representation::Integer32();
3540
+ }
3541
+
3542
+ virtual void PrintDataTo(StringStream* stream);
3543
+
3544
+ bool RequiresHoleCheck() const;
3545
+
3546
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement)
3547
+
3548
+ protected:
3549
+ virtual bool DataEquals(HValue* other) { return true; }
3550
+ };
3551
+
3552
+
3553
+ class HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> {
3400
3554
  public:
3401
3555
  HLoadKeyedSpecializedArrayElement(HValue* external_elements,
3402
3556
  HValue* key,
3403
- ExternalArrayType array_type)
3404
- : HBinaryOperation(external_elements, key),
3405
- array_type_(array_type) {
3406
- if (array_type == kExternalFloatArray ||
3407
- array_type == kExternalDoubleArray) {
3557
+ JSObject::ElementsKind elements_kind)
3558
+ : elements_kind_(elements_kind) {
3559
+ SetOperandAt(0, external_elements);
3560
+ SetOperandAt(1, key);
3561
+ if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS ||
3562
+ elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
3408
3563
  set_representation(Representation::Double());
3409
3564
  } else {
3410
3565
  set_representation(Representation::Integer32());
@@ -3420,13 +3575,14 @@ class HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
3420
3575
  virtual Representation RequiredInputRepresentation(int index) const {
3421
3576
  // The key is supposed to be Integer32, but the base pointer
3422
3577
  // for the element load is a naked pointer.
3423
- return (index == 1) ? Representation::Integer32()
3424
- : Representation::External();
3578
+ return index == 0
3579
+ ? Representation::External()
3580
+ : Representation::Integer32();
3425
3581
  }
3426
3582
 
3427
3583
  HValue* external_pointer() { return OperandAt(0); }
3428
3584
  HValue* key() { return OperandAt(1); }
3429
- ExternalArrayType array_type() const { return array_type_; }
3585
+ JSObject::ElementsKind elements_kind() const { return elements_kind_; }
3430
3586
 
3431
3587
  DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement)
3432
3588
 
@@ -3435,11 +3591,11 @@ class HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
3435
3591
  if (!other->IsLoadKeyedSpecializedArrayElement()) return false;
3436
3592
  HLoadKeyedSpecializedArrayElement* cast_other =
3437
3593
  HLoadKeyedSpecializedArrayElement::cast(other);
3438
- return array_type_ == cast_other->array_type();
3594
+ return elements_kind_ == cast_other->elements_kind();
3439
3595
  }
3440
3596
 
3441
3597
  private:
3442
- ExternalArrayType array_type_;
3598
+ JSObject::ElementsKind elements_kind_;
3443
3599
  };
3444
3600
 
3445
3601
 
@@ -3467,17 +3623,18 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> {
3467
3623
  };
3468
3624
 
3469
3625
 
3470
- class HStoreNamedField: public HBinaryOperation {
3626
+ class HStoreNamedField: public HTemplateInstruction<2> {
3471
3627
  public:
3472
3628
  HStoreNamedField(HValue* obj,
3473
3629
  Handle<String> name,
3474
3630
  HValue* val,
3475
3631
  bool in_object,
3476
3632
  int offset)
3477
- : HBinaryOperation(obj, val),
3478
- name_(name),
3633
+ : name_(name),
3479
3634
  is_in_object_(in_object),
3480
3635
  offset_(offset) {
3636
+ SetOperandAt(0, obj);
3637
+ SetOperandAt(1, val);
3481
3638
  if (is_in_object_) {
3482
3639
  SetFlag(kChangesInobjectFields);
3483
3640
  } else {
@@ -3559,7 +3716,8 @@ class HStoreKeyedFastElement: public HTemplateInstruction<3> {
3559
3716
 
3560
3717
  virtual Representation RequiredInputRepresentation(int index) const {
3561
3718
  // The key is supposed to be Integer32.
3562
- return (index == 1) ? Representation::Integer32()
3719
+ return index == 1
3720
+ ? Representation::Integer32()
3563
3721
  : Representation::Tagged();
3564
3722
  }
3565
3723
 
@@ -3577,13 +3735,48 @@ class HStoreKeyedFastElement: public HTemplateInstruction<3> {
3577
3735
  };
3578
3736
 
3579
3737
 
3738
+ class HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> {
3739
+ public:
3740
+ HStoreKeyedFastDoubleElement(HValue* elements,
3741
+ HValue* key,
3742
+ HValue* val) {
3743
+ SetOperandAt(0, elements);
3744
+ SetOperandAt(1, key);
3745
+ SetOperandAt(2, val);
3746
+ SetFlag(kChangesDoubleArrayElements);
3747
+ }
3748
+
3749
+ virtual Representation RequiredInputRepresentation(int index) const {
3750
+ if (index == 1) {
3751
+ return Representation::Integer32();
3752
+ } else if (index == 2) {
3753
+ return Representation::Double();
3754
+ } else {
3755
+ return Representation::Tagged();
3756
+ }
3757
+ }
3758
+
3759
+ HValue* elements() { return OperandAt(0); }
3760
+ HValue* key() { return OperandAt(1); }
3761
+ HValue* value() { return OperandAt(2); }
3762
+
3763
+ bool NeedsWriteBarrier() {
3764
+ return StoringValueNeedsWriteBarrier(value());
3765
+ }
3766
+
3767
+ virtual void PrintDataTo(StringStream* stream);
3768
+
3769
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement)
3770
+ };
3771
+
3772
+
3580
3773
  class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3581
3774
  public:
3582
3775
  HStoreKeyedSpecializedArrayElement(HValue* external_elements,
3583
3776
  HValue* key,
3584
3777
  HValue* val,
3585
- ExternalArrayType array_type)
3586
- : array_type_(array_type) {
3778
+ JSObject::ElementsKind elements_kind)
3779
+ : elements_kind_(elements_kind) {
3587
3780
  SetFlag(kChangesSpecializedArrayElements);
3588
3781
  SetOperandAt(0, external_elements);
3589
3782
  SetOperandAt(1, key);
@@ -3596,8 +3789,10 @@ class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3596
3789
  if (index == 0) {
3597
3790
  return Representation::External();
3598
3791
  } else {
3599
- if (index == 2 && (array_type() == kExternalFloatArray ||
3600
- array_type() == kExternalDoubleArray)) {
3792
+ bool float_or_double_elements =
3793
+ elements_kind() == JSObject::EXTERNAL_FLOAT_ELEMENTS ||
3794
+ elements_kind() == JSObject::EXTERNAL_DOUBLE_ELEMENTS;
3795
+ if (index == 2 && float_or_double_elements) {
3601
3796
  return Representation::Double();
3602
3797
  } else {
3603
3798
  return Representation::Integer32();
@@ -3608,12 +3803,12 @@ class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3608
3803
  HValue* external_pointer() { return OperandAt(0); }
3609
3804
  HValue* key() { return OperandAt(1); }
3610
3805
  HValue* value() { return OperandAt(2); }
3611
- ExternalArrayType array_type() const { return array_type_; }
3806
+ JSObject::ElementsKind elements_kind() const { return elements_kind_; }
3612
3807
 
3613
3808
  DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement)
3614
3809
 
3615
3810
  private:
3616
- ExternalArrayType array_type_;
3811
+ JSObject::ElementsKind elements_kind_;
3617
3812
  };
3618
3813
 
3619
3814
 
@@ -3653,7 +3848,8 @@ class HStoreKeyedGeneric: public HTemplateInstruction<4> {
3653
3848
 
3654
3849
  class HStringAdd: public HBinaryOperation {
3655
3850
  public:
3656
- HStringAdd(HValue* left, HValue* right) : HBinaryOperation(left, right) {
3851
+ HStringAdd(HValue* context, HValue* left, HValue* right)
3852
+ : HBinaryOperation(context, left, right) {
3657
3853
  set_representation(Representation::Tagged());
3658
3854
  SetFlag(kUseGVN);
3659
3855
  SetFlag(kDependsOnMaps);
@@ -3674,10 +3870,12 @@ class HStringAdd: public HBinaryOperation {
3674
3870
  };
3675
3871
 
3676
3872
 
3677
- class HStringCharCodeAt: public HBinaryOperation {
3873
+ class HStringCharCodeAt: public HTemplateInstruction<3> {
3678
3874
  public:
3679
- HStringCharCodeAt(HValue* string, HValue* index)
3680
- : HBinaryOperation(string, index) {
3875
+ HStringCharCodeAt(HValue* context, HValue* string, HValue* index) {
3876
+ SetOperandAt(0, context);
3877
+ SetOperandAt(1, string);
3878
+ SetOperandAt(2, index);
3681
3879
  set_representation(Representation::Integer32());
3682
3880
  SetFlag(kUseGVN);
3683
3881
  SetFlag(kDependsOnMaps);
@@ -3685,12 +3883,14 @@ class HStringCharCodeAt: public HBinaryOperation {
3685
3883
 
3686
3884
  virtual Representation RequiredInputRepresentation(int index) const {
3687
3885
  // The index is supposed to be Integer32.
3688
- return (index == 1) ? Representation::Integer32()
3886
+ return index == 2
3887
+ ? Representation::Integer32()
3689
3888
  : Representation::Tagged();
3690
3889
  }
3691
3890
 
3692
- HValue* string() { return OperandAt(0); }
3693
- HValue* index() { return OperandAt(1); }
3891
+ HValue* context() { return OperandAt(0); }
3892
+ HValue* string() { return OperandAt(1); }
3893
+ HValue* index() { return OperandAt(2); }
3694
3894
 
3695
3895
  DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt)
3696
3896
 
@@ -3703,17 +3903,24 @@ class HStringCharCodeAt: public HBinaryOperation {
3703
3903
  };
3704
3904
 
3705
3905
 
3706
- class HStringCharFromCode: public HUnaryOperation {
3906
+ class HStringCharFromCode: public HTemplateInstruction<2> {
3707
3907
  public:
3708
- explicit HStringCharFromCode(HValue* char_code) : HUnaryOperation(char_code) {
3709
- set_representation(Representation::Tagged());
3908
+ HStringCharFromCode(HValue* context, HValue* char_code) {
3909
+ SetOperandAt(0, context);
3910
+ SetOperandAt(1, char_code);
3911
+ set_representation(Representation::Tagged());
3710
3912
  SetFlag(kUseGVN);
3711
3913
  }
3712
3914
 
3713
3915
  virtual Representation RequiredInputRepresentation(int index) const {
3714
- return Representation::Integer32();
3916
+ return index == 0
3917
+ ? Representation::Tagged()
3918
+ : Representation::Integer32();
3715
3919
  }
3716
3920
 
3921
+ HValue* context() { return OperandAt(0); }
3922
+ HValue* value() { return OperandAt(1); }
3923
+
3717
3924
  virtual bool DataEquals(HValue* other) { return true; }
3718
3925
 
3719
3926
  DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
@@ -3765,23 +3972,27 @@ class HMaterializedLiteral: public HTemplateInstruction<V> {
3765
3972
  };
3766
3973
 
3767
3974
 
3768
- class HArrayLiteral: public HMaterializedLiteral<0> {
3975
+ class HArrayLiteral: public HMaterializedLiteral<1> {
3769
3976
  public:
3770
- HArrayLiteral(Handle<FixedArray> constant_elements,
3977
+ HArrayLiteral(HValue* context,
3978
+ Handle<FixedArray> constant_elements,
3771
3979
  int length,
3772
3980
  int literal_index,
3773
3981
  int depth)
3774
- : HMaterializedLiteral<0>(literal_index, depth),
3982
+ : HMaterializedLiteral<1>(literal_index, depth),
3775
3983
  length_(length),
3776
- constant_elements_(constant_elements) {}
3984
+ constant_elements_(constant_elements) {
3985
+ SetOperandAt(0, context);
3986
+ }
3777
3987
 
3988
+ HValue* context() { return OperandAt(0); }
3778
3989
  Handle<FixedArray> constant_elements() const { return constant_elements_; }
3779
3990
  int length() const { return length_; }
3780
3991
 
3781
3992
  bool IsCopyOnWrite() const;
3782
3993
 
3783
3994
  virtual Representation RequiredInputRepresentation(int index) const {
3784
- return Representation::None();
3995
+ return Representation::Tagged();
3785
3996
  }
3786
3997
 
3787
3998
  DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral)
@@ -3827,20 +4038,24 @@ class HObjectLiteral: public HMaterializedLiteral<1> {
3827
4038
  };
3828
4039
 
3829
4040
 
3830
- class HRegExpLiteral: public HMaterializedLiteral<0> {
4041
+ class HRegExpLiteral: public HMaterializedLiteral<1> {
3831
4042
  public:
3832
- HRegExpLiteral(Handle<String> pattern,
4043
+ HRegExpLiteral(HValue* context,
4044
+ Handle<String> pattern,
3833
4045
  Handle<String> flags,
3834
4046
  int literal_index)
3835
- : HMaterializedLiteral<0>(literal_index, 0),
4047
+ : HMaterializedLiteral<1>(literal_index, 0),
3836
4048
  pattern_(pattern),
3837
- flags_(flags) { }
4049
+ flags_(flags) {
4050
+ SetOperandAt(0, context);
4051
+ }
3838
4052
 
4053
+ HValue* context() { return OperandAt(0); }
3839
4054
  Handle<String> pattern() { return pattern_; }
3840
4055
  Handle<String> flags() { return flags_; }
3841
4056
 
3842
4057
  virtual Representation RequiredInputRepresentation(int index) const {
3843
- return Representation::None();
4058
+ return Representation::Tagged();
3844
4059
  }
3845
4060
 
3846
4061
  DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral)
@@ -3851,15 +4066,20 @@ class HRegExpLiteral: public HMaterializedLiteral<0> {
3851
4066
  };
3852
4067
 
3853
4068
 
3854
- class HFunctionLiteral: public HTemplateInstruction<0> {
4069
+ class HFunctionLiteral: public HTemplateInstruction<1> {
3855
4070
  public:
3856
- HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure)
4071
+ HFunctionLiteral(HValue* context,
4072
+ Handle<SharedFunctionInfo> shared,
4073
+ bool pretenure)
3857
4074
  : shared_info_(shared), pretenure_(pretenure) {
4075
+ SetOperandAt(0, context);
3858
4076
  set_representation(Representation::Tagged());
3859
4077
  }
3860
4078
 
4079
+ HValue* context() { return OperandAt(0); }
4080
+
3861
4081
  virtual Representation RequiredInputRepresentation(int index) const {
3862
- return Representation::None();
4082
+ return Representation::Tagged();
3863
4083
  }
3864
4084
 
3865
4085
  DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral)
@@ -3873,12 +4093,17 @@ class HFunctionLiteral: public HTemplateInstruction<0> {
3873
4093
  };
3874
4094
 
3875
4095
 
3876
- class HTypeof: public HUnaryOperation {
4096
+ class HTypeof: public HTemplateInstruction<2> {
3877
4097
  public:
3878
- explicit HTypeof(HValue* value) : HUnaryOperation(value) {
4098
+ explicit HTypeof(HValue* context, HValue* value) {
4099
+ SetOperandAt(0, context);
4100
+ SetOperandAt(1, value);
3879
4101
  set_representation(Representation::Tagged());
3880
4102
  }
3881
4103
 
4104
+ HValue* context() { return OperandAt(0); }
4105
+ HValue* value() { return OperandAt(1); }
4106
+
3882
4107
  virtual Representation RequiredInputRepresentation(int index) const {
3883
4108
  return Representation::Tagged();
3884
4109
  }
@@ -3921,8 +4146,8 @@ class HValueOf: public HUnaryOperation {
3921
4146
 
3922
4147
  class HDeleteProperty: public HBinaryOperation {
3923
4148
  public:
3924
- HDeleteProperty(HValue* obj, HValue* key)
3925
- : HBinaryOperation(obj, key) {
4149
+ HDeleteProperty(HValue* context, HValue* obj, HValue* key)
4150
+ : HBinaryOperation(context, obj, key) {
3926
4151
  set_representation(Representation::Tagged());
3927
4152
  SetAllSideEffects();
3928
4153
  }
@@ -3931,6 +4156,8 @@ class HDeleteProperty: public HBinaryOperation {
3931
4156
  return Representation::Tagged();
3932
4157
  }
3933
4158
 
4159
+ virtual HType CalculateInferredType();
4160
+
3934
4161
  DECLARE_CONCRETE_INSTRUCTION(DeleteProperty)
3935
4162
 
3936
4163
  HValue* object() { return left(); }
@@ -3938,17 +4165,19 @@ class HDeleteProperty: public HBinaryOperation {
3938
4165
  };
3939
4166
 
3940
4167
 
3941
- class HIn: public HTemplateInstruction<2> {
4168
+ class HIn: public HTemplateInstruction<3> {
3942
4169
  public:
3943
- HIn(HValue* key, HValue* object) {
3944
- SetOperandAt(0, key);
3945
- SetOperandAt(1, object);
4170
+ HIn(HValue* context, HValue* key, HValue* object) {
4171
+ SetOperandAt(0, context);
4172
+ SetOperandAt(1, key);
4173
+ SetOperandAt(2, object);
3946
4174
  set_representation(Representation::Tagged());
3947
4175
  SetAllSideEffects();
3948
4176
  }
3949
4177
 
3950
- HValue* key() { return OperandAt(0); }
3951
- HValue* object() { return OperandAt(1); }
4178
+ HValue* context() { return OperandAt(0); }
4179
+ HValue* key() { return OperandAt(1); }
4180
+ HValue* object() { return OperandAt(2); }
3952
4181
 
3953
4182
  virtual Representation RequiredInputRepresentation(int index) const {
3954
4183
  return Representation::Tagged();