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
@@ -88,7 +88,8 @@ void IC::TraceIC(const char* type,
88
88
  // function and the original code.
89
89
  JSFunction* function = JSFunction::cast(frame->function());
90
90
  function->PrintName();
91
- int code_offset = address() - js_code->instruction_start();
91
+ int code_offset =
92
+ static_cast<int>(address() - js_code->instruction_start());
92
93
  PrintF("+%d", code_offset);
93
94
  } else {
94
95
  PrintF("<unknown>");
@@ -309,6 +310,7 @@ void IC::Clear(Address address) {
309
310
  case Code::UNARY_OP_IC:
310
311
  case Code::BINARY_OP_IC:
311
312
  case Code::COMPARE_IC:
313
+ case Code::TO_BOOLEAN_IC:
312
314
  // Clearing these is tricky and does not
313
315
  // make any performance difference.
314
316
  return;
@@ -578,13 +580,7 @@ bool CallICBase::TryUpdateExtraICState(LookupResult* lookup,
578
580
  // out of bounds, update the state to record this fact.
579
581
  if (StringStubState::decode(*extra_ic_state) == DEFAULT_STRING_STUB &&
580
582
  argc >= 1 && args[1]->IsNumber()) {
581
- double index;
582
- if (args[1]->IsSmi()) {
583
- index = Smi::cast(args[1])->value();
584
- } else {
585
- ASSERT(args[1]->IsHeapNumber());
586
- index = DoubleToInteger(HeapNumber::cast(args[1])->value());
587
- }
583
+ double index = DoubleToInteger(args.number_at(1));
588
584
  if (index < 0 || index >= string->length()) {
589
585
  *extra_ic_state =
590
586
  StringStubState::update(*extra_ic_state,
@@ -799,18 +795,35 @@ MaybeObject* KeyedCallIC::LoadFunction(State state,
799
795
  return TypeError("non_object_property_call", object, key);
800
796
  }
801
797
 
802
- if (FLAG_use_ic && state != MEGAMORPHIC && !object->IsAccessCheckNeeded()) {
798
+ if (FLAG_use_ic && state != MEGAMORPHIC && object->IsHeapObject()) {
803
799
  int argc = target()->arguments_count();
804
800
  InLoopFlag in_loop = target()->ic_in_loop();
805
- MaybeObject* maybe_code = isolate()->stub_cache()->ComputeCallMegamorphic(
806
- argc, in_loop, Code::KEYED_CALL_IC, Code::kNoExtraICState);
807
- Object* code;
808
- if (maybe_code->ToObject(&code)) {
809
- set_target(Code::cast(code));
801
+ Heap* heap = Handle<HeapObject>::cast(object)->GetHeap();
802
+ Map* map = heap->non_strict_arguments_elements_map();
803
+ if (object->IsJSObject() &&
804
+ Handle<JSObject>::cast(object)->elements()->map() == map) {
805
+ MaybeObject* maybe_code = isolate()->stub_cache()->ComputeCallArguments(
806
+ argc, in_loop, Code::KEYED_CALL_IC);
807
+ Object* code;
808
+ if (maybe_code->ToObject(&code)) {
809
+ set_target(Code::cast(code));
810
810
  #ifdef DEBUG
811
- TraceIC(
812
- "KeyedCallIC", key, state, target(), in_loop ? " (in-loop)" : "");
811
+ TraceIC(
812
+ "KeyedCallIC", key, state, target(), in_loop ? " (in-loop)" : "");
813
813
  #endif
814
+ }
815
+ } else if (FLAG_use_ic && state != MEGAMORPHIC &&
816
+ !object->IsAccessCheckNeeded()) {
817
+ MaybeObject* maybe_code = isolate()->stub_cache()->ComputeCallMegamorphic(
818
+ argc, in_loop, Code::KEYED_CALL_IC, Code::kNoExtraICState);
819
+ Object* code;
820
+ if (maybe_code->ToObject(&code)) {
821
+ set_target(Code::cast(code));
822
+ #ifdef DEBUG
823
+ TraceIC(
824
+ "KeyedCallIC", key, state, target(), in_loop ? " (in-loop)" : "");
825
+ #endif
826
+ }
814
827
  }
815
828
  }
816
829
 
@@ -831,14 +844,6 @@ MaybeObject* KeyedCallIC::LoadFunction(State state,
831
844
  }
832
845
 
833
846
 
834
- #ifdef DEBUG
835
- #define TRACE_IC_NAMED(msg, name) \
836
- if (FLAG_trace_ic) PrintF(msg, *(name)->ToCString())
837
- #else
838
- #define TRACE_IC_NAMED(msg, name)
839
- #endif
840
-
841
-
842
847
  MaybeObject* LoadIC::Load(State state,
843
848
  Handle<Object> object,
844
849
  Handle<String> name) {
@@ -849,37 +854,40 @@ MaybeObject* LoadIC::Load(State state,
849
854
  }
850
855
 
851
856
  if (FLAG_use_ic) {
852
- Code* non_monomorphic_stub =
853
- (state == UNINITIALIZED) ? pre_monomorphic_stub() : megamorphic_stub();
854
-
855
857
  // Use specialized code for getting the length of strings and
856
858
  // string wrapper objects. The length property of string wrapper
857
859
  // objects is read-only and therefore always returns the length of
858
860
  // the underlying string value. See ECMA-262 15.5.5.1.
859
861
  if ((object->IsString() || object->IsStringWrapper()) &&
860
862
  name->Equals(isolate()->heap()->length_symbol())) {
861
- HandleScope scope(isolate());
862
- #ifdef DEBUG
863
- if (FLAG_trace_ic) PrintF("[LoadIC : +#length /string]\n");
864
- #endif
865
- if (state == PREMONOMORPHIC) {
863
+ AssertNoAllocation no_allocation;
864
+ Code* stub = NULL;
865
+ if (state == UNINITIALIZED) {
866
+ stub = pre_monomorphic_stub();
867
+ } else if (state == PREMONOMORPHIC) {
866
868
  if (object->IsString()) {
867
- set_target(isolate()->builtins()->builtin(
868
- Builtins::kLoadIC_StringLength));
869
+ stub = isolate()->builtins()->builtin(
870
+ Builtins::kLoadIC_StringLength);
869
871
  } else {
870
- set_target(isolate()->builtins()->builtin(
871
- Builtins::kLoadIC_StringWrapperLength));
872
+ stub = isolate()->builtins()->builtin(
873
+ Builtins::kLoadIC_StringWrapperLength);
872
874
  }
873
875
  } else if (state == MONOMORPHIC && object->IsStringWrapper()) {
874
- set_target(isolate()->builtins()->builtin(
875
- Builtins::kLoadIC_StringWrapperLength));
876
- } else {
877
- set_target(non_monomorphic_stub);
876
+ stub = isolate()->builtins()->builtin(
877
+ Builtins::kLoadIC_StringWrapperLength);
878
+ } else if (state != MEGAMORPHIC) {
879
+ stub = megamorphic_stub();
880
+ }
881
+ if (stub != NULL) {
882
+ set_target(stub);
883
+ #ifdef DEBUG
884
+ if (FLAG_trace_ic) PrintF("[LoadIC : +#length /string]\n");
885
+ #endif
878
886
  }
879
887
  // Get the string if we have a string wrapper object.
880
888
  if (object->IsJSValue()) {
881
- object = Handle<Object>(Handle<JSValue>::cast(object)->value(),
882
- isolate());
889
+ return Smi::FromInt(
890
+ String::cast(Handle<JSValue>::cast(object)->value())->length());
883
891
  }
884
892
  return Smi::FromInt(String::cast(*object)->length());
885
893
  }
@@ -887,14 +895,21 @@ MaybeObject* LoadIC::Load(State state,
887
895
  // Use specialized code for getting the length of arrays.
888
896
  if (object->IsJSArray() &&
889
897
  name->Equals(isolate()->heap()->length_symbol())) {
898
+ AssertNoAllocation no_allocation;
899
+ Code* stub = NULL;
900
+ if (state == UNINITIALIZED) {
901
+ stub = pre_monomorphic_stub();
902
+ } else if (state == PREMONOMORPHIC) {
903
+ stub = isolate()->builtins()->builtin(
904
+ Builtins::kLoadIC_ArrayLength);
905
+ } else if (state != MEGAMORPHIC) {
906
+ stub = megamorphic_stub();
907
+ }
908
+ if (stub != NULL) {
909
+ set_target(stub);
890
910
  #ifdef DEBUG
891
- if (FLAG_trace_ic) PrintF("[LoadIC : +#length /array]\n");
911
+ if (FLAG_trace_ic) PrintF("[LoadIC : +#length /array]\n");
892
912
  #endif
893
- if (state == PREMONOMORPHIC) {
894
- set_target(isolate()->builtins()->builtin(
895
- Builtins::kLoadIC_ArrayLength));
896
- } else {
897
- set_target(non_monomorphic_stub);
898
913
  }
899
914
  return JSArray::cast(*object)->length();
900
915
  }
@@ -903,14 +918,22 @@ MaybeObject* LoadIC::Load(State state,
903
918
  if (object->IsJSFunction() &&
904
919
  name->Equals(isolate()->heap()->prototype_symbol()) &&
905
920
  JSFunction::cast(*object)->should_have_prototype()) {
921
+ { AssertNoAllocation no_allocation;
922
+ Code* stub = NULL;
923
+ if (state == UNINITIALIZED) {
924
+ stub = pre_monomorphic_stub();
925
+ } else if (state == PREMONOMORPHIC) {
926
+ stub = isolate()->builtins()->builtin(
927
+ Builtins::kLoadIC_FunctionPrototype);
928
+ } else if (state != MEGAMORPHIC) {
929
+ stub = megamorphic_stub();
930
+ }
931
+ if (stub != NULL) {
932
+ set_target(stub);
906
933
  #ifdef DEBUG
907
- if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n");
934
+ if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n");
908
935
  #endif
909
- if (state == PREMONOMORPHIC) {
910
- set_target(isolate()->builtins()->builtin(
911
- Builtins::kLoadIC_FunctionPrototype));
912
- } else {
913
- set_target(non_monomorphic_stub);
936
+ }
914
937
  }
915
938
  return Accessors::FunctionGetPrototype(*object, 0);
916
939
  }
@@ -927,7 +950,7 @@ MaybeObject* LoadIC::Load(State state,
927
950
 
928
951
  // If we did not find a property, check if we need to throw an exception.
929
952
  if (!lookup.IsProperty()) {
930
- if (FLAG_strict || IsContextual(object)) {
953
+ if (IsContextual(object)) {
931
954
  return ReferenceError("not_defined", name);
932
955
  }
933
956
  LOG(isolate(), SuspectReadEvent(*name, *object));
@@ -1068,25 +1091,10 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
1068
1091
  }
1069
1092
 
1070
1093
 
1071
- String* KeyedLoadIC::GetStubNameForCache(IC::State ic_state) {
1072
- if (ic_state == MONOMORPHIC) {
1073
- return isolate()->heap()->KeyedLoadSpecializedMonomorphic_symbol();
1074
- } else {
1075
- ASSERT(ic_state == MEGAMORPHIC);
1076
- return isolate()->heap()->KeyedLoadSpecializedPolymorphic_symbol();
1077
- }
1078
- }
1079
-
1080
-
1081
- MaybeObject* KeyedLoadIC::GetFastElementStubWithoutMapCheck(
1082
- bool is_js_array) {
1083
- return KeyedLoadFastElementStub().TryGetCode();
1084
- }
1085
-
1086
-
1087
- MaybeObject* KeyedLoadIC::GetExternalArrayStubWithoutMapCheck(
1088
- ExternalArrayType array_type) {
1089
- return KeyedLoadExternalArrayStub(array_type).TryGetCode();
1094
+ MaybeObject* KeyedLoadIC::GetElementStubWithoutMapCheck(
1095
+ bool is_js_array,
1096
+ JSObject::ElementsKind elements_kind) {
1097
+ return KeyedLoadElementStub(elements_kind).TryGetCode();
1090
1098
  }
1091
1099
 
1092
1100
 
@@ -1201,10 +1209,8 @@ MaybeObject* KeyedLoadIC::Load(State state,
1201
1209
  LookupForRead(*object, *name, &lookup);
1202
1210
 
1203
1211
  // If we did not find a property, check if we need to throw an exception.
1204
- if (!lookup.IsProperty()) {
1205
- if (FLAG_strict || IsContextual(object)) {
1206
- return ReferenceError("not_defined", name);
1207
- }
1212
+ if (!lookup.IsProperty() && IsContextual(object)) {
1213
+ return ReferenceError("not_defined", name);
1208
1214
  }
1209
1215
 
1210
1216
  if (FLAG_use_ic) {
@@ -1243,9 +1249,13 @@ MaybeObject* KeyedLoadIC::Load(State state,
1243
1249
  }
1244
1250
  } else if (object->IsJSObject()) {
1245
1251
  JSObject* receiver = JSObject::cast(*object);
1246
- if (receiver->HasIndexedInterceptor()) {
1252
+ Heap* heap = Handle<JSObject>::cast(object)->GetHeap();
1253
+ Map* elements_map = Handle<JSObject>::cast(object)->elements()->map();
1254
+ if (elements_map == heap->non_strict_arguments_elements_map()) {
1255
+ stub = non_strict_arguments_stub();
1256
+ } else if (receiver->HasIndexedInterceptor()) {
1247
1257
  stub = indexed_interceptor_stub();
1248
- } else if (key->IsSmi()) {
1258
+ } else if (key->IsSmi() && (target() != non_strict_arguments_stub())) {
1249
1259
  MaybeObject* maybe_stub = ComputeStub(receiver,
1250
1260
  false,
1251
1261
  kNonStrictMode,
@@ -1355,15 +1365,16 @@ static bool StoreICableLookup(LookupResult* lookup) {
1355
1365
  }
1356
1366
 
1357
1367
 
1358
- static bool LookupForWrite(JSObject* object,
1368
+ static bool LookupForWrite(JSReceiver* receiver,
1359
1369
  String* name,
1360
1370
  LookupResult* lookup) {
1361
- object->LocalLookup(name, lookup);
1371
+ receiver->LocalLookup(name, lookup);
1362
1372
  if (!StoreICableLookup(lookup)) {
1363
1373
  return false;
1364
1374
  }
1365
1375
 
1366
1376
  if (lookup->type() == INTERCEPTOR) {
1377
+ JSObject* object = JSObject::cast(receiver);
1367
1378
  if (object->GetNamedInterceptor()->setter()->IsUndefined()) {
1368
1379
  object->LocalLookupRealNamedProperty(name, lookup);
1369
1380
  return StoreICableLookup(lookup);
@@ -1385,7 +1396,7 @@ MaybeObject* StoreIC::Store(State state,
1385
1396
  return TypeError("non_object_property_store", object, name);
1386
1397
  }
1387
1398
 
1388
- if (!object->IsJSObject()) {
1399
+ if (!object->IsJSReceiver()) {
1389
1400
  // The length property of string values is read-only. Throw in strict mode.
1390
1401
  if (strict_mode == kStrictMode && object->IsString() &&
1391
1402
  name->Equals(isolate()->heap()->length_symbol())) {
@@ -1395,6 +1406,12 @@ MaybeObject* StoreIC::Store(State state,
1395
1406
  return *value;
1396
1407
  }
1397
1408
 
1409
+ // Handle proxies.
1410
+ if (object->IsJSProxy()) {
1411
+ return JSReceiver::cast(*object)->
1412
+ SetProperty(*name, *value, NONE, strict_mode);
1413
+ }
1414
+
1398
1415
  Handle<JSObject> receiver = Handle<JSObject>::cast(object);
1399
1416
 
1400
1417
  // Check if the given name is an array index.
@@ -1409,7 +1426,7 @@ MaybeObject* StoreIC::Store(State state,
1409
1426
  // Use specialized code for setting the length of arrays.
1410
1427
  if (receiver->IsJSArray()
1411
1428
  && name->Equals(isolate()->heap()->length_symbol())
1412
- && receiver->AllowsSetElementsLength()) {
1429
+ && JSArray::cast(*receiver)->AllowsSetElementsLength()) {
1413
1430
  #ifdef DEBUG
1414
1431
  if (FLAG_trace_ic) PrintF("[StoreIC : +#length /array]\n");
1415
1432
  #endif
@@ -1596,18 +1613,14 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
1596
1613
  StrictModeFlag strict_mode,
1597
1614
  Code* generic_stub) {
1598
1615
  State ic_state = target()->ic_state();
1599
- Code* monomorphic_stub;
1600
- // Always compute the MONOMORPHIC stub, even if the MEGAMORPHIC stub ends up
1601
- // being used. This is necessary because the megamorphic stub needs to have
1602
- // access to more information than what is stored in the receiver map in some
1603
- // cases (external arrays need the array type from the MONOMORPHIC stub).
1604
- MaybeObject* maybe_stub = ComputeMonomorphicStub(receiver,
1605
- is_store,
1606
- strict_mode,
1607
- generic_stub);
1608
- if (!maybe_stub->To(&monomorphic_stub)) return maybe_stub;
1609
-
1610
1616
  if (ic_state == UNINITIALIZED || ic_state == PREMONOMORPHIC) {
1617
+ Code* monomorphic_stub;
1618
+ MaybeObject* maybe_stub = ComputeMonomorphicStub(receiver,
1619
+ is_store,
1620
+ strict_mode,
1621
+ generic_stub);
1622
+ if (!maybe_stub->To(&monomorphic_stub)) return maybe_stub;
1623
+
1611
1624
  return monomorphic_stub;
1612
1625
  }
1613
1626
  ASSERT(target() != generic_stub);
@@ -1629,79 +1642,40 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
1629
1642
  return generic_stub;
1630
1643
  }
1631
1644
 
1632
- // TODO(1385): Currently MEGAMORPHIC stubs are cached in the receiver map stub
1633
- // cache, but that can put receiver types together from unrelated call sites
1634
- // into the same stub--they always handle the union of all receiver maps seen
1635
- // at all call sites involving the receiver map. This is only an
1636
- // approximation: ideally, there would be a global cache that mapped sets of
1637
- // receiver maps to MEGAMORPHIC stubs. The complexity of the MEGAMORPHIC stub
1638
- // computation also leads to direct manipulation of the stub cache from the IC
1639
- // code, which the global cache solution would avoid.
1640
- Code::Kind kind = this->kind();
1641
- Code::Flags flags = Code::ComputeFlags(kind,
1642
- NOT_IN_LOOP,
1643
- MEGAMORPHIC,
1644
- strict_mode);
1645
- String* megamorphic_name = GetStubNameForCache(MEGAMORPHIC);
1646
- Object* maybe_cached_stub = receiver->map()->FindInCodeCache(megamorphic_name,
1647
- flags);
1648
-
1649
- // Create a set of all receiver maps that have been seen at the IC call site
1650
- // and those seen by the MEGAMORPHIC cached stub, if that's the stub that's
1651
- // been selected.
1652
- MapList receiver_maps;
1653
- if (!maybe_cached_stub->IsUndefined()) {
1654
- GetReceiverMapsForStub(Code::cast(maybe_cached_stub), &receiver_maps);
1655
- }
1656
- bool added_map = false;
1657
- for (int i = 0; i < target_receiver_maps.length(); ++i) {
1658
- if (AddOneReceiverMapIfMissing(&receiver_maps,
1659
- target_receiver_maps.at(i))) {
1660
- added_map = true;
1661
- }
1662
- }
1663
- ASSERT(receiver_maps.length() > 0);
1664
-
1665
- // If the maximum number of receiver maps has been exceeded, use the Generic
1645
+ // If the maximum number of receiver maps has been exceeded, use the generic
1666
1646
  // version of the IC.
1667
- if (receiver_maps.length() > KeyedIC::kMaxKeyedPolymorphism) {
1647
+ if (target_receiver_maps.length() > kMaxKeyedPolymorphism) {
1668
1648
  return generic_stub;
1669
1649
  }
1670
1650
 
1671
- // If no maps have been seen at the call site that aren't in the cached
1672
- // stub, then use it.
1673
- if (!added_map) {
1674
- ASSERT(!maybe_cached_stub->IsUndefined());
1651
+ PolymorphicCodeCache* cache = isolate()->heap()->polymorphic_code_cache();
1652
+ Code::Flags flags = Code::ComputeFlags(this->kind(),
1653
+ NOT_IN_LOOP,
1654
+ MEGAMORPHIC,
1655
+ strict_mode);
1656
+ Object* maybe_cached_stub = cache->Lookup(&target_receiver_maps, flags);
1657
+ // If there is a cached stub, use it.
1658
+ if (!maybe_cached_stub->IsUndefined()) {
1675
1659
  ASSERT(maybe_cached_stub->IsCode());
1676
1660
  return Code::cast(maybe_cached_stub);
1677
1661
  }
1678
-
1679
- // Lookup all of the receiver maps in the cache, they should all already
1680
- // have MONOMORPHIC stubs.
1681
- CodeList handler_ics(KeyedIC::kMaxKeyedPolymorphism);
1682
- for (int current = 0; current < receiver_maps.length(); ++current) {
1683
- Map* receiver_map(receiver_maps.at(current));
1662
+ // Collect MONOMORPHIC stubs for all target_receiver_maps.
1663
+ CodeList handler_ics(target_receiver_maps.length());
1664
+ for (int i = 0; i < target_receiver_maps.length(); ++i) {
1665
+ Map* receiver_map(target_receiver_maps.at(i));
1684
1666
  MaybeObject* maybe_cached_stub = ComputeMonomorphicStubWithoutMapCheck(
1685
- receiver_map,
1686
- strict_mode,
1687
- generic_stub);
1667
+ receiver_map, strict_mode);
1688
1668
  Code* cached_stub;
1689
- if (!maybe_cached_stub->To(&cached_stub)) {
1690
- return maybe_cached_stub;
1691
- }
1669
+ if (!maybe_cached_stub->To(&cached_stub)) return maybe_cached_stub;
1692
1670
  handler_ics.Add(cached_stub);
1693
1671
  }
1694
-
1695
- Code* stub;
1696
1672
  // Build the MEGAMORPHIC stub.
1697
- maybe_stub = ConstructMegamorphicStub(&receiver_maps,
1698
- &handler_ics,
1699
- strict_mode);
1673
+ Code* stub;
1674
+ MaybeObject* maybe_stub = ConstructMegamorphicStub(&target_receiver_maps,
1675
+ &handler_ics,
1676
+ strict_mode);
1700
1677
  if (!maybe_stub->To(&stub)) return maybe_stub;
1701
-
1702
- MaybeObject* maybe_update = receiver->UpdateMapCodeCache(
1703
- megamorphic_name,
1704
- stub);
1678
+ MaybeObject* maybe_update = cache->Update(&target_receiver_maps, flags, stub);
1705
1679
  if (maybe_update->IsFailure()) return maybe_update;
1706
1680
  return stub;
1707
1681
  }
@@ -1709,33 +1683,18 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
1709
1683
 
1710
1684
  MaybeObject* KeyedIC::ComputeMonomorphicStubWithoutMapCheck(
1711
1685
  Map* receiver_map,
1712
- StrictModeFlag strict_mode,
1713
- Code* generic_stub) {
1686
+ StrictModeFlag strict_mode) {
1714
1687
  if ((receiver_map->instance_type() & kNotStringTag) == 0) {
1715
1688
  ASSERT(string_stub() != NULL);
1716
1689
  return string_stub();
1717
- } else if (receiver_map->has_external_array_elements()) {
1718
- // Determine the array type from the default MONOMORPHIC already generated
1719
- // stub. There is no other way to determine the type of the external array
1720
- // directly from the receiver type.
1721
- Code::Kind kind = this->kind();
1722
- Code::Flags flags = Code::ComputeMonomorphicFlags(kind,
1723
- NORMAL,
1724
- strict_mode);
1725
- String* monomorphic_name = GetStubNameForCache(MONOMORPHIC);
1726
- Object* maybe_default_stub = receiver_map->FindInCodeCache(monomorphic_name,
1727
- flags);
1728
- if (maybe_default_stub->IsUndefined()) {
1729
- return generic_stub;
1730
- }
1731
- Code* default_stub = Code::cast(maybe_default_stub);
1732
- return GetExternalArrayStubWithoutMapCheck(
1733
- default_stub->external_array_type());
1734
- } else if (receiver_map->has_fast_elements()) {
1735
- bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
1736
- return GetFastElementStubWithoutMapCheck(is_js_array);
1737
1690
  } else {
1738
- return generic_stub;
1691
+ ASSERT(receiver_map->has_dictionary_elements() ||
1692
+ receiver_map->has_fast_elements() ||
1693
+ receiver_map->has_fast_double_elements() ||
1694
+ receiver_map->has_external_array_elements());
1695
+ bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
1696
+ return GetElementStubWithoutMapCheck(is_js_array,
1697
+ receiver_map->elements_kind());
1739
1698
  }
1740
1699
  }
1741
1700
 
@@ -1745,14 +1704,12 @@ MaybeObject* KeyedIC::ComputeMonomorphicStub(JSObject* receiver,
1745
1704
  StrictModeFlag strict_mode,
1746
1705
  Code* generic_stub) {
1747
1706
  Code* result = NULL;
1748
- if (receiver->HasExternalArrayElements()) {
1749
- MaybeObject* maybe_stub =
1750
- isolate()->stub_cache()->ComputeKeyedLoadOrStoreExternalArray(
1751
- receiver, is_store, strict_mode);
1752
- if (!maybe_stub->To(&result)) return maybe_stub;
1753
- } else if (receiver->map()->has_fast_elements()) {
1707
+ if (receiver->HasFastElements() ||
1708
+ receiver->HasExternalArrayElements() ||
1709
+ receiver->HasFastDoubleElements() ||
1710
+ receiver->HasDictionaryElements()) {
1754
1711
  MaybeObject* maybe_stub =
1755
- isolate()->stub_cache()->ComputeKeyedLoadOrStoreFastElement(
1712
+ isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement(
1756
1713
  receiver, is_store, strict_mode);
1757
1714
  if (!maybe_stub->To(&result)) return maybe_stub;
1758
1715
  } else {
@@ -1762,25 +1719,10 @@ MaybeObject* KeyedIC::ComputeMonomorphicStub(JSObject* receiver,
1762
1719
  }
1763
1720
 
1764
1721
 
1765
- String* KeyedStoreIC::GetStubNameForCache(IC::State ic_state) {
1766
- if (ic_state == MONOMORPHIC) {
1767
- return isolate()->heap()->KeyedStoreSpecializedMonomorphic_symbol();
1768
- } else {
1769
- ASSERT(ic_state == MEGAMORPHIC);
1770
- return isolate()->heap()->KeyedStoreSpecializedPolymorphic_symbol();
1771
- }
1772
- }
1773
-
1774
-
1775
- MaybeObject* KeyedStoreIC::GetFastElementStubWithoutMapCheck(
1776
- bool is_js_array) {
1777
- return KeyedStoreFastElementStub(is_js_array).TryGetCode();
1778
- }
1779
-
1780
-
1781
- MaybeObject* KeyedStoreIC::GetExternalArrayStubWithoutMapCheck(
1782
- ExternalArrayType array_type) {
1783
- return KeyedStoreExternalArrayStub(array_type).TryGetCode();
1722
+ MaybeObject* KeyedStoreIC::GetElementStubWithoutMapCheck(
1723
+ bool is_js_array,
1724
+ JSObject::ElementsKind elements_kind) {
1725
+ return KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode();
1784
1726
  }
1785
1727
 
1786
1728
 
@@ -1851,15 +1793,22 @@ MaybeObject* KeyedStoreIC::Store(State state,
1851
1793
  Code* stub = (strict_mode == kStrictMode)
1852
1794
  ? generic_stub_strict()
1853
1795
  : generic_stub();
1854
- if (!force_generic) {
1855
- if (object->IsJSObject() && key->IsSmi()) {
1856
- JSObject* receiver = JSObject::cast(*object);
1857
- MaybeObject* maybe_stub = ComputeStub(receiver,
1858
- true,
1859
- strict_mode,
1860
- stub);
1861
- stub = maybe_stub->IsFailure() ?
1862
- NULL : Code::cast(maybe_stub->ToObjectUnchecked());
1796
+ if (object->IsJSObject()) {
1797
+ JSObject* receiver = JSObject::cast(*object);
1798
+ Heap* heap = Handle<JSObject>::cast(object)->GetHeap();
1799
+ Map* elements_map = Handle<JSObject>::cast(object)->elements()->map();
1800
+ if (elements_map == heap->non_strict_arguments_elements_map()) {
1801
+ stub = non_strict_arguments_stub();
1802
+ } else if (!force_generic) {
1803
+ if (key->IsSmi() && (target() != non_strict_arguments_stub())) {
1804
+ HandleScope scope(isolate());
1805
+ MaybeObject* maybe_stub = ComputeStub(receiver,
1806
+ true,
1807
+ strict_mode,
1808
+ stub);
1809
+ stub = maybe_stub->IsFailure() ?
1810
+ NULL : Code::cast(maybe_stub->ToObjectUnchecked());
1811
+ }
1863
1812
  }
1864
1813
  }
1865
1814
  if (stub != NULL) set_target(stub);
@@ -2325,25 +2274,21 @@ BinaryOpIC::TypeInfo BinaryOpIC::GetTypeInfo(Handle<Object> left,
2325
2274
  }
2326
2275
 
2327
2276
 
2328
- // defined in code-stubs-<arch>.cc
2329
- // Only needed to remove dependency of ic.cc on code-stubs-<arch>.h.
2330
- Handle<Code> GetUnaryOpStub(int key, UnaryOpIC::TypeInfo type_info);
2331
-
2332
-
2333
2277
  RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) {
2334
2278
  ASSERT(args.length() == 4);
2335
2279
 
2336
2280
  HandleScope scope(isolate);
2337
2281
  Handle<Object> operand = args.at<Object>(0);
2338
- int key = Smi::cast(args[1])->value();
2339
- Token::Value op = static_cast<Token::Value>(Smi::cast(args[2])->value());
2282
+ Token::Value op = static_cast<Token::Value>(args.smi_at(1));
2283
+ UnaryOverwriteMode mode = static_cast<UnaryOverwriteMode>(args.smi_at(2));
2340
2284
  UnaryOpIC::TypeInfo previous_type =
2341
- static_cast<UnaryOpIC::TypeInfo>(Smi::cast(args[3])->value());
2285
+ static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3));
2342
2286
 
2343
2287
  UnaryOpIC::TypeInfo type = UnaryOpIC::GetTypeInfo(operand);
2344
2288
  type = UnaryOpIC::ComputeNewType(type, previous_type);
2345
2289
 
2346
- Handle<Code> code = GetUnaryOpStub(key, type);
2290
+ UnaryOpStub stub(op, mode, type);
2291
+ Handle<Code> code = stub.GetCode();
2347
2292
  if (!code.is_null()) {
2348
2293
  if (FLAG_trace_ic) {
2349
2294
  PrintF("[UnaryOpIC (%s->%s)#%s]\n",
@@ -2380,23 +2325,16 @@ RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) {
2380
2325
  return *result;
2381
2326
  }
2382
2327
 
2383
- // defined in code-stubs-<arch>.cc
2384
- // Only needed to remove dependency of ic.cc on code-stubs-<arch>.h.
2385
- Handle<Code> GetBinaryOpStub(int key,
2386
- BinaryOpIC::TypeInfo type_info,
2387
- BinaryOpIC::TypeInfo result_type);
2388
-
2389
-
2390
2328
  RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
2391
2329
  ASSERT(args.length() == 5);
2392
2330
 
2393
2331
  HandleScope scope(isolate);
2394
2332
  Handle<Object> left = args.at<Object>(0);
2395
2333
  Handle<Object> right = args.at<Object>(1);
2396
- int key = Smi::cast(args[2])->value();
2397
- Token::Value op = static_cast<Token::Value>(Smi::cast(args[3])->value());
2334
+ int key = args.smi_at(2);
2335
+ Token::Value op = static_cast<Token::Value>(args.smi_at(3));
2398
2336
  BinaryOpIC::TypeInfo previous_type =
2399
- static_cast<BinaryOpIC::TypeInfo>(Smi::cast(args[4])->value());
2337
+ static_cast<BinaryOpIC::TypeInfo>(args.smi_at(4));
2400
2338
 
2401
2339
  BinaryOpIC::TypeInfo type = BinaryOpIC::GetTypeInfo(left, right);
2402
2340
  type = BinaryOpIC::JoinTypes(type, previous_type);
@@ -2425,7 +2363,8 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
2425
2363
  result_type = BinaryOpIC::HEAP_NUMBER;
2426
2364
  }
2427
2365
 
2428
- Handle<Code> code = GetBinaryOpStub(key, type, result_type);
2366
+ BinaryOpStub stub(key, type, result_type);
2367
+ Handle<Code> code = stub.GetCode();
2429
2368
  if (!code.is_null()) {
2430
2369
  if (FLAG_trace_ic) {
2431
2370
  PrintF("[BinaryOpIC (%s->(%s->%s))#%s]\n",
@@ -2555,12 +2494,37 @@ CompareIC::State CompareIC::TargetState(State state,
2555
2494
  RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
2556
2495
  NoHandleAllocation na;
2557
2496
  ASSERT(args.length() == 3);
2558
- CompareIC ic(isolate, static_cast<Token::Value>(Smi::cast(args[2])->value()));
2497
+ CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2)));
2559
2498
  ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1));
2560
2499
  return ic.target();
2561
2500
  }
2562
2501
 
2563
2502
 
2503
+ RUNTIME_FUNCTION(MaybeObject*, ToBoolean_Patch) {
2504
+ ASSERT(args.length() == 3);
2505
+
2506
+ HandleScope scope(isolate);
2507
+ Handle<Object> object = args.at<Object>(0);
2508
+ Register tos = Register::from_code(args.smi_at(1));
2509
+ ToBooleanStub::Types old_types(args.smi_at(2));
2510
+
2511
+ ToBooleanStub::Types new_types(old_types);
2512
+ bool to_boolean_value = new_types.Record(object);
2513
+ old_types.TraceTransition(new_types);
2514
+
2515
+ ToBooleanStub stub(tos, new_types);
2516
+ Handle<Code> code = stub.GetCode();
2517
+ ToBooleanIC ic(isolate);
2518
+ ic.patch(*code);
2519
+ return Smi::FromInt(to_boolean_value ? 1 : 0);
2520
+ }
2521
+
2522
+
2523
+ void ToBooleanIC::patch(Code* code) {
2524
+ set_target(code);
2525
+ }
2526
+
2527
+
2564
2528
  static const Address IC_utilities[] = {
2565
2529
  #define ADDR(name) FUNCTION_ADDR(name),
2566
2530
  IC_UTIL_LIST(ADDR)