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
@@ -289,6 +289,18 @@ class Simulator {
289
289
  // Used for breakpoints and traps.
290
290
  void SoftwareInterrupt(Instruction* instr);
291
291
 
292
+ // Stop helper functions.
293
+ bool IsWatchpoint(uint32_t code);
294
+ void PrintWatchpoint(uint32_t code);
295
+ void HandleStop(uint32_t code, Instruction* instr);
296
+ bool IsStopInstruction(Instruction* instr);
297
+ bool IsEnabledStop(uint32_t code);
298
+ void EnableStop(uint32_t code);
299
+ void DisableStop(uint32_t code);
300
+ void IncreaseStopCounter(uint32_t code);
301
+ void PrintStopInfo(uint32_t code);
302
+
303
+
292
304
  // Executes one instruction.
293
305
  void InstructionDecode(Instruction* instr);
294
306
  // Execute one instruction placed in a branch delay slot.
@@ -354,6 +366,19 @@ class Simulator {
354
366
  // Registered breakpoints.
355
367
  Instruction* break_pc_;
356
368
  Instr break_instr_;
369
+
370
+ // Stop is disabled if bit 31 is set.
371
+ static const uint32_t kStopDisabledBit = 1 << 31;
372
+
373
+ // A stop is enabled, meaning the simulator will stop when meeting the
374
+ // instruction, if bit 31 of watched_stops[code].count is unset.
375
+ // The value watched_stops[code].count & ~(1 << 31) indicates how many times
376
+ // the breakpoint was hit or gone through.
377
+ struct StopCountAndDesc {
378
+ uint32_t count;
379
+ char* desc;
380
+ };
381
+ StopCountAndDesc watched_stops[kMaxStopCode + 1];
357
382
  };
358
383
 
359
384
 
@@ -398,4 +423,3 @@ class SimulatorStack : public v8::internal::AllStatic {
398
423
 
399
424
  #endif // !defined(USE_SIMULATOR)
400
425
  #endif // V8_MIPS_SIMULATOR_MIPS_H_
401
-
@@ -126,7 +126,7 @@ MUST_USE_RESULT static MaybeObject* GenerateDictionaryNegativeLookup(
126
126
 
127
127
  // Check that receiver is a JSObject.
128
128
  __ lbu(scratch0, FieldMemOperand(map, Map::kInstanceTypeOffset));
129
- __ Branch(miss_label, lt, scratch0, Operand(FIRST_JS_OBJECT_TYPE));
129
+ __ Branch(miss_label, lt, scratch0, Operand(FIRST_SPEC_OBJECT_TYPE));
130
130
 
131
131
  // Load properties array.
132
132
  Register properties = scratch0;
@@ -472,7 +472,8 @@ void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
472
472
  static void GenerateCallFunction(MacroAssembler* masm,
473
473
  Object* object,
474
474
  const ParameterCount& arguments,
475
- Label* miss) {
475
+ Label* miss,
476
+ Code::ExtraICState extra_ic_state) {
476
477
  // ----------- S t a t e -------------
477
478
  // -- a0: receiver
478
479
  // -- a1: function to call
@@ -490,7 +491,10 @@ static void GenerateCallFunction(MacroAssembler* masm,
490
491
  }
491
492
 
492
493
  // Invoke the function.
493
- __ InvokeFunction(a1, arguments, JUMP_FUNCTION);
494
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
495
+ ? CALL_AS_FUNCTION
496
+ : CALL_AS_METHOD;
497
+ __ InvokeFunction(a1, arguments, JUMP_FUNCTION, NullCallWrapper(), call_kind);
494
498
  }
495
499
 
496
500
 
@@ -629,10 +633,12 @@ class CallInterceptorCompiler BASE_EMBEDDED {
629
633
  public:
630
634
  CallInterceptorCompiler(StubCompiler* stub_compiler,
631
635
  const ParameterCount& arguments,
632
- Register name)
636
+ Register name,
637
+ Code::ExtraICState extra_ic_state)
633
638
  : stub_compiler_(stub_compiler),
634
639
  arguments_(arguments),
635
- name_(name) {}
640
+ name_(name),
641
+ extra_ic_state_(extra_ic_state) {}
636
642
 
637
643
  MaybeObject* Compile(MacroAssembler* masm,
638
644
  JSObject* object,
@@ -760,8 +766,11 @@ class CallInterceptorCompiler BASE_EMBEDDED {
760
766
  arguments_.immediate());
761
767
  if (result->IsFailure()) return result;
762
768
  } else {
769
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
770
+ ? CALL_AS_FUNCTION
771
+ : CALL_AS_METHOD;
763
772
  __ InvokeFunction(optimization.constant_function(), arguments_,
764
- JUMP_FUNCTION);
773
+ JUMP_FUNCTION, call_kind);
765
774
  }
766
775
 
767
776
  // Deferred code for fast API call case---clean preallocated space.
@@ -844,6 +853,7 @@ class CallInterceptorCompiler BASE_EMBEDDED {
844
853
  StubCompiler* stub_compiler_;
845
854
  const ParameterCount& arguments_;
846
855
  Register name_;
856
+ Code::ExtraICState extra_ic_state_;
847
857
  };
848
858
 
849
859
 
@@ -1503,7 +1513,7 @@ MaybeObject* CallStubCompiler::CompileCallField(JSObject* object,
1503
1513
  Register reg = CheckPrototypes(object, a0, holder, a1, a3, t0, name, &miss);
1504
1514
  GenerateFastPropertyLoad(masm(), a1, reg, holder, index);
1505
1515
 
1506
- GenerateCallFunction(masm(), object, arguments(), &miss);
1516
+ GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
1507
1517
 
1508
1518
  // Handle call cache miss.
1509
1519
  __ bind(&miss);
@@ -2001,7 +2011,7 @@ MaybeObject* CallStubCompiler::CompileStringFromCharCodeCall(
2001
2011
  // Tail call the full function. We do not have to patch the receiver
2002
2012
  // because the function makes no use of it.
2003
2013
  __ bind(&slow);
2004
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
2014
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
2005
2015
 
2006
2016
  __ bind(&miss);
2007
2017
  // a2: function name.
@@ -2086,9 +2096,7 @@ MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object,
2086
2096
 
2087
2097
  // Retrieve FCSR and check for fpu errors.
2088
2098
  __ cfc1(t5, FCSR);
2089
- __ srl(t5, t5, kFCSRFlagShift);
2090
- // Flag 1 marks an inaccurate but still good result so we ignore it.
2091
- __ And(t5, t5, Operand(kFCSRFlagMask ^ 1));
2099
+ __ And(t5, t5, Operand(kFCSRExceptionFlagMask));
2092
2100
  __ Branch(&no_fpu_error, eq, t5, Operand(zero_reg));
2093
2101
 
2094
2102
  // Check for NaN, Infinity, and -Infinity.
@@ -2137,7 +2145,7 @@ MaybeObject* CallStubCompiler::CompileMathFloorCall(Object* object,
2137
2145
  __ bind(&slow);
2138
2146
  // Tail call the full function. We do not have to patch the receiver
2139
2147
  // because the function makes no use of it.
2140
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
2148
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
2141
2149
 
2142
2150
  __ bind(&miss);
2143
2151
  // a2: function name.
@@ -2239,7 +2247,7 @@ MaybeObject* CallStubCompiler::CompileMathAbsCall(Object* object,
2239
2247
  // Tail call the full function. We do not have to patch the receiver
2240
2248
  // because the function makes no use of it.
2241
2249
  __ bind(&slow);
2242
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
2250
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, CALL_AS_METHOD);
2243
2251
 
2244
2252
  __ bind(&miss);
2245
2253
  // a2: function name.
@@ -2425,7 +2433,10 @@ MaybeObject* CallStubCompiler::CompileCallConstant(Object* object,
2425
2433
  UNREACHABLE();
2426
2434
  }
2427
2435
 
2428
- __ InvokeFunction(function, arguments(), JUMP_FUNCTION);
2436
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
2437
+ ? CALL_AS_FUNCTION
2438
+ : CALL_AS_METHOD;
2439
+ __ InvokeFunction(function, arguments(), JUMP_FUNCTION, call_kind);
2429
2440
 
2430
2441
  // Handle call cache miss.
2431
2442
  __ bind(&miss);
@@ -2459,7 +2470,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
2459
2470
  // Get the receiver from the stack.
2460
2471
  __ lw(a1, MemOperand(sp, argc * kPointerSize));
2461
2472
 
2462
- CallInterceptorCompiler compiler(this, arguments(), a2);
2473
+ CallInterceptorCompiler compiler(this, arguments(), a2, extra_ic_state_);
2463
2474
  MaybeObject* result = compiler.Compile(masm(),
2464
2475
  object,
2465
2476
  holder,
@@ -2479,7 +2490,7 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
2479
2490
  // Restore receiver.
2480
2491
  __ lw(a0, MemOperand(sp, argc * kPointerSize));
2481
2492
 
2482
- GenerateCallFunction(masm(), object, arguments(), &miss);
2493
+ GenerateCallFunction(masm(), object, arguments(), &miss, extra_ic_state_);
2483
2494
 
2484
2495
  // Handle call cache miss.
2485
2496
  __ bind(&miss);
@@ -2491,13 +2502,11 @@ MaybeObject* CallStubCompiler::CompileCallInterceptor(JSObject* object,
2491
2502
  }
2492
2503
 
2493
2504
 
2494
- MaybeObject* CallStubCompiler::CompileCallGlobal(
2495
- JSObject* object,
2496
- GlobalObject* holder,
2497
- JSGlobalPropertyCell* cell,
2498
- JSFunction* function,
2499
- String* name,
2500
- Code::ExtraICState extra_ic_state) {
2505
+ MaybeObject* CallStubCompiler::CompileCallGlobal(JSObject* object,
2506
+ GlobalObject* holder,
2507
+ JSGlobalPropertyCell* cell,
2508
+ JSFunction* function,
2509
+ String* name) {
2501
2510
  // ----------- S t a t e -------------
2502
2511
  // -- a2 : name
2503
2512
  // -- ra : return address
@@ -2538,7 +2547,7 @@ MaybeObject* CallStubCompiler::CompileCallGlobal(
2538
2547
  ASSERT(function->is_compiled());
2539
2548
  Handle<Code> code(function->code());
2540
2549
  ParameterCount expected(function->shared()->formal_parameter_count());
2541
- CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state)
2550
+ CallKind call_kind = CallICBase::Contextual::decode(extra_ic_state_)
2542
2551
  ? CALL_AS_FUNCTION
2543
2552
  : CALL_AS_METHOD;
2544
2553
  if (V8::UseCrankshaft()) {
@@ -3083,14 +3092,15 @@ MaybeObject* KeyedLoadStubCompiler::CompileLoadFunctionPrototype(String* name) {
3083
3092
  }
3084
3093
 
3085
3094
 
3086
- MaybeObject* KeyedLoadStubCompiler::CompileLoadFastElement(Map* receiver_map) {
3095
+ MaybeObject* KeyedLoadStubCompiler::CompileLoadElement(Map* receiver_map) {
3087
3096
  // ----------- S t a t e -------------
3088
3097
  // -- ra : return address
3089
3098
  // -- a0 : key
3090
3099
  // -- a1 : receiver
3091
3100
  // -----------------------------------
3092
- MaybeObject* maybe_stub = KeyedLoadFastElementStub().TryGetCode();
3093
3101
  Code* stub;
3102
+ JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
3103
+ MaybeObject* maybe_stub = KeyedLoadElementStub(elements_kind).TryGetCode();
3094
3104
  if (!maybe_stub->To(&stub)) return maybe_stub;
3095
3105
  __ DispatchMap(a1,
3096
3106
  a2,
@@ -3172,8 +3182,7 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreField(JSObject* object,
3172
3182
  }
3173
3183
 
3174
3184
 
3175
- MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement(
3176
- Map* receiver_map) {
3185
+ MaybeObject* KeyedStoreStubCompiler::CompileStoreElement(Map* receiver_map) {
3177
3186
  // ----------- S t a t e -------------
3178
3187
  // -- a0 : value
3179
3188
  // -- a1 : key
@@ -3181,10 +3190,11 @@ MaybeObject* KeyedStoreStubCompiler::CompileStoreFastElement(
3181
3190
  // -- ra : return address
3182
3191
  // -- a3 : scratch
3183
3192
  // -----------------------------------
3193
+ Code* stub;
3194
+ JSObject::ElementsKind elements_kind = receiver_map->elements_kind();
3184
3195
  bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
3185
3196
  MaybeObject* maybe_stub =
3186
- KeyedStoreFastElementStub(is_js_array).TryGetCode();
3187
- Code* stub;
3197
+ KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode();
3188
3198
  if (!maybe_stub->To(&stub)) return maybe_stub;
3189
3199
  __ DispatchMap(a2,
3190
3200
  a3,
@@ -3380,82 +3390,87 @@ MaybeObject* ConstructStubCompiler::CompileConstructStub(JSFunction* function) {
3380
3390
  }
3381
3391
 
3382
3392
 
3383
- MaybeObject* ExternalArrayLoadStubCompiler::CompileLoad(
3384
- JSObject*receiver, ExternalArrayType array_type) {
3385
- // ----------- S t a t e -------------
3386
- // -- ra : return address
3387
- // -- a0 : key
3388
- // -- a1 : receiver
3389
- // -----------------------------------
3390
- MaybeObject* maybe_stub =
3391
- KeyedLoadExternalArrayStub(array_type).TryGetCode();
3392
- Code* stub;
3393
- if (!maybe_stub->To(&stub)) return maybe_stub;
3394
- __ DispatchMap(a1,
3395
- a2,
3396
- Handle<Map>(receiver->map()),
3397
- Handle<Code>(stub),
3398
- DO_SMI_CHECK);
3393
+ #undef __
3394
+ #define __ ACCESS_MASM(masm)
3399
3395
 
3400
- Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
3401
- __ Jump(ic, RelocInfo::CODE_TARGET);
3402
3396
 
3403
- // Return the generated code.
3404
- return GetCode();
3405
- }
3397
+ void KeyedLoadStubCompiler::GenerateLoadDictionaryElement(
3398
+ MacroAssembler* masm) {
3399
+ // ---------- S t a t e --------------
3400
+ // -- ra : return address
3401
+ // -- a0 : key
3402
+ // -- a1 : receiver
3403
+ // -----------------------------------
3404
+ Label slow, miss_force_generic;
3406
3405
 
3406
+ Register key = a0;
3407
+ Register receiver = a1;
3407
3408
 
3408
- MaybeObject* ExternalArrayStoreStubCompiler::CompileStore(
3409
- JSObject* receiver, ExternalArrayType array_type) {
3410
- // ----------- S t a t e -------------
3411
- // -- a0 : value
3412
- // -- a1 : name
3413
- // -- a2 : receiver
3414
- // -- ra : return address
3415
- // -----------------------------------
3416
- MaybeObject* maybe_stub =
3417
- KeyedStoreExternalArrayStub(array_type).TryGetCode();
3418
- Code* stub;
3419
- if (!maybe_stub->To(&stub)) return maybe_stub;
3420
- __ DispatchMap(a2,
3421
- a3,
3422
- Handle<Map>(receiver->map()),
3423
- Handle<Code>(stub),
3424
- DO_SMI_CHECK);
3409
+ __ JumpIfNotSmi(key, &miss_force_generic);
3410
+ __ lw(t0, FieldMemOperand(receiver, JSObject::kElementsOffset));
3411
+ __ sra(a2, a0, kSmiTagSize);
3412
+ __ LoadFromNumberDictionary(&slow, t0, a0, v0, a2, a3, t1);
3413
+ __ Ret();
3425
3414
 
3426
- Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
3427
- __ Jump(ic, RelocInfo::CODE_TARGET);
3415
+ // Slow case, key and receiver still in a0 and a1.
3416
+ __ bind(&slow);
3417
+ __ IncrementCounter(
3418
+ masm->isolate()->counters()->keyed_load_external_array_slow(),
3419
+ 1, a2, a3);
3420
+ // Entry registers are intact.
3421
+ // ---------- S t a t e --------------
3422
+ // -- ra : return address
3423
+ // -- a0 : key
3424
+ // -- a1 : receiver
3425
+ // -----------------------------------
3426
+ Handle<Code> slow_ic =
3427
+ masm->isolate()->builtins()->KeyedLoadIC_Slow();
3428
+ __ Jump(slow_ic, RelocInfo::CODE_TARGET);
3428
3429
 
3429
- return GetCode();
3430
- }
3430
+ // Miss case, call the runtime.
3431
+ __ bind(&miss_force_generic);
3431
3432
 
3433
+ // ---------- S t a t e --------------
3434
+ // -- ra : return address
3435
+ // -- a0 : key
3436
+ // -- a1 : receiver
3437
+ // -----------------------------------
3432
3438
 
3433
- #undef __
3434
- #define __ ACCESS_MASM(masm)
3439
+ Handle<Code> miss_ic =
3440
+ masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
3441
+ __ Jump(miss_ic, RelocInfo::CODE_TARGET);
3442
+ }
3435
3443
 
3436
3444
 
3437
- static bool IsElementTypeSigned(ExternalArrayType array_type) {
3438
- switch (array_type) {
3439
- case kExternalByteArray:
3440
- case kExternalShortArray:
3441
- case kExternalIntArray:
3445
+ static bool IsElementTypeSigned(JSObject::ElementsKind elements_kind) {
3446
+ switch (elements_kind) {
3447
+ case JSObject::EXTERNAL_BYTE_ELEMENTS:
3448
+ case JSObject::EXTERNAL_SHORT_ELEMENTS:
3449
+ case JSObject::EXTERNAL_INT_ELEMENTS:
3442
3450
  return true;
3443
3451
 
3444
- case kExternalUnsignedByteArray:
3445
- case kExternalUnsignedShortArray:
3446
- case kExternalUnsignedIntArray:
3452
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3453
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3454
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
3455
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS:
3447
3456
  return false;
3448
3457
 
3449
- default:
3458
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS:
3459
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
3460
+ case JSObject::FAST_ELEMENTS:
3461
+ case JSObject::FAST_DOUBLE_ELEMENTS:
3462
+ case JSObject::DICTIONARY_ELEMENTS:
3463
+ case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
3450
3464
  UNREACHABLE();
3451
3465
  return false;
3452
3466
  }
3467
+ return false;
3453
3468
  }
3454
3469
 
3455
3470
 
3456
3471
  void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3457
3472
  MacroAssembler* masm,
3458
- ExternalArrayType array_type) {
3473
+ JSObject::ElementsKind elements_kind) {
3459
3474
  // ---------- S t a t e --------------
3460
3475
  // -- ra : return address
3461
3476
  // -- a0 : key
@@ -3479,7 +3494,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3479
3494
  __ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset));
3480
3495
  __ sra(t2, key, kSmiTagSize);
3481
3496
  // Unsigned comparison catches both negative and too-large values.
3482
- __ Branch(&miss_force_generic, Uless, t1, Operand(t2));
3497
+ __ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1));
3483
3498
 
3484
3499
  __ lw(a3, FieldMemOperand(a3, ExternalArray::kExternalPointerOffset));
3485
3500
  // a3: base pointer of external storage
@@ -3489,33 +3504,33 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3489
3504
  ASSERT((kSmiTag == 0) && (kSmiTagSize == 1));
3490
3505
 
3491
3506
  Register value = a2;
3492
- switch (array_type) {
3493
- case kExternalByteArray:
3507
+ switch (elements_kind) {
3508
+ case JSObject::EXTERNAL_BYTE_ELEMENTS:
3494
3509
  __ srl(t2, key, 1);
3495
3510
  __ addu(t3, a3, t2);
3496
3511
  __ lb(value, MemOperand(t3, 0));
3497
3512
  break;
3498
- case kExternalPixelArray:
3499
- case kExternalUnsignedByteArray:
3513
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS:
3514
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3500
3515
  __ srl(t2, key, 1);
3501
3516
  __ addu(t3, a3, t2);
3502
3517
  __ lbu(value, MemOperand(t3, 0));
3503
3518
  break;
3504
- case kExternalShortArray:
3519
+ case JSObject::EXTERNAL_SHORT_ELEMENTS:
3505
3520
  __ addu(t3, a3, key);
3506
3521
  __ lh(value, MemOperand(t3, 0));
3507
3522
  break;
3508
- case kExternalUnsignedShortArray:
3523
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3509
3524
  __ addu(t3, a3, key);
3510
3525
  __ lhu(value, MemOperand(t3, 0));
3511
3526
  break;
3512
- case kExternalIntArray:
3513
- case kExternalUnsignedIntArray:
3527
+ case JSObject::EXTERNAL_INT_ELEMENTS:
3528
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
3514
3529
  __ sll(t2, key, 1);
3515
3530
  __ addu(t3, a3, t2);
3516
3531
  __ lw(value, MemOperand(t3, 0));
3517
3532
  break;
3518
- case kExternalFloatArray:
3533
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS:
3519
3534
  __ sll(t3, t2, 2);
3520
3535
  __ addu(t3, a3, t3);
3521
3536
  if (CpuFeatures::IsSupported(FPU)) {
@@ -3525,7 +3540,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3525
3540
  __ lw(value, MemOperand(t3, 0));
3526
3541
  }
3527
3542
  break;
3528
- case kExternalDoubleArray:
3543
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
3529
3544
  __ sll(t2, key, 2);
3530
3545
  __ addu(t3, a3, t2);
3531
3546
  if (CpuFeatures::IsSupported(FPU)) {
@@ -3537,7 +3552,10 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3537
3552
  __ lw(a3, MemOperand(t3, Register::kSizeInBytes));
3538
3553
  }
3539
3554
  break;
3540
- default:
3555
+ case JSObject::FAST_ELEMENTS:
3556
+ case JSObject::FAST_DOUBLE_ELEMENTS:
3557
+ case JSObject::DICTIONARY_ELEMENTS:
3558
+ case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
3541
3559
  UNREACHABLE();
3542
3560
  break;
3543
3561
  }
@@ -3551,7 +3569,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3551
3569
  // f0: value (if FPU is supported)
3552
3570
  // a2/a3: value (if FPU is not supported)
3553
3571
 
3554
- if (array_type == kExternalIntArray) {
3572
+ if (elements_kind == JSObject::EXTERNAL_INT_ELEMENTS) {
3555
3573
  // For the Int and UnsignedInt array types, we need to see whether
3556
3574
  // the value can be represented in a Smi. If not, we need to convert
3557
3575
  // it to a HeapNumber.
@@ -3593,7 +3611,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3593
3611
  __ sw(dst2, FieldMemOperand(v0, HeapNumber::kExponentOffset));
3594
3612
  __ Ret();
3595
3613
  }
3596
- } else if (array_type == kExternalUnsignedIntArray) {
3614
+ } else if (elements_kind == JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS) {
3597
3615
  // The test is different for unsigned int values. Since we need
3598
3616
  // the value to be in the range of a positive smi, we can't
3599
3617
  // handle either of the top two bits being set in the value.
@@ -3620,7 +3638,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3620
3638
  // __ mtc1(zero_reg, f1); // MS 32-bits are all zero.
3621
3639
  // __ cvt_d_l(f0, f0); // Use 64 bit conv to get correct unsigned 32-bit.
3622
3640
 
3623
- __ Cvt_d_uw(f0, value);
3641
+ __ Cvt_d_uw(f0, value, f22);
3624
3642
 
3625
3643
  __ sdc1(f0, MemOperand(v0, HeapNumber::kValueOffset - kHeapObjectTag));
3626
3644
 
@@ -3664,7 +3682,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3664
3682
  __ mov(v0, t2);
3665
3683
  __ Ret();
3666
3684
  }
3667
- } else if (array_type == kExternalFloatArray) {
3685
+ } else if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
3668
3686
  // For the floating-point array type, we need to always allocate a
3669
3687
  // HeapNumber.
3670
3688
  if (CpuFeatures::IsSupported(FPU)) {
@@ -3731,7 +3749,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3731
3749
  __ Ret();
3732
3750
  }
3733
3751
 
3734
- } else if (array_type == kExternalDoubleArray) {
3752
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
3735
3753
  if (CpuFeatures::IsSupported(FPU)) {
3736
3754
  CpuFeatures::Scope scope(FPU);
3737
3755
  // Allocate a HeapNumber for the result. Don't use a0 and a1 as
@@ -3785,7 +3803,7 @@ void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3785
3803
 
3786
3804
  void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3787
3805
  MacroAssembler* masm,
3788
- ExternalArrayType array_type) {
3806
+ JSObject::ElementsKind elements_kind) {
3789
3807
  // ---------- S t a t e --------------
3790
3808
  // -- a0 : value
3791
3809
  // -- a1 : key
@@ -3804,23 +3822,23 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3804
3822
  // This stub is meant to be tail-jumped to, the receiver must already
3805
3823
  // have been verified by the caller to not be a smi.
3806
3824
 
3807
- __ lw(a3, FieldMemOperand(receiver, JSObject::kElementsOffset));
3808
-
3809
- // Check that the key is a smi.
3825
+ // Check that the key is a smi.
3810
3826
  __ JumpIfNotSmi(key, &miss_force_generic);
3811
3827
 
3828
+ __ lw(a3, FieldMemOperand(receiver, JSObject::kElementsOffset));
3829
+
3812
3830
  // Check that the index is in range.
3813
3831
  __ SmiUntag(t0, key);
3814
3832
  __ lw(t1, FieldMemOperand(a3, ExternalArray::kLengthOffset));
3815
3833
  // Unsigned comparison catches both negative and too-large values.
3816
- __ Branch(&miss_force_generic, Ugreater_equal, t0, Operand(t1));
3834
+ __ Branch(&miss_force_generic, Ugreater_equal, key, Operand(t1));
3817
3835
 
3818
3836
  // Handle both smis and HeapNumbers in the fast path. Go to the
3819
3837
  // runtime for all other kinds of values.
3820
3838
  // a3: external array.
3821
3839
  // t0: key (integer).
3822
3840
 
3823
- if (array_type == kExternalPixelArray) {
3841
+ if (elements_kind == JSObject::EXTERNAL_PIXEL_ELEMENTS) {
3824
3842
  // Double to pixel conversion is only implemented in the runtime for now.
3825
3843
  __ JumpIfNotSmi(value, &slow);
3826
3844
  } else {
@@ -3833,8 +3851,8 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3833
3851
  // t0: key (integer).
3834
3852
  // t1: value (integer).
3835
3853
 
3836
- switch (array_type) {
3837
- case kExternalPixelArray: {
3854
+ switch (elements_kind) {
3855
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS: {
3838
3856
  // Clamp the value to [0..255].
3839
3857
  // v0 is used as a scratch register here.
3840
3858
  Label done;
@@ -3851,28 +3869,28 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3851
3869
  __ sb(t1, MemOperand(t8, 0));
3852
3870
  }
3853
3871
  break;
3854
- case kExternalByteArray:
3855
- case kExternalUnsignedByteArray:
3872
+ case JSObject::EXTERNAL_BYTE_ELEMENTS:
3873
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3856
3874
  __ addu(t8, a3, t0);
3857
3875
  __ sb(t1, MemOperand(t8, 0));
3858
3876
  break;
3859
- case kExternalShortArray:
3860
- case kExternalUnsignedShortArray:
3877
+ case JSObject::EXTERNAL_SHORT_ELEMENTS:
3878
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3861
3879
  __ sll(t8, t0, 1);
3862
3880
  __ addu(t8, a3, t8);
3863
3881
  __ sh(t1, MemOperand(t8, 0));
3864
3882
  break;
3865
- case kExternalIntArray:
3866
- case kExternalUnsignedIntArray:
3883
+ case JSObject::EXTERNAL_INT_ELEMENTS:
3884
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
3867
3885
  __ sll(t8, t0, 2);
3868
3886
  __ addu(t8, a3, t8);
3869
3887
  __ sw(t1, MemOperand(t8, 0));
3870
3888
  break;
3871
- case kExternalFloatArray:
3889
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS:
3872
3890
  // Perform int-to-float conversion and store to memory.
3873
3891
  StoreIntAsFloat(masm, a3, t0, t1, t2, t3, t4);
3874
3892
  break;
3875
- case kExternalDoubleArray:
3893
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
3876
3894
  __ sll(t8, t0, 3);
3877
3895
  __ addu(a3, a3, t8);
3878
3896
  // a3: effective address of the double element
@@ -3894,7 +3912,10 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3894
3912
  __ sw(t3, MemOperand(a3, Register::kSizeInBytes));
3895
3913
  }
3896
3914
  break;
3897
- default:
3915
+ case JSObject::FAST_ELEMENTS:
3916
+ case JSObject::FAST_DOUBLE_ELEMENTS:
3917
+ case JSObject::DICTIONARY_ELEMENTS:
3918
+ case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
3898
3919
  UNREACHABLE();
3899
3920
  break;
3900
3921
  }
@@ -3903,7 +3924,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3903
3924
  __ mov(v0, value);
3904
3925
  __ Ret();
3905
3926
 
3906
- if (array_type != kExternalPixelArray) {
3927
+ if (elements_kind != JSObject::EXTERNAL_PIXEL_ELEMENTS) {
3907
3928
  // a3: external array.
3908
3929
  // t0: index (integer).
3909
3930
  __ bind(&check_heap_number);
@@ -3924,56 +3945,43 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3924
3945
 
3925
3946
  __ ldc1(f0, FieldMemOperand(a0, HeapNumber::kValueOffset));
3926
3947
 
3927
- if (array_type == kExternalFloatArray) {
3948
+ if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
3928
3949
  __ cvt_s_d(f0, f0);
3929
3950
  __ sll(t8, t0, 2);
3930
3951
  __ addu(t8, a3, t8);
3931
3952
  __ swc1(f0, MemOperand(t8, 0));
3932
- } else if (array_type == kExternalDoubleArray) {
3953
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
3933
3954
  __ sll(t8, t0, 3);
3934
3955
  __ addu(t8, a3, t8);
3935
3956
  __ sdc1(f0, MemOperand(t8, 0));
3936
3957
  } else {
3937
- Label done;
3938
-
3939
- // Need to perform float-to-int conversion.
3940
- // Test whether exponent equal to 0x7FF (infinity or NaN).
3941
-
3942
- __ mfc1(t3, f1); // Move exponent word of double to t3 (as raw bits).
3943
- __ li(t1, Operand(0x7FF00000));
3944
- __ And(t3, t3, Operand(t1));
3945
- __ Branch(USE_DELAY_SLOT, &done, eq, t3, Operand(t1));
3946
- __ mov(t3, zero_reg); // In delay slot.
3947
-
3948
- // Not infinity or NaN simply convert to int.
3949
- if (IsElementTypeSigned(array_type)) {
3950
- __ trunc_w_d(f0, f0);
3951
- __ mfc1(t3, f0);
3952
- } else {
3953
- __ Trunc_uw_d(f0, t3);
3954
- }
3958
+ __ EmitECMATruncate(t3, f0, f2, t2, t1, t5);
3955
3959
 
3956
- // t3: HeapNumber converted to integer
3957
- __ bind(&done);
3958
- switch (array_type) {
3959
- case kExternalByteArray:
3960
- case kExternalUnsignedByteArray:
3960
+ switch (elements_kind) {
3961
+ case JSObject::EXTERNAL_BYTE_ELEMENTS:
3962
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3961
3963
  __ addu(t8, a3, t0);
3962
3964
  __ sb(t3, MemOperand(t8, 0));
3963
3965
  break;
3964
- case kExternalShortArray:
3965
- case kExternalUnsignedShortArray:
3966
+ case JSObject::EXTERNAL_SHORT_ELEMENTS:
3967
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3966
3968
  __ sll(t8, t0, 1);
3967
3969
  __ addu(t8, a3, t8);
3968
3970
  __ sh(t3, MemOperand(t8, 0));
3969
3971
  break;
3970
- case kExternalIntArray:
3971
- case kExternalUnsignedIntArray:
3972
+ case JSObject::EXTERNAL_INT_ELEMENTS:
3973
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
3972
3974
  __ sll(t8, t0, 2);
3973
3975
  __ addu(t8, a3, t8);
3974
3976
  __ sw(t3, MemOperand(t8, 0));
3975
3977
  break;
3976
- default:
3978
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS:
3979
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS:
3980
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
3981
+ case JSObject::FAST_ELEMENTS:
3982
+ case JSObject::FAST_DOUBLE_ELEMENTS:
3983
+ case JSObject::DICTIONARY_ELEMENTS:
3984
+ case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
3977
3985
  UNREACHABLE();
3978
3986
  break;
3979
3987
  }
@@ -3989,7 +3997,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3989
3997
  __ lw(t3, FieldMemOperand(value, HeapNumber::kExponentOffset));
3990
3998
  __ lw(t4, FieldMemOperand(value, HeapNumber::kMantissaOffset));
3991
3999
 
3992
- if (array_type == kExternalFloatArray) {
4000
+ if (elements_kind == JSObject::EXTERNAL_FLOAT_ELEMENTS) {
3993
4001
  Label done, nan_or_infinity_or_zero;
3994
4002
  static const int kMantissaInHiWordShift =
3995
4003
  kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord;
@@ -4054,7 +4062,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4054
4062
  __ srl(t4, t4, kMantissaInLoWordShift);
4055
4063
  __ or_(t3, t6, t4);
4056
4064
  __ Branch(&done);
4057
- } else if (array_type == kExternalDoubleArray) {
4065
+ } else if (elements_kind == JSObject::EXTERNAL_DOUBLE_ELEMENTS) {
4058
4066
  __ sll(t8, t0, 3);
4059
4067
  __ addu(t8, a3, t8);
4060
4068
  // t8: effective address of destination element.
@@ -4062,7 +4070,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4062
4070
  __ sw(t3, MemOperand(t8, Register::kSizeInBytes));
4063
4071
  __ Ret();
4064
4072
  } else {
4065
- bool is_signed_type = IsElementTypeSigned(array_type);
4073
+ bool is_signed_type = IsElementTypeSigned(elements_kind);
4066
4074
  int meaningfull_bits = is_signed_type ? (kBitsPerInt - 1) : kBitsPerInt;
4067
4075
  int32_t min_value = is_signed_type ? 0x80000000 : 0x00000000;
4068
4076
 
@@ -4119,25 +4127,31 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4119
4127
 
4120
4128
  // Result is in t3.
4121
4129
  // This switch block should be exactly the same as above (FPU mode).
4122
- switch (array_type) {
4123
- case kExternalByteArray:
4124
- case kExternalUnsignedByteArray:
4130
+ switch (elements_kind) {
4131
+ case JSObject::EXTERNAL_BYTE_ELEMENTS:
4132
+ case JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
4125
4133
  __ addu(t8, a3, t0);
4126
4134
  __ sb(t3, MemOperand(t8, 0));
4127
4135
  break;
4128
- case kExternalShortArray:
4129
- case kExternalUnsignedShortArray:
4136
+ case JSObject::EXTERNAL_SHORT_ELEMENTS:
4137
+ case JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
4130
4138
  __ sll(t8, t0, 1);
4131
4139
  __ addu(t8, a3, t8);
4132
4140
  __ sh(t3, MemOperand(t8, 0));
4133
4141
  break;
4134
- case kExternalIntArray:
4135
- case kExternalUnsignedIntArray:
4142
+ case JSObject::EXTERNAL_INT_ELEMENTS:
4143
+ case JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS:
4136
4144
  __ sll(t8, t0, 2);
4137
4145
  __ addu(t8, a3, t8);
4138
4146
  __ sw(t3, MemOperand(t8, 0));
4139
4147
  break;
4140
- default:
4148
+ case JSObject::EXTERNAL_PIXEL_ELEMENTS:
4149
+ case JSObject::EXTERNAL_FLOAT_ELEMENTS:
4150
+ case JSObject::EXTERNAL_DOUBLE_ELEMENTS:
4151
+ case JSObject::FAST_ELEMENTS:
4152
+ case JSObject::FAST_DOUBLE_ELEMENTS:
4153
+ case JSObject::DICTIONARY_ELEMENTS:
4154
+ case JSObject::NON_STRICT_ARGUMENTS_ELEMENTS:
4141
4155
  UNREACHABLE();
4142
4156
  break;
4143
4157
  }
@@ -4215,6 +4229,75 @@ void KeyedLoadStubCompiler::GenerateLoadFastElement(MacroAssembler* masm) {
4215
4229
  }
4216
4230
 
4217
4231
 
4232
+ void KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(
4233
+ MacroAssembler* masm) {
4234
+ // ----------- S t a t e -------------
4235
+ // -- ra : return address
4236
+ // -- a0 : key
4237
+ // -- a1 : receiver
4238
+ // -----------------------------------
4239
+ Label miss_force_generic, slow_allocate_heapnumber;
4240
+
4241
+ Register key_reg = a0;
4242
+ Register receiver_reg = a1;
4243
+ Register elements_reg = a2;
4244
+ Register heap_number_reg = a2;
4245
+ Register indexed_double_offset = a3;
4246
+ Register scratch = t0;
4247
+ Register scratch2 = t1;
4248
+ Register scratch3 = t2;
4249
+ Register heap_number_map = t3;
4250
+
4251
+ // This stub is meant to be tail-jumped to, the receiver must already
4252
+ // have been verified by the caller to not be a smi.
4253
+
4254
+ // Check that the key is a smi.
4255
+ __ JumpIfNotSmi(key_reg, &miss_force_generic);
4256
+
4257
+ // Get the elements array.
4258
+ __ lw(elements_reg,
4259
+ FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
4260
+
4261
+ // Check that the key is within bounds.
4262
+ __ lw(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
4263
+ __ Branch(&miss_force_generic, hs, key_reg, Operand(scratch));
4264
+
4265
+ // Load the upper word of the double in the fixed array and test for NaN.
4266
+ __ sll(scratch2, key_reg, kDoubleSizeLog2 - kSmiTagSize);
4267
+ __ Addu(indexed_double_offset, elements_reg, Operand(scratch2));
4268
+ uint32_t upper_32_offset = FixedArray::kHeaderSize + sizeof(kHoleNanLower32);
4269
+ __ lw(scratch, FieldMemOperand(indexed_double_offset, upper_32_offset));
4270
+ __ Branch(&miss_force_generic, eq, scratch, Operand(kHoleNanUpper32));
4271
+
4272
+ // Non-NaN. Allocate a new heap number and copy the double value into it.
4273
+ __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex);
4274
+ __ AllocateHeapNumber(heap_number_reg, scratch2, scratch3,
4275
+ heap_number_map, &slow_allocate_heapnumber);
4276
+
4277
+ // Don't need to reload the upper 32 bits of the double, it's already in
4278
+ // scratch.
4279
+ __ sw(scratch, FieldMemOperand(heap_number_reg,
4280
+ HeapNumber::kExponentOffset));
4281
+ __ lw(scratch, FieldMemOperand(indexed_double_offset,
4282
+ FixedArray::kHeaderSize));
4283
+ __ sw(scratch, FieldMemOperand(heap_number_reg,
4284
+ HeapNumber::kMantissaOffset));
4285
+
4286
+ __ mov(v0, heap_number_reg);
4287
+ __ Ret();
4288
+
4289
+ __ bind(&slow_allocate_heapnumber);
4290
+ Handle<Code> slow_ic =
4291
+ masm->isolate()->builtins()->KeyedLoadIC_Slow();
4292
+ __ Jump(slow_ic, RelocInfo::CODE_TARGET);
4293
+
4294
+ __ bind(&miss_force_generic);
4295
+ Handle<Code> miss_ic =
4296
+ masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
4297
+ __ Jump(miss_ic, RelocInfo::CODE_TARGET);
4298
+ }
4299
+
4300
+
4218
4301
  void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
4219
4302
  bool is_js_array) {
4220
4303
  // ----------- S t a t e -------------
@@ -4239,7 +4322,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
4239
4322
  // have been verified by the caller to not be a smi.
4240
4323
 
4241
4324
  // Check that the key is a smi.
4242
- __ JumpIfNotSmi(a0, &miss_force_generic);
4325
+ __ JumpIfNotSmi(key_reg, &miss_force_generic);
4243
4326
 
4244
4327
  // Get the elements array and make sure it is a fast element array, not 'cow'.
4245
4328
  __ lw(elements_reg,
@@ -4278,6 +4361,135 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm,
4278
4361
  }
4279
4362
 
4280
4363
 
4364
+ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4365
+ MacroAssembler* masm,
4366
+ bool is_js_array) {
4367
+ // ----------- S t a t e -------------
4368
+ // -- a0 : value
4369
+ // -- a1 : key
4370
+ // -- a2 : receiver
4371
+ // -- ra : return address
4372
+ // -- a3 : scratch
4373
+ // -- t0 : scratch (elements_reg)
4374
+ // -- t1 : scratch (mantissa_reg)
4375
+ // -- t2 : scratch (exponent_reg)
4376
+ // -- t3 : scratch4
4377
+ // -----------------------------------
4378
+ Label miss_force_generic, smi_value, is_nan, maybe_nan, have_double_value;
4379
+
4380
+ Register value_reg = a0;
4381
+ Register key_reg = a1;
4382
+ Register receiver_reg = a2;
4383
+ Register scratch = a3;
4384
+ Register elements_reg = t0;
4385
+ Register mantissa_reg = t1;
4386
+ Register exponent_reg = t2;
4387
+ Register scratch4 = t3;
4388
+
4389
+ // This stub is meant to be tail-jumped to, the receiver must already
4390
+ // have been verified by the caller to not be a smi.
4391
+ __ JumpIfNotSmi(key_reg, &miss_force_generic);
4392
+
4393
+ __ lw(elements_reg,
4394
+ FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
4395
+
4396
+ // Check that the key is within bounds.
4397
+ if (is_js_array) {
4398
+ __ lw(scratch, FieldMemOperand(receiver_reg, JSArray::kLengthOffset));
4399
+ } else {
4400
+ __ lw(scratch,
4401
+ FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
4402
+ }
4403
+ // Compare smis, unsigned compare catches both negative and out-of-bound
4404
+ // indexes.
4405
+ __ Branch(&miss_force_generic, hs, key_reg, Operand(scratch));
4406
+
4407
+ // Handle smi values specially.
4408
+ __ JumpIfSmi(value_reg, &smi_value);
4409
+
4410
+ // Ensure that the object is a heap number
4411
+ __ CheckMap(value_reg,
4412
+ scratch,
4413
+ masm->isolate()->factory()->heap_number_map(),
4414
+ &miss_force_generic,
4415
+ DONT_DO_SMI_CHECK);
4416
+
4417
+ // Check for nan: all NaN values have a value greater (signed) than 0x7ff00000
4418
+ // in the exponent.
4419
+ __ li(scratch, Operand(kNaNOrInfinityLowerBoundUpper32));
4420
+ __ lw(exponent_reg, FieldMemOperand(value_reg, HeapNumber::kExponentOffset));
4421
+ __ Branch(&maybe_nan, ge, exponent_reg, Operand(scratch));
4422
+
4423
+ __ lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
4424
+
4425
+ __ bind(&have_double_value);
4426
+ __ sll(scratch4, key_reg, kDoubleSizeLog2 - kSmiTagSize);
4427
+ __ Addu(scratch, elements_reg, Operand(scratch4));
4428
+ __ sw(mantissa_reg, FieldMemOperand(scratch, FixedDoubleArray::kHeaderSize));
4429
+ uint32_t offset = FixedDoubleArray::kHeaderSize + sizeof(kHoleNanLower32);
4430
+ __ sw(exponent_reg, FieldMemOperand(scratch, offset));
4431
+ __ Ret(USE_DELAY_SLOT);
4432
+ __ mov(v0, value_reg); // In delay slot.
4433
+
4434
+ __ bind(&maybe_nan);
4435
+ // Could be NaN or Infinity. If fraction is not zero, it's NaN, otherwise
4436
+ // it's an Infinity, and the non-NaN code path applies.
4437
+ __ li(scratch, Operand(kNaNOrInfinityLowerBoundUpper32));
4438
+ __ Branch(&is_nan, gt, exponent_reg, Operand(scratch));
4439
+ __ lw(mantissa_reg, FieldMemOperand(value_reg, HeapNumber::kMantissaOffset));
4440
+ __ Branch(&have_double_value, eq, mantissa_reg, Operand(zero_reg));
4441
+
4442
+ __ bind(&is_nan);
4443
+ // Load canonical NaN for storing into the double array.
4444
+ uint64_t nan_int64 = BitCast<uint64_t>(
4445
+ FixedDoubleArray::canonical_not_the_hole_nan_as_double());
4446
+ __ li(mantissa_reg, Operand(static_cast<uint32_t>(nan_int64)));
4447
+ __ li(exponent_reg, Operand(static_cast<uint32_t>(nan_int64 >> 32)));
4448
+ __ jmp(&have_double_value);
4449
+
4450
+ __ bind(&smi_value);
4451
+ __ Addu(scratch, elements_reg,
4452
+ Operand(FixedDoubleArray::kHeaderSize - kHeapObjectTag));
4453
+ __ sll(scratch4, key_reg, kDoubleSizeLog2 - kSmiTagSize);
4454
+ __ Addu(scratch, scratch, scratch4);
4455
+ // scratch is now effective address of the double element
4456
+
4457
+ FloatingPointHelper::Destination destination;
4458
+ if (CpuFeatures::IsSupported(FPU)) {
4459
+ destination = FloatingPointHelper::kFPURegisters;
4460
+ } else {
4461
+ destination = FloatingPointHelper::kCoreRegisters;
4462
+ }
4463
+
4464
+ Register untagged_value = receiver_reg;
4465
+ __ SmiUntag(untagged_value, value_reg);
4466
+ FloatingPointHelper::ConvertIntToDouble(
4467
+ masm,
4468
+ untagged_value,
4469
+ destination,
4470
+ f0,
4471
+ mantissa_reg,
4472
+ exponent_reg,
4473
+ scratch4,
4474
+ f2);
4475
+ if (destination == FloatingPointHelper::kFPURegisters) {
4476
+ CpuFeatures::Scope scope(FPU);
4477
+ __ sdc1(f0, MemOperand(scratch, 0));
4478
+ } else {
4479
+ __ sw(mantissa_reg, MemOperand(scratch, 0));
4480
+ __ sw(exponent_reg, MemOperand(scratch, Register::kSizeInBytes));
4481
+ }
4482
+ __ Ret(USE_DELAY_SLOT);
4483
+ __ mov(v0, value_reg); // In delay slot.
4484
+
4485
+ // Handle store cache miss, replacing the ic with the generic stub.
4486
+ __ bind(&miss_force_generic);
4487
+ Handle<Code> ic =
4488
+ masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric();
4489
+ __ Jump(ic, RelocInfo::CODE_TARGET);
4490
+ }
4491
+
4492
+
4281
4493
  #undef __
4282
4494
 
4283
4495
  } } // namespace v8::internal