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
@@ -94,7 +94,7 @@ class LCodeGen BASE_EMBEDDED {
94
94
  void DoDeferredNumberTagD(LNumberTagD* instr);
95
95
  void DoDeferredTaggedToI(LTaggedToI* instr);
96
96
  void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr);
97
- void DoDeferredStackCheck(LGoto* instr);
97
+ void DoDeferredStackCheck(LStackCheck* instr);
98
98
  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
99
99
  void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
100
100
  void DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
@@ -215,9 +215,11 @@ class LCodeGen BASE_EMBEDDED {
215
215
 
216
216
  Register ToRegister(int index) const;
217
217
  XMMRegister ToDoubleRegister(int index) const;
218
- Operand BuildExternalArrayOperand(LOperand* external_pointer,
219
- LOperand* key,
220
- ExternalArrayType array_type);
218
+ Operand BuildFastArrayOperand(
219
+ LOperand* elements_pointer,
220
+ LOperand* key,
221
+ JSObject::ElementsKind elements_kind,
222
+ uint32_t offset);
221
223
 
222
224
  // Specific math operations - used from DoUnaryMathOperation.
223
225
  void EmitIntegerMathAbs(LUnaryMathOperation* instr);
@@ -246,10 +248,13 @@ class LCodeGen BASE_EMBEDDED {
246
248
  }
247
249
 
248
250
  static Condition TokenToCondition(Token::Value op, bool is_unsigned);
249
- void EmitGoto(int block, LDeferredCode* deferred_stack_check = NULL);
251
+ void EmitGoto(int block);
250
252
  void EmitBranch(int left_block, int right_block, Condition cc);
251
253
  void EmitCmpI(LOperand* left, LOperand* right);
252
- void EmitNumberUntagD(Register input, XMMRegister result, LEnvironment* env);
254
+ void EmitNumberUntagD(Register input,
255
+ XMMRegister result,
256
+ bool deoptimize_on_undefined,
257
+ LEnvironment* env);
253
258
 
254
259
  // Emits optimized code for typeof x == "y". Modifies input register.
255
260
  // Returns the condition on which a final split to
@@ -78,13 +78,13 @@ void LInstruction::VerifyCall() {
78
78
  ASSERT(Output() == NULL ||
79
79
  LUnallocated::cast(Output())->HasFixedPolicy() ||
80
80
  !LUnallocated::cast(Output())->HasRegisterPolicy());
81
- for (UseIterator it(this); it.HasNext(); it.Advance()) {
82
- LUnallocated* operand = LUnallocated::cast(it.Next());
81
+ for (UseIterator it(this); !it.Done(); it.Advance()) {
82
+ LUnallocated* operand = LUnallocated::cast(it.Current());
83
83
  ASSERT(operand->HasFixedPolicy() ||
84
84
  operand->IsUsedAtStart());
85
85
  }
86
- for (TempIterator it(this); it.HasNext(); it.Advance()) {
87
- LUnallocated* operand = LUnallocated::cast(it.Next());
86
+ for (TempIterator it(this); !it.Done(); it.Advance()) {
87
+ LUnallocated* operand = LUnallocated::cast(it.Current());
88
88
  ASSERT(operand->HasFixedPolicy() ||!operand->HasRegisterPolicy());
89
89
  }
90
90
  }
@@ -113,21 +113,18 @@ void LInstruction::PrintTo(StringStream* stream) {
113
113
  template<int R, int I, int T>
114
114
  void LTemplateInstruction<R, I, T>::PrintDataTo(StringStream* stream) {
115
115
  stream->Add("= ");
116
- inputs_.PrintOperandsTo(stream);
116
+ for (int i = 0; i < inputs_.length(); i++) {
117
+ if (i > 0) stream->Add(" ");
118
+ inputs_[i]->PrintTo(stream);
119
+ }
117
120
  }
118
121
 
119
122
 
120
123
  template<int R, int I, int T>
121
124
  void LTemplateInstruction<R, I, T>::PrintOutputOperandTo(StringStream* stream) {
122
- results_.PrintOperandsTo(stream);
123
- }
124
-
125
-
126
- template<typename T, int N>
127
- void OperandContainer<T, N>::PrintOperandsTo(StringStream* stream) {
128
- for (int i = 0; i < N; i++) {
125
+ for (int i = 0; i < results_.length(); i++) {
129
126
  if (i > 0) stream->Add(" ");
130
- elems_[i]->PrintTo(stream);
127
+ results_[i]->PrintTo(stream);
131
128
  }
132
129
  }
133
130
 
@@ -270,12 +267,6 @@ void LClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
270
267
  }
271
268
 
272
269
 
273
- void LTypeofIs::PrintDataTo(StringStream* stream) {
274
- InputAt(0)->PrintTo(stream);
275
- stream->Add(" == \"%s\"", *hydrogen()->type_literal()->ToCString());
276
- }
277
-
278
-
279
270
  void LTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
280
271
  stream->Add("if typeof ");
281
272
  InputAt(0)->PrintTo(stream);
@@ -345,13 +336,6 @@ void LCallNew::PrintDataTo(StringStream* stream) {
345
336
  }
346
337
 
347
338
 
348
- void LClassOfTest::PrintDataTo(StringStream* stream) {
349
- stream->Add("= class_of_test(");
350
- InputAt(0)->PrintTo(stream);
351
- stream->Add(", \"%o\")", *hydrogen()->class_name());
352
- }
353
-
354
-
355
339
  void LAccessArgumentsAt::PrintDataTo(StringStream* stream) {
356
340
  arguments()->PrintTo(stream);
357
341
 
@@ -393,8 +377,7 @@ void LChunk::MarkEmptyBlocks() {
393
377
  LLabel* label = LLabel::cast(first_instr);
394
378
  if (last_instr->IsGoto()) {
395
379
  LGoto* goto_instr = LGoto::cast(last_instr);
396
- if (!goto_instr->include_stack_check() &&
397
- label->IsRedundant() &&
380
+ if (label->IsRedundant() &&
398
381
  !label->is_loop_header()) {
399
382
  bool can_eliminate = true;
400
383
  for (int i = first + 1; i < last && can_eliminate; ++i) {
@@ -445,6 +428,15 @@ void LStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
445
428
  }
446
429
 
447
430
 
431
+ void LStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
432
+ elements()->PrintTo(stream);
433
+ stream->Add("[");
434
+ key()->PrintTo(stream);
435
+ stream->Add("] <- ");
436
+ value()->PrintTo(stream);
437
+ }
438
+
439
+
448
440
  void LStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
449
441
  object()->PrintTo(stream);
450
442
  stream->Add("[");
@@ -803,6 +795,11 @@ LInstruction* LChunkBuilder::DoBlockEntry(HBlockEntry* instr) {
803
795
  }
804
796
 
805
797
 
798
+ LInstruction* LChunkBuilder::DoSoftDeoptimize(HSoftDeoptimize* instr) {
799
+ return AssignEnvironment(new LDeoptimize);
800
+ }
801
+
802
+
806
803
  LInstruction* LChunkBuilder::DoDeoptimize(HDeoptimize* instr) {
807
804
  return AssignEnvironment(new LDeoptimize);
808
805
  }
@@ -843,11 +840,11 @@ LInstruction* LChunkBuilder::DoShift(Token::Value op,
843
840
  }
844
841
 
845
842
  ASSERT(instr->representation().IsInteger32());
846
- ASSERT(instr->OperandAt(0)->representation().IsInteger32());
847
- ASSERT(instr->OperandAt(1)->representation().IsInteger32());
848
- LOperand* left = UseRegisterAtStart(instr->OperandAt(0));
843
+ ASSERT(instr->left()->representation().IsInteger32());
844
+ ASSERT(instr->right()->representation().IsInteger32());
845
+ LOperand* left = UseRegisterAtStart(instr->left());
849
846
 
850
- HValue* right_value = instr->OperandAt(1);
847
+ HValue* right_value = instr->right();
851
848
  LOperand* right = NULL;
852
849
  int constant_value = 0;
853
850
  if (right_value->IsConstant()) {
@@ -984,18 +981,7 @@ void LChunkBuilder::VisitInstruction(HInstruction* current) {
984
981
  if (FLAG_stress_environments && !instr->HasEnvironment()) {
985
982
  instr = AssignEnvironment(instr);
986
983
  }
987
- if (current->IsTest() && !instr->IsGoto()) {
988
- ASSERT(instr->IsControl());
989
- HTest* test = HTest::cast(current);
990
- instr->set_hydrogen_value(test->value());
991
- HBasicBlock* first = test->FirstSuccessor();
992
- HBasicBlock* second = test->SecondSuccessor();
993
- ASSERT(first != NULL && second != NULL);
994
- instr->SetBranchTargets(first->block_id(), second->block_id());
995
- } else {
996
- instr->set_hydrogen_value(current);
997
- }
998
-
984
+ instr->set_hydrogen_value(current);
999
985
  chunk_->AddInstruction(instr, current_block_);
1000
986
  }
1001
987
  current_instruction_ = old_current;
@@ -1036,104 +1022,21 @@ LEnvironment* LChunkBuilder::CreateEnvironment(HEnvironment* hydrogen_env) {
1036
1022
 
1037
1023
 
1038
1024
  LInstruction* LChunkBuilder::DoGoto(HGoto* instr) {
1039
- LGoto* result = new LGoto(instr->FirstSuccessor()->block_id(),
1040
- instr->include_stack_check());
1041
- return (instr->include_stack_check())
1042
- ? AssignPointerMap(result)
1043
- : result;
1025
+ return new LGoto(instr->FirstSuccessor()->block_id());
1044
1026
  }
1045
1027
 
1046
1028
 
1047
- LInstruction* LChunkBuilder::DoTest(HTest* instr) {
1029
+ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
1048
1030
  HValue* v = instr->value();
1049
- if (!v->EmitAtUses()) {
1050
- return new LBranch(UseRegisterAtStart(v));
1051
- } else if (v->IsClassOfTest()) {
1052
- HClassOfTest* compare = HClassOfTest::cast(v);
1053
- ASSERT(compare->value()->representation().IsTagged());
1054
- return new LClassOfTestAndBranch(UseTempRegister(compare->value()),
1055
- TempRegister());
1056
- } else if (v->IsCompare()) {
1057
- HCompare* compare = HCompare::cast(v);
1058
- Token::Value op = compare->token();
1059
- HValue* left = compare->left();
1060
- HValue* right = compare->right();
1061
- Representation r = compare->GetInputRepresentation();
1062
- if (r.IsInteger32()) {
1063
- ASSERT(left->representation().IsInteger32());
1064
- ASSERT(right->representation().IsInteger32());
1065
- return new LCmpIDAndBranch(UseRegisterAtStart(left),
1066
- UseOrConstantAtStart(right));
1067
- } else if (r.IsDouble()) {
1068
- ASSERT(left->representation().IsDouble());
1069
- ASSERT(right->representation().IsDouble());
1070
- return new LCmpIDAndBranch(UseRegisterAtStart(left),
1071
- UseRegisterAtStart(right));
1072
- } else {
1073
- ASSERT(left->representation().IsTagged());
1074
- ASSERT(right->representation().IsTagged());
1075
- bool reversed = op == Token::GT || op == Token::LTE;
1076
- LOperand* left_operand = UseFixed(left, reversed ? rax : rdx);
1077
- LOperand* right_operand = UseFixed(right, reversed ? rdx : rax);
1078
- LCmpTAndBranch* result = new LCmpTAndBranch(left_operand, right_operand);
1079
- return MarkAsCall(result, instr);
1080
- }
1081
- } else if (v->IsIsSmi()) {
1082
- HIsSmi* compare = HIsSmi::cast(v);
1083
- ASSERT(compare->value()->representation().IsTagged());
1084
- return new LIsSmiAndBranch(Use(compare->value()));
1085
- } else if (v->IsIsUndetectable()) {
1086
- HIsUndetectable* compare = HIsUndetectable::cast(v);
1087
- ASSERT(compare->value()->representation().IsTagged());
1088
- return new LIsUndetectableAndBranch(UseRegisterAtStart(compare->value()),
1089
- TempRegister());
1090
- } else if (v->IsHasInstanceType()) {
1091
- HHasInstanceType* compare = HHasInstanceType::cast(v);
1092
- ASSERT(compare->value()->representation().IsTagged());
1093
- return new LHasInstanceTypeAndBranch(UseRegisterAtStart(compare->value()));
1094
- } else if (v->IsHasCachedArrayIndex()) {
1095
- HHasCachedArrayIndex* compare = HHasCachedArrayIndex::cast(v);
1096
- ASSERT(compare->value()->representation().IsTagged());
1097
- return new LHasCachedArrayIndexAndBranch(
1098
- UseRegisterAtStart(compare->value()));
1099
- } else if (v->IsIsNull()) {
1100
- HIsNull* compare = HIsNull::cast(v);
1101
- ASSERT(compare->value()->representation().IsTagged());
1102
- // We only need a temp register for non-strict compare.
1103
- LOperand* temp = compare->is_strict() ? NULL : TempRegister();
1104
- return new LIsNullAndBranch(UseRegisterAtStart(compare->value()), temp);
1105
- } else if (v->IsIsObject()) {
1106
- HIsObject* compare = HIsObject::cast(v);
1107
- ASSERT(compare->value()->representation().IsTagged());
1108
- return new LIsObjectAndBranch(UseRegisterAtStart(compare->value()));
1109
- } else if (v->IsCompareJSObjectEq()) {
1110
- HCompareJSObjectEq* compare = HCompareJSObjectEq::cast(v);
1111
- return new LCmpJSObjectEqAndBranch(UseRegisterAtStart(compare->left()),
1112
- UseRegisterAtStart(compare->right()));
1113
- } else if (v->IsCompareSymbolEq()) {
1114
- HCompareSymbolEq* compare = HCompareSymbolEq::cast(v);
1115
- return new LCmpSymbolEqAndBranch(UseRegisterAtStart(compare->left()),
1116
- UseRegisterAtStart(compare->right()));
1117
- } else if (v->IsInstanceOf()) {
1118
- HInstanceOf* instance_of = HInstanceOf::cast(v);
1119
- LInstanceOfAndBranch* result =
1120
- new LInstanceOfAndBranch(UseFixed(instance_of->left(), rax),
1121
- UseFixed(instance_of->right(), rdx));
1122
- return MarkAsCall(result, instr);
1123
- } else if (v->IsTypeofIs()) {
1124
- HTypeofIs* typeof_is = HTypeofIs::cast(v);
1125
- return new LTypeofIsAndBranch(UseTempRegister(typeof_is->value()));
1126
- } else if (v->IsIsConstructCall()) {
1127
- return new LIsConstructCallAndBranch(TempRegister());
1128
- } else if (v->IsConstant()) {
1031
+ if (v->EmitAtUses()) {
1032
+ ASSERT(v->IsConstant());
1033
+ ASSERT(!v->representation().IsDouble());
1129
1034
  HBasicBlock* successor = HConstant::cast(v)->ToBoolean()
1130
1035
  ? instr->FirstSuccessor()
1131
1036
  : instr->SecondSuccessor();
1132
1037
  return new LGoto(successor->block_id());
1133
- } else {
1134
- Abort("Undefined compare before branch");
1135
- return NULL;
1136
1038
  }
1039
+ return AssignEnvironment(new LBranch(UseRegister(v)));
1137
1040
  }
1138
1041
 
1139
1042
 
@@ -1165,7 +1068,7 @@ LInstruction* LChunkBuilder::DoInstanceOf(HInstanceOf* instr) {
1165
1068
  LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1166
1069
  HInstanceOfKnownGlobal* instr) {
1167
1070
  LInstanceOfKnownGlobal* result =
1168
- new LInstanceOfKnownGlobal(UseFixed(instr->value(), rax),
1071
+ new LInstanceOfKnownGlobal(UseFixed(instr->left(), rax),
1169
1072
  FixedTemp(rdi));
1170
1073
  return MarkAsCall(DefineFixed(result, rax), instr);
1171
1074
  }
@@ -1191,6 +1094,11 @@ LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
1191
1094
  }
1192
1095
 
1193
1096
 
1097
+ LInstruction* LChunkBuilder::DoThisFunction(HThisFunction* instr) {
1098
+ return instr->HasNoUses() ? NULL : DefineAsRegister(new LThisFunction);
1099
+ }
1100
+
1101
+
1194
1102
  LInstruction* LChunkBuilder::DoContext(HContext* instr) {
1195
1103
  return instr->HasNoUses() ? NULL : DefineAsRegister(new LContext);
1196
1104
  }
@@ -1481,88 +1389,83 @@ LInstruction* LChunkBuilder::DoPower(HPower* instr) {
1481
1389
  }
1482
1390
 
1483
1391
 
1484
- LInstruction* LChunkBuilder::DoCompare(HCompare* instr) {
1392
+ LInstruction* LChunkBuilder::DoCompareGeneric(HCompareGeneric* instr) {
1485
1393
  Token::Value op = instr->token();
1394
+ ASSERT(instr->left()->representation().IsTagged());
1395
+ ASSERT(instr->right()->representation().IsTagged());
1396
+ bool reversed = (op == Token::GT || op == Token::LTE);
1397
+ LOperand* left = UseFixed(instr->left(), reversed ? rax : rdx);
1398
+ LOperand* right = UseFixed(instr->right(), reversed ? rdx : rax);
1399
+ LCmpT* result = new LCmpT(left, right);
1400
+ return MarkAsCall(DefineFixed(result, rax), instr);
1401
+ }
1402
+
1403
+
1404
+ LInstruction* LChunkBuilder::DoCompareIDAndBranch(
1405
+ HCompareIDAndBranch* instr) {
1486
1406
  Representation r = instr->GetInputRepresentation();
1487
1407
  if (r.IsInteger32()) {
1488
1408
  ASSERT(instr->left()->representation().IsInteger32());
1489
1409
  ASSERT(instr->right()->representation().IsInteger32());
1490
1410
  LOperand* left = UseRegisterAtStart(instr->left());
1491
1411
  LOperand* right = UseOrConstantAtStart(instr->right());
1492
- return DefineAsRegister(new LCmpID(left, right));
1493
- } else if (r.IsDouble()) {
1412
+ return new LCmpIDAndBranch(left, right);
1413
+ } else {
1414
+ ASSERT(r.IsDouble());
1494
1415
  ASSERT(instr->left()->representation().IsDouble());
1495
1416
  ASSERT(instr->right()->representation().IsDouble());
1496
1417
  LOperand* left = UseRegisterAtStart(instr->left());
1497
1418
  LOperand* right = UseRegisterAtStart(instr->right());
1498
- return DefineAsRegister(new LCmpID(left, right));
1499
- } else {
1500
- ASSERT(instr->left()->representation().IsTagged());
1501
- ASSERT(instr->right()->representation().IsTagged());
1502
- bool reversed = (op == Token::GT || op == Token::LTE);
1503
- LOperand* left = UseFixed(instr->left(), reversed ? rax : rdx);
1504
- LOperand* right = UseFixed(instr->right(), reversed ? rdx : rax);
1505
- LCmpT* result = new LCmpT(left, right);
1506
- return MarkAsCall(DefineFixed(result, rax), instr);
1419
+ return new LCmpIDAndBranch(left, right);
1507
1420
  }
1508
1421
  }
1509
1422
 
1510
1423
 
1511
- LInstruction* LChunkBuilder::DoCompareJSObjectEq(
1512
- HCompareJSObjectEq* instr) {
1424
+ LInstruction* LChunkBuilder::DoCompareObjectEqAndBranch(
1425
+ HCompareObjectEqAndBranch* instr) {
1513
1426
  LOperand* left = UseRegisterAtStart(instr->left());
1514
1427
  LOperand* right = UseRegisterAtStart(instr->right());
1515
- LCmpJSObjectEq* result = new LCmpJSObjectEq(left, right);
1516
- return DefineAsRegister(result);
1428
+ return new LCmpObjectEqAndBranch(left, right);
1517
1429
  }
1518
1430
 
1519
1431
 
1520
- LInstruction* LChunkBuilder::DoCompareSymbolEq(
1521
- HCompareSymbolEq* instr) {
1522
- LOperand* left = UseRegisterAtStart(instr->left());
1523
- LOperand* right = UseRegisterAtStart(instr->right());
1524
- LCmpSymbolEq* result = new LCmpSymbolEq(left, right);
1525
- return DefineAsRegister(result);
1432
+ LInstruction* LChunkBuilder::DoCompareConstantEqAndBranch(
1433
+ HCompareConstantEqAndBranch* instr) {
1434
+ return new LCmpConstantEqAndBranch(UseRegisterAtStart(instr->value()));
1526
1435
  }
1527
1436
 
1528
1437
 
1529
- LInstruction* LChunkBuilder::DoIsNull(HIsNull* instr) {
1438
+ LInstruction* LChunkBuilder::DoIsNullAndBranch(HIsNullAndBranch* instr) {
1530
1439
  ASSERT(instr->value()->representation().IsTagged());
1531
- LOperand* value = UseRegisterAtStart(instr->value());
1532
-
1533
- return DefineAsRegister(new LIsNull(value));
1440
+ LOperand* temp = instr->is_strict() ? NULL : TempRegister();
1441
+ return new LIsNullAndBranch(UseRegisterAtStart(instr->value()), temp);
1534
1442
  }
1535
1443
 
1536
1444
 
1537
- LInstruction* LChunkBuilder::DoIsObject(HIsObject* instr) {
1445
+ LInstruction* LChunkBuilder::DoIsObjectAndBranch(HIsObjectAndBranch* instr) {
1538
1446
  ASSERT(instr->value()->representation().IsTagged());
1539
- LOperand* value = UseRegister(instr->value());
1540
-
1541
- return DefineAsRegister(new LIsObject(value));
1447
+ return new LIsObjectAndBranch(UseRegisterAtStart(instr->value()));
1542
1448
  }
1543
1449
 
1544
1450
 
1545
- LInstruction* LChunkBuilder::DoIsSmi(HIsSmi* instr) {
1451
+ LInstruction* LChunkBuilder::DoIsSmiAndBranch(HIsSmiAndBranch* instr) {
1546
1452
  ASSERT(instr->value()->representation().IsTagged());
1547
- LOperand* value = UseAtStart(instr->value());
1548
-
1549
- return DefineAsRegister(new LIsSmi(value));
1453
+ return new LIsSmiAndBranch(Use(instr->value()));
1550
1454
  }
1551
1455
 
1552
1456
 
1553
- LInstruction* LChunkBuilder::DoIsUndetectable(HIsUndetectable* instr) {
1457
+ LInstruction* LChunkBuilder::DoIsUndetectableAndBranch(
1458
+ HIsUndetectableAndBranch* instr) {
1554
1459
  ASSERT(instr->value()->representation().IsTagged());
1555
- LOperand* value = UseRegisterAtStart(instr->value());
1556
-
1557
- return DefineAsRegister(new LIsUndetectable(value));
1460
+ return new LIsUndetectableAndBranch(UseRegisterAtStart(instr->value()),
1461
+ TempRegister());
1558
1462
  }
1559
1463
 
1560
1464
 
1561
- LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) {
1465
+ LInstruction* LChunkBuilder::DoHasInstanceTypeAndBranch(
1466
+ HHasInstanceTypeAndBranch* instr) {
1562
1467
  ASSERT(instr->value()->representation().IsTagged());
1563
- LOperand* value = UseRegisterAtStart(instr->value());
1564
-
1565
- return DefineAsRegister(new LHasInstanceType(value));
1468
+ return new LHasInstanceTypeAndBranch(UseRegisterAtStart(instr->value()));
1566
1469
  }
1567
1470
 
1568
1471
 
@@ -1575,17 +1478,17 @@ LInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1575
1478
  }
1576
1479
 
1577
1480
 
1578
- LInstruction* LChunkBuilder::DoHasCachedArrayIndex(
1579
- HHasCachedArrayIndex* instr) {
1481
+ LInstruction* LChunkBuilder::DoHasCachedArrayIndexAndBranch(
1482
+ HHasCachedArrayIndexAndBranch* instr) {
1580
1483
  ASSERT(instr->value()->representation().IsTagged());
1581
- LOperand* value = UseRegister(instr->value());
1582
- return DefineAsRegister(new LHasCachedArrayIndex(value));
1484
+ return new LHasCachedArrayIndexAndBranch(UseRegisterAtStart(instr->value()));
1583
1485
  }
1584
1486
 
1585
1487
 
1586
- LInstruction* LChunkBuilder::DoClassOfTest(HClassOfTest* instr) {
1587
- Abort("Unimplemented: %s", "DoClassOfTest");
1588
- return NULL;
1488
+ LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
1489
+ HClassOfTestAndBranch* instr) {
1490
+ return new LClassOfTestAndBranch(UseTempRegister(instr->value()),
1491
+ TempRegister());
1589
1492
  }
1590
1493
 
1591
1494
 
@@ -1595,16 +1498,16 @@ LInstruction* LChunkBuilder::DoJSArrayLength(HJSArrayLength* instr) {
1595
1498
  }
1596
1499
 
1597
1500
 
1598
- LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) {
1501
+ LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
1502
+ HFixedArrayBaseLength* instr) {
1599
1503
  LOperand* array = UseRegisterAtStart(instr->value());
1600
- return DefineAsRegister(new LFixedArrayLength(array));
1504
+ return DefineAsRegister(new LFixedArrayBaseLength(array));
1601
1505
  }
1602
1506
 
1603
1507
 
1604
- LInstruction* LChunkBuilder::DoExternalArrayLength(
1605
- HExternalArrayLength* instr) {
1606
- LOperand* array = UseRegisterAtStart(instr->value());
1607
- return DefineAsRegister(new LExternalArrayLength(array));
1508
+ LInstruction* LChunkBuilder::DoElementsKind(HElementsKind* instr) {
1509
+ LOperand* object = UseRegisterAtStart(instr->value());
1510
+ return DefineAsRegister(new LElementsKind(object));
1608
1511
  }
1609
1512
 
1610
1513
 
@@ -1616,8 +1519,9 @@ LInstruction* LChunkBuilder::DoValueOf(HValueOf* instr) {
1616
1519
 
1617
1520
 
1618
1521
  LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) {
1619
- return AssignEnvironment(new LBoundsCheck(UseRegisterAtStart(instr->index()),
1620
- Use(instr->length())));
1522
+ return AssignEnvironment(new LBoundsCheck(
1523
+ UseRegisterOrConstantAtStart(instr->index()),
1524
+ Use(instr->length())));
1621
1525
  }
1622
1526
 
1623
1527
 
@@ -1634,6 +1538,11 @@ LInstruction* LChunkBuilder::DoThrow(HThrow* instr) {
1634
1538
  }
1635
1539
 
1636
1540
 
1541
+ LInstruction* LChunkBuilder::DoUseConst(HUseConst* instr) {
1542
+ return NULL;
1543
+ }
1544
+
1545
+
1637
1546
  LInstruction* LChunkBuilder::DoForceRepresentation(HForceRepresentation* bad) {
1638
1547
  // All HForceRepresentation instructions should be eliminated in the
1639
1548
  // representation change phase of Hydrogen.
@@ -1655,8 +1564,8 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
1655
1564
  LOperand* value = UseRegister(instr->value());
1656
1565
  bool needs_check = !instr->value()->type().IsSmi();
1657
1566
  if (needs_check) {
1658
- LOperand* xmm_temp = instr->CanTruncateToInt32() ? NULL
1659
- : FixedTemp(xmm1);
1567
+ bool truncating = instr->CanTruncateToInt32();
1568
+ LOperand* xmm_temp = truncating ? NULL : FixedTemp(xmm1);
1660
1569
  LTaggedToI* res = new LTaggedToI(value, xmm_temp);
1661
1570
  return AssignEnvironment(DefineSameAsFirst(res));
1662
1571
  } else {
@@ -1757,6 +1666,32 @@ LInstruction* LChunkBuilder::DoClampToUint8(HClampToUint8* instr) {
1757
1666
  }
1758
1667
 
1759
1668
 
1669
+ LInstruction* LChunkBuilder::DoToInt32(HToInt32* instr) {
1670
+ HValue* value = instr->value();
1671
+ Representation input_rep = value->representation();
1672
+ LOperand* reg = UseRegister(value);
1673
+ if (input_rep.IsDouble()) {
1674
+ return AssignEnvironment(DefineAsRegister(new LDoubleToI(reg)));
1675
+ } else if (input_rep.IsInteger32()) {
1676
+ // Canonicalization should already have removed the hydrogen instruction in
1677
+ // this case, since it is a noop.
1678
+ UNREACHABLE();
1679
+ return NULL;
1680
+ } else {
1681
+ ASSERT(input_rep.IsTagged());
1682
+ LOperand* reg = UseRegister(value);
1683
+ // Register allocator doesn't (yet) support allocation of double
1684
+ // temps. Reserve xmm1 explicitly.
1685
+ LOperand* xmm_temp =
1686
+ CpuFeatures::IsSupported(SSE3)
1687
+ ? NULL
1688
+ : FixedTemp(xmm1);
1689
+ return AssignEnvironment(
1690
+ DefineSameAsFirst(new LTaggedToI(reg, xmm_temp)));
1691
+ }
1692
+ }
1693
+
1694
+
1760
1695
  LInstruction* LChunkBuilder::DoReturn(HReturn* instr) {
1761
1696
  return new LReturn(UseFixed(instr->value(), rax));
1762
1697
  }
@@ -1885,21 +1820,35 @@ LInstruction* LChunkBuilder::DoLoadKeyedFastElement(
1885
1820
  ASSERT(instr->representation().IsTagged());
1886
1821
  ASSERT(instr->key()->representation().IsInteger32());
1887
1822
  LOperand* obj = UseRegisterAtStart(instr->object());
1888
- LOperand* key = UseRegisterAtStart(instr->key());
1823
+ LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1889
1824
  LLoadKeyedFastElement* result = new LLoadKeyedFastElement(obj, key);
1890
- return AssignEnvironment(DefineSameAsFirst(result));
1825
+ return AssignEnvironment(DefineAsRegister(result));
1826
+ }
1827
+
1828
+
1829
+ LInstruction* LChunkBuilder::DoLoadKeyedFastDoubleElement(
1830
+ HLoadKeyedFastDoubleElement* instr) {
1831
+ ASSERT(instr->representation().IsDouble());
1832
+ ASSERT(instr->key()->representation().IsInteger32());
1833
+ LOperand* elements = UseRegisterAtStart(instr->elements());
1834
+ LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1835
+ LLoadKeyedFastDoubleElement* result =
1836
+ new LLoadKeyedFastDoubleElement(elements, key);
1837
+ return AssignEnvironment(DefineAsRegister(result));
1891
1838
  }
1892
1839
 
1893
1840
 
1894
1841
  LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1895
1842
  HLoadKeyedSpecializedArrayElement* instr) {
1896
- ExternalArrayType array_type = instr->array_type();
1843
+ JSObject::ElementsKind elements_kind = instr->elements_kind();
1897
1844
  Representation representation(instr->representation());
1898
1845
  ASSERT(
1899
- (representation.IsInteger32() && (array_type != kExternalFloatArray &&
1900
- array_type != kExternalDoubleArray)) ||
1901
- (representation.IsDouble() && (array_type == kExternalFloatArray ||
1902
- array_type == kExternalDoubleArray)));
1846
+ (representation.IsInteger32() &&
1847
+ (elements_kind != JSObject::EXTERNAL_FLOAT_ELEMENTS) &&
1848
+ (elements_kind != JSObject::EXTERNAL_DOUBLE_ELEMENTS)) ||
1849
+ (representation.IsDouble() &&
1850
+ ((elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) ||
1851
+ (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS))));
1903
1852
  ASSERT(instr->key()->representation().IsInteger32());
1904
1853
  LOperand* external_pointer = UseRegister(instr->external_pointer());
1905
1854
  LOperand* key = UseRegisterOrConstant(instr->key());
@@ -1908,7 +1857,7 @@ LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1908
1857
  LInstruction* load_instr = DefineAsRegister(result);
1909
1858
  // An unsigned int array load might overflow and cause a deopt, make sure it
1910
1859
  // has an environment.
1911
- return (array_type == kExternalUnsignedIntArray) ?
1860
+ return (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) ?
1912
1861
  AssignEnvironment(load_instr) : load_instr;
1913
1862
  }
1914
1863
 
@@ -1941,21 +1890,38 @@ LInstruction* LChunkBuilder::DoStoreKeyedFastElement(
1941
1890
  }
1942
1891
 
1943
1892
 
1893
+ LInstruction* LChunkBuilder::DoStoreKeyedFastDoubleElement(
1894
+ HStoreKeyedFastDoubleElement* instr) {
1895
+ ASSERT(instr->value()->representation().IsDouble());
1896
+ ASSERT(instr->elements()->representation().IsTagged());
1897
+ ASSERT(instr->key()->representation().IsInteger32());
1898
+
1899
+ LOperand* elements = UseRegisterAtStart(instr->elements());
1900
+ LOperand* val = UseTempRegister(instr->value());
1901
+ LOperand* key = UseRegisterOrConstantAtStart(instr->key());
1902
+
1903
+ return new LStoreKeyedFastDoubleElement(elements, key, val);
1904
+ }
1905
+
1906
+
1944
1907
  LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
1945
1908
  HStoreKeyedSpecializedArrayElement* instr) {
1946
1909
  Representation representation(instr->value()->representation());
1947
- ExternalArrayType array_type = instr->array_type();
1910
+ JSObject::ElementsKind elements_kind = instr->elements_kind();
1948
1911
  ASSERT(
1949
- (representation.IsInteger32() && (array_type != kExternalFloatArray &&
1950
- array_type != kExternalDoubleArray)) ||
1951
- (representation.IsDouble() && (array_type == kExternalFloatArray ||
1952
- array_type == kExternalDoubleArray)));
1912
+ (representation.IsInteger32() &&
1913
+ (elements_kind != JSObject::EXTERNAL_FLOAT_ELEMENTS) &&
1914
+ (elements_kind != JSObject::EXTERNAL_DOUBLE_ELEMENTS)) ||
1915
+ (representation.IsDouble() &&
1916
+ ((elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) ||
1917
+ (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS))));
1953
1918
  ASSERT(instr->external_pointer()->representation().IsExternal());
1954
1919
  ASSERT(instr->key()->representation().IsInteger32());
1955
1920
 
1956
1921
  LOperand* external_pointer = UseRegister(instr->external_pointer());
1957
- bool val_is_temp_register = array_type == kExternalPixelArray ||
1958
- array_type == kExternalFloatArray;
1922
+ bool val_is_temp_register =
1923
+ elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS ||
1924
+ elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS;
1959
1925
  LOperand* val = val_is_temp_register
1960
1926
  ? UseTempRegister(instr->value())
1961
1927
  : UseRegister(instr->value());
@@ -2018,8 +1984,8 @@ LInstruction* LChunkBuilder::DoStringAdd(HStringAdd* instr) {
2018
1984
 
2019
1985
 
2020
1986
  LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
2021
- LOperand* string = UseRegister(instr->string());
2022
- LOperand* index = UseRegisterOrConstant(instr->index());
1987
+ LOperand* string = UseTempRegister(instr->string());
1988
+ LOperand* index = UseTempRegister(instr->index());
2023
1989
  LStringCharCodeAt* result = new LStringCharCodeAt(string, index);
2024
1990
  return AssignEnvironment(AssignPointerMap(DefineAsRegister(result)));
2025
1991
  }
@@ -2081,6 +2047,10 @@ LInstruction* LChunkBuilder::DoParameter(HParameter* instr) {
2081
2047
 
2082
2048
  LInstruction* LChunkBuilder::DoUnknownOSRValue(HUnknownOSRValue* instr) {
2083
2049
  int spill_index = chunk()->GetNextSpillIndex(false); // Not double-width.
2050
+ if (spill_index > LUnallocated::kMaxFixedIndex) {
2051
+ Abort("Too many spill slots needed for OSR");
2052
+ spill_index = 0;
2053
+ }
2084
2054
  return DefineAsSpilled(new LUnknownOSRValue, spill_index);
2085
2055
  }
2086
2056
 
@@ -2122,13 +2092,14 @@ LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2122
2092
  }
2123
2093
 
2124
2094
 
2125
- LInstruction* LChunkBuilder::DoTypeofIs(HTypeofIs* instr) {
2126
- return DefineSameAsFirst(new LTypeofIs(UseRegister(instr->value())));
2095
+ LInstruction* LChunkBuilder::DoTypeofIsAndBranch(HTypeofIsAndBranch* instr) {
2096
+ return new LTypeofIsAndBranch(UseTempRegister(instr->value()));
2127
2097
  }
2128
2098
 
2129
2099
 
2130
- LInstruction* LChunkBuilder::DoIsConstructCall(HIsConstructCall* instr) {
2131
- return DefineAsRegister(new LIsConstructCall);
2100
+ LInstruction* LChunkBuilder::DoIsConstructCallAndBranch(
2101
+ HIsConstructCallAndBranch* instr) {
2102
+ return new LIsConstructCallAndBranch(TempRegister());
2132
2103
  }
2133
2104
 
2134
2105
 
@@ -2164,7 +2135,12 @@ LInstruction* LChunkBuilder::DoSimulate(HSimulate* instr) {
2164
2135
 
2165
2136
 
2166
2137
  LInstruction* LChunkBuilder::DoStackCheck(HStackCheck* instr) {
2167
- return MarkAsCall(new LStackCheck, instr);
2138
+ if (instr->is_function_entry()) {
2139
+ return MarkAsCall(new LStackCheck, instr);
2140
+ } else {
2141
+ ASSERT(instr->is_backwards_branch());
2142
+ return AssignEnvironment(AssignPointerMap(new LStackCheck));
2143
+ }
2168
2144
  }
2169
2145
 
2170
2146
 
@@ -2173,7 +2149,6 @@ LInstruction* LChunkBuilder::DoEnterInlined(HEnterInlined* instr) {
2173
2149
  HConstant* undefined = graph()->GetConstantUndefined();
2174
2150
  HEnvironment* inner = outer->CopyForInlining(instr->closure(),
2175
2151
  instr->function(),
2176
- HEnvironment::LITHIUM,
2177
2152
  undefined,
2178
2153
  instr->call_kind());
2179
2154
  current_block_->UpdateEnvironment(inner);