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
@@ -108,7 +108,7 @@ class LCodeGen BASE_EMBEDDED {
108
108
  void DoDeferredNumberTagI(LNumberTagI* instr);
109
109
  void DoDeferredTaggedToI(LTaggedToI* instr);
110
110
  void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr);
111
- void DoDeferredStackCheck(LGoto* instr);
111
+ void DoDeferredStackCheck(LStackCheck* instr);
112
112
  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
113
113
  void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
114
114
  void DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
@@ -148,7 +148,7 @@ class LCodeGen BASE_EMBEDDED {
148
148
  HGraph* graph() const { return chunk_->graph(); }
149
149
 
150
150
  Register scratch0() { return r9; }
151
- DwVfpRegister double_scratch0() { return d0; }
151
+ DwVfpRegister double_scratch0() { return d15; }
152
152
 
153
153
  int GetNextEmittedBlock(int block);
154
154
  LInstruction* GetNextInstruction();
@@ -261,11 +261,12 @@ class LCodeGen BASE_EMBEDDED {
261
261
  }
262
262
 
263
263
  static Condition TokenToCondition(Token::Value op, bool is_unsigned);
264
- void EmitGoto(int block, LDeferredCode* deferred_stack_check = NULL);
264
+ void EmitGoto(int block);
265
265
  void EmitBranch(int left_block, int right_block, Condition cc);
266
266
  void EmitCmpI(LOperand* left, LOperand* right);
267
267
  void EmitNumberUntagD(Register input,
268
268
  DoubleRegister result,
269
+ bool deoptimize_on_undefined,
269
270
  LEnvironment* env);
270
271
 
271
272
  // Emits optimized code for typeof x == "y". Modifies input register.
@@ -279,7 +280,6 @@ class LCodeGen BASE_EMBEDDED {
279
280
  // true and false label should be made, to optimize fallthrough.
280
281
  Condition EmitIsObject(Register input,
281
282
  Register temp1,
282
- Register temp2,
283
283
  Label* is_not_object,
284
284
  Label* is_object);
285
285
 
@@ -254,7 +254,6 @@ void LGapResolver::EmitMove(int index) {
254
254
  } else {
255
255
  ASSERT(destination->IsStackSlot());
256
256
  ASSERT(!in_cycle_); // Constant moves happen after all cycles are gone.
257
- MemOperand destination_operand = cgen_->ToMemOperand(destination);
258
257
  __ mov(kSavedValueRegister, source_operand);
259
258
  __ str(kSavedValueRegister, cgen_->ToMemOperand(destination));
260
259
  }
@@ -265,8 +264,7 @@ void LGapResolver::EmitMove(int index) {
265
264
  __ vmov(cgen_->ToDoubleRegister(destination), source_register);
266
265
  } else {
267
266
  ASSERT(destination->IsDoubleStackSlot());
268
- MemOperand destination_operand = cgen_->ToMemOperand(destination);
269
- __ vstr(source_register, destination_operand);
267
+ __ vstr(source_register, cgen_->ToMemOperand(destination));
270
268
  }
271
269
 
272
270
  } else if (source->IsDoubleStackSlot()) {
@@ -91,7 +91,7 @@ void MacroAssembler::Jump(intptr_t target, RelocInfo::Mode rmode,
91
91
  }
92
92
 
93
93
 
94
- void MacroAssembler::Jump(byte* target, RelocInfo::Mode rmode,
94
+ void MacroAssembler::Jump(Address target, RelocInfo::Mode rmode,
95
95
  Condition cond) {
96
96
  ASSERT(!RelocInfo::IsCodeTarget(rmode));
97
97
  Jump(reinterpret_cast<intptr_t>(target), rmode, cond);
@@ -118,10 +118,8 @@ int MacroAssembler::CallSize(Register target, Condition cond) {
118
118
  void MacroAssembler::Call(Register target, Condition cond) {
119
119
  // Block constant pool for the call instruction sequence.
120
120
  BlockConstPoolScope block_const_pool(this);
121
- #ifdef DEBUG
122
- int pre_position = pc_offset();
123
- #endif
124
-
121
+ Label start;
122
+ bind(&start);
125
123
  #if USE_BLX
126
124
  blx(target, cond);
127
125
  #else
@@ -129,34 +127,29 @@ void MacroAssembler::Call(Register target, Condition cond) {
129
127
  mov(lr, Operand(pc), LeaveCC, cond);
130
128
  mov(pc, Operand(target), LeaveCC, cond);
131
129
  #endif
132
-
133
- #ifdef DEBUG
134
- int post_position = pc_offset();
135
- CHECK_EQ(pre_position + CallSize(target, cond), post_position);
136
- #endif
130
+ ASSERT_EQ(CallSize(target, cond), SizeOfCodeGeneratedSince(&start));
137
131
  }
138
132
 
139
133
 
140
134
  int MacroAssembler::CallSize(
141
- intptr_t target, RelocInfo::Mode rmode, Condition cond) {
135
+ Address target, RelocInfo::Mode rmode, Condition cond) {
142
136
  int size = 2 * kInstrSize;
143
137
  Instr mov_instr = cond | MOV | LeaveCC;
144
- if (!Operand(target, rmode).is_single_instruction(mov_instr)) {
138
+ intptr_t immediate = reinterpret_cast<intptr_t>(target);
139
+ if (!Operand(immediate, rmode).is_single_instruction(mov_instr)) {
145
140
  size += kInstrSize;
146
141
  }
147
142
  return size;
148
143
  }
149
144
 
150
145
 
151
- void MacroAssembler::Call(intptr_t target,
146
+ void MacroAssembler::Call(Address target,
152
147
  RelocInfo::Mode rmode,
153
148
  Condition cond) {
154
149
  // Block constant pool for the call instruction sequence.
155
150
  BlockConstPoolScope block_const_pool(this);
156
- #ifdef DEBUG
157
- int pre_position = pc_offset();
158
- #endif
159
-
151
+ Label start;
152
+ bind(&start);
160
153
  #if USE_BLX
161
154
  // On ARMv5 and after the recommended call sequence is:
162
155
  // ldr ip, [pc, #...]
@@ -168,7 +161,7 @@ void MacroAssembler::Call(intptr_t target,
168
161
  // we have to do it explicitly.
169
162
  positions_recorder()->WriteRecordedPositions();
170
163
 
171
- mov(ip, Operand(target, rmode));
164
+ mov(ip, Operand(reinterpret_cast<int32_t>(target), rmode));
172
165
  blx(ip, cond);
173
166
 
174
167
  ASSERT(kCallTargetAddressOffset == 2 * kInstrSize);
@@ -176,82 +169,36 @@ void MacroAssembler::Call(intptr_t target,
176
169
  // Set lr for return at current pc + 8.
177
170
  mov(lr, Operand(pc), LeaveCC, cond);
178
171
  // Emit a ldr<cond> pc, [pc + offset of target in constant pool].
179
- mov(pc, Operand(target, rmode), LeaveCC, cond);
172
+ mov(pc, Operand(reinterpret_cast<int32_t>(target), rmode), LeaveCC, cond);
180
173
  ASSERT(kCallTargetAddressOffset == kInstrSize);
181
174
  #endif
182
-
183
- #ifdef DEBUG
184
- int post_position = pc_offset();
185
- CHECK_EQ(pre_position + CallSize(target, rmode, cond), post_position);
186
- #endif
187
- }
188
-
189
-
190
- int MacroAssembler::CallSize(
191
- byte* target, RelocInfo::Mode rmode, Condition cond) {
192
- return CallSize(reinterpret_cast<intptr_t>(target), rmode);
193
- }
194
-
195
-
196
- void MacroAssembler::Call(
197
- byte* target, RelocInfo::Mode rmode, Condition cond) {
198
- #ifdef DEBUG
199
- int pre_position = pc_offset();
200
- #endif
201
-
202
- ASSERT(!RelocInfo::IsCodeTarget(rmode));
203
- Call(reinterpret_cast<intptr_t>(target), rmode, cond);
204
-
205
- #ifdef DEBUG
206
- int post_position = pc_offset();
207
- CHECK_EQ(pre_position + CallSize(target, rmode, cond), post_position);
208
- #endif
175
+ ASSERT_EQ(CallSize(target, rmode, cond), SizeOfCodeGeneratedSince(&start));
209
176
  }
210
177
 
211
178
 
212
- int MacroAssembler::CallSize(
213
- Handle<Code> code, RelocInfo::Mode rmode, Condition cond) {
214
- return CallSize(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
215
- }
216
-
217
-
218
- void MacroAssembler::CallWithAstId(Handle<Code> code,
219
- RelocInfo::Mode rmode,
220
- unsigned ast_id,
221
- Condition cond) {
222
- #ifdef DEBUG
223
- int pre_position = pc_offset();
224
- #endif
225
-
226
- ASSERT(rmode == RelocInfo::CODE_TARGET_WITH_ID);
227
- ASSERT(ast_id != kNoASTId);
228
- ASSERT(ast_id_for_reloc_info_ == kNoASTId);
229
- ast_id_for_reloc_info_ = ast_id;
230
- // 'code' is always generated ARM code, never THUMB code
231
- Call(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
232
-
233
- #ifdef DEBUG
234
- int post_position = pc_offset();
235
- CHECK_EQ(pre_position + CallSize(code, rmode, cond), post_position);
236
- #endif
179
+ int MacroAssembler::CallSize(Handle<Code> code,
180
+ RelocInfo::Mode rmode,
181
+ unsigned ast_id,
182
+ Condition cond) {
183
+ return CallSize(reinterpret_cast<Address>(code.location()), rmode, cond);
237
184
  }
238
185
 
239
186
 
240
187
  void MacroAssembler::Call(Handle<Code> code,
241
188
  RelocInfo::Mode rmode,
189
+ unsigned ast_id,
242
190
  Condition cond) {
243
- #ifdef DEBUG
244
- int pre_position = pc_offset();
245
- #endif
246
-
191
+ Label start;
192
+ bind(&start);
247
193
  ASSERT(RelocInfo::IsCodeTarget(rmode));
194
+ if (rmode == RelocInfo::CODE_TARGET && ast_id != kNoASTId) {
195
+ SetRecordedAstId(ast_id);
196
+ rmode = RelocInfo::CODE_TARGET_WITH_ID;
197
+ }
248
198
  // 'code' is always generated ARM code, never THUMB code
249
- Call(reinterpret_cast<intptr_t>(code.location()), rmode, cond);
250
-
251
- #ifdef DEBUG
252
- int post_position = pc_offset();
253
- CHECK_EQ(pre_position + CallSize(code, rmode, cond), post_position);
254
- #endif
199
+ Call(reinterpret_cast<Address>(code.location()), rmode, cond);
200
+ ASSERT_EQ(CallSize(code, rmode, ast_id, cond),
201
+ SizeOfCodeGeneratedSince(&start));
255
202
  }
256
203
 
257
204
 
@@ -298,14 +245,20 @@ void MacroAssembler::Call(Label* target) {
298
245
  }
299
246
 
300
247
 
248
+ void MacroAssembler::Push(Handle<Object> handle) {
249
+ mov(ip, Operand(handle));
250
+ push(ip);
251
+ }
252
+
253
+
301
254
  void MacroAssembler::Move(Register dst, Handle<Object> value) {
302
255
  mov(dst, Operand(value));
303
256
  }
304
257
 
305
258
 
306
- void MacroAssembler::Move(Register dst, Register src) {
259
+ void MacroAssembler::Move(Register dst, Register src, Condition cond) {
307
260
  if (!dst.is(src)) {
308
- mov(dst, src);
261
+ mov(dst, src, LeaveCC, cond);
309
262
  }
310
263
  }
311
264
 
@@ -330,7 +283,8 @@ void MacroAssembler::And(Register dst, Register src1, const Operand& src2,
330
283
  !src2.must_use_constant_pool() &&
331
284
  CpuFeatures::IsSupported(ARMv7) &&
332
285
  IsPowerOf2(src2.immediate() + 1)) {
333
- ubfx(dst, src1, 0, WhichPowerOf2(src2.immediate() + 1), cond);
286
+ ubfx(dst, src1, 0,
287
+ WhichPowerOf2(static_cast<uint32_t>(src2.immediate()) + 1), cond);
334
288
 
335
289
  } else {
336
290
  and_(dst, src1, src2, LeaveCC, cond);
@@ -438,20 +392,6 @@ void MacroAssembler::Usat(Register dst, int satpos, const Operand& src,
438
392
  }
439
393
 
440
394
 
441
- void MacroAssembler::SmiJumpTable(Register index, Vector<Label*> targets) {
442
- // Empty the const pool.
443
- CheckConstPool(true, true);
444
- add(pc, pc, Operand(index,
445
- LSL,
446
- Instruction::kInstrSizeLog2 - kSmiTagSize));
447
- BlockConstPoolBefore(pc_offset() + (targets.length() + 1) * kInstrSize);
448
- nop(); // Jump table alignment.
449
- for (int i = 0; i < targets.length(); i++) {
450
- b(targets[i]);
451
- }
452
- }
453
-
454
-
455
395
  void MacroAssembler::LoadRoot(Register destination,
456
396
  Heap::RootListIndex index,
457
397
  Condition cond) {
@@ -654,19 +594,36 @@ void MacroAssembler::Ldrd(Register dst1, Register dst2,
654
594
  ASSERT_EQ(0, dst1.code() % 2);
655
595
  ASSERT_EQ(dst1.code() + 1, dst2.code());
656
596
 
597
+ // V8 does not use this addressing mode, so the fallback code
598
+ // below doesn't support it yet.
599
+ ASSERT((src.am() != PreIndex) && (src.am() != NegPreIndex));
600
+
657
601
  // Generate two ldr instructions if ldrd is not available.
658
602
  if (CpuFeatures::IsSupported(ARMv7)) {
659
603
  CpuFeatures::Scope scope(ARMv7);
660
604
  ldrd(dst1, dst2, src, cond);
661
605
  } else {
662
- MemOperand src2(src);
663
- src2.set_offset(src2.offset() + 4);
664
- if (dst1.is(src.rn())) {
665
- ldr(dst2, src2, cond);
666
- ldr(dst1, src, cond);
667
- } else {
668
- ldr(dst1, src, cond);
669
- ldr(dst2, src2, cond);
606
+ if ((src.am() == Offset) || (src.am() == NegOffset)) {
607
+ MemOperand src2(src);
608
+ src2.set_offset(src2.offset() + 4);
609
+ if (dst1.is(src.rn())) {
610
+ ldr(dst2, src2, cond);
611
+ ldr(dst1, src, cond);
612
+ } else {
613
+ ldr(dst1, src, cond);
614
+ ldr(dst2, src2, cond);
615
+ }
616
+ } else { // PostIndex or NegPostIndex.
617
+ ASSERT((src.am() == PostIndex) || (src.am() == NegPostIndex));
618
+ if (dst1.is(src.rn())) {
619
+ ldr(dst2, MemOperand(src.rn(), 4, Offset), cond);
620
+ ldr(dst1, src, cond);
621
+ } else {
622
+ MemOperand src2(src);
623
+ src2.set_offset(src2.offset() - 4);
624
+ ldr(dst1, MemOperand(src.rn(), 4, PostIndex), cond);
625
+ ldr(dst2, src2, cond);
626
+ }
670
627
  }
671
628
  }
672
629
  }
@@ -679,15 +636,26 @@ void MacroAssembler::Strd(Register src1, Register src2,
679
636
  ASSERT_EQ(0, src1.code() % 2);
680
637
  ASSERT_EQ(src1.code() + 1, src2.code());
681
638
 
639
+ // V8 does not use this addressing mode, so the fallback code
640
+ // below doesn't support it yet.
641
+ ASSERT((dst.am() != PreIndex) && (dst.am() != NegPreIndex));
642
+
682
643
  // Generate two str instructions if strd is not available.
683
644
  if (CpuFeatures::IsSupported(ARMv7)) {
684
645
  CpuFeatures::Scope scope(ARMv7);
685
646
  strd(src1, src2, dst, cond);
686
647
  } else {
687
648
  MemOperand dst2(dst);
688
- dst2.set_offset(dst2.offset() + 4);
689
- str(src1, dst, cond);
690
- str(src2, dst2, cond);
649
+ if ((dst.am() == Offset) || (dst.am() == NegOffset)) {
650
+ dst2.set_offset(dst2.offset() + 4);
651
+ str(src1, dst, cond);
652
+ str(src2, dst2, cond);
653
+ } else { // PostIndex or NegPostIndex.
654
+ ASSERT((dst.am() == PostIndex) || (dst.am() == NegPostIndex));
655
+ dst2.set_offset(dst2.offset() - 4);
656
+ str(src1, MemOperand(dst.rn(), 4, PostIndex), cond);
657
+ str(src2, dst2, cond);
658
+ }
691
659
  }
692
660
  }
693
661
 
@@ -734,6 +702,23 @@ void MacroAssembler::VFPCompareAndLoadFlags(const DwVfpRegister src1,
734
702
  vmrs(fpscr_flags, cond);
735
703
  }
736
704
 
705
+ void MacroAssembler::Vmov(const DwVfpRegister dst,
706
+ const double imm,
707
+ const Condition cond) {
708
+ ASSERT(CpuFeatures::IsEnabled(VFP3));
709
+ static const DoubleRepresentation minus_zero(-0.0);
710
+ static const DoubleRepresentation zero(0.0);
711
+ DoubleRepresentation value(imm);
712
+ // Handle special values first.
713
+ if (value.bits == zero.bits) {
714
+ vmov(dst, kDoubleRegZero, cond);
715
+ } else if (value.bits == minus_zero.bits) {
716
+ vneg(dst, kDoubleRegZero, cond);
717
+ } else {
718
+ vmov(dst, imm, cond);
719
+ }
720
+ }
721
+
737
722
 
738
723
  void MacroAssembler::EnterFrame(StackFrame::Type type) {
739
724
  // r0-r3: preserved
@@ -956,9 +941,9 @@ void MacroAssembler::InvokePrologue(const ParameterCount& expected,
956
941
  Handle<Code> adaptor =
957
942
  isolate()->builtins()->ArgumentsAdaptorTrampoline();
958
943
  if (flag == CALL_FUNCTION) {
959
- call_wrapper.BeforeCall(CallSize(adaptor, RelocInfo::CODE_TARGET));
944
+ call_wrapper.BeforeCall(CallSize(adaptor));
960
945
  SetCallKind(r5, call_kind);
961
- Call(adaptor, RelocInfo::CODE_TARGET);
946
+ Call(adaptor);
962
947
  call_wrapper.AfterCall();
963
948
  b(done);
964
949
  } else {
@@ -1048,7 +1033,8 @@ void MacroAssembler::InvokeFunction(Register fun,
1048
1033
 
1049
1034
  void MacroAssembler::InvokeFunction(JSFunction* function,
1050
1035
  const ParameterCount& actual,
1051
- InvokeFlag flag) {
1036
+ InvokeFlag flag,
1037
+ CallKind call_kind) {
1052
1038
  ASSERT(function->is_compiled());
1053
1039
 
1054
1040
  // Get the function and setup the context.
@@ -1063,9 +1049,9 @@ void MacroAssembler::InvokeFunction(JSFunction* function,
1063
1049
  // code field in the function to allow recompilation to take effect
1064
1050
  // without changing any of the call sites.
1065
1051
  ldr(r3, FieldMemOperand(r1, JSFunction::kCodeEntryOffset));
1066
- InvokeCode(r3, expected, actual, flag);
1052
+ InvokeCode(r3, expected, actual, flag, NullCallWrapper(), call_kind);
1067
1053
  } else {
1068
- InvokeCode(code, expected, actual, RelocInfo::CODE_TARGET, flag);
1054
+ InvokeCode(code, expected, actual, RelocInfo::CODE_TARGET, flag, call_kind);
1069
1055
  }
1070
1056
  }
1071
1057
 
@@ -1083,9 +1069,9 @@ void MacroAssembler::IsInstanceJSObjectType(Register map,
1083
1069
  Register scratch,
1084
1070
  Label* fail) {
1085
1071
  ldrb(scratch, FieldMemOperand(map, Map::kInstanceTypeOffset));
1086
- cmp(scratch, Operand(FIRST_JS_OBJECT_TYPE));
1072
+ cmp(scratch, Operand(FIRST_NONCALLABLE_SPEC_OBJECT_TYPE));
1087
1073
  b(lt, fail);
1088
- cmp(scratch, Operand(LAST_JS_OBJECT_TYPE));
1074
+ cmp(scratch, Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE));
1089
1075
  b(gt, fail);
1090
1076
  }
1091
1077
 
@@ -1116,7 +1102,13 @@ void MacroAssembler::DebugBreak() {
1116
1102
  void MacroAssembler::PushTryHandler(CodeLocation try_location,
1117
1103
  HandlerType type) {
1118
1104
  // Adjust this code if not the case.
1119
- ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
1105
+ STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize);
1106
+ STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize);
1107
+ STATIC_ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize);
1108
+ STATIC_ASSERT(StackHandlerConstants::kContextOffset == 2 * kPointerSize);
1109
+ STATIC_ASSERT(StackHandlerConstants::kFPOffset == 3 * kPointerSize);
1110
+ STATIC_ASSERT(StackHandlerConstants::kPCOffset == 4 * kPointerSize);
1111
+
1120
1112
  // The pc (return address) is passed in register lr.
1121
1113
  if (try_location == IN_JAVASCRIPT) {
1122
1114
  if (type == TRY_CATCH_HANDLER) {
@@ -1124,14 +1116,10 @@ void MacroAssembler::PushTryHandler(CodeLocation try_location,
1124
1116
  } else {
1125
1117
  mov(r3, Operand(StackHandler::TRY_FINALLY));
1126
1118
  }
1127
- ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize
1128
- && StackHandlerConstants::kFPOffset == 2 * kPointerSize
1129
- && StackHandlerConstants::kPCOffset == 3 * kPointerSize);
1130
- stm(db_w, sp, r3.bit() | fp.bit() | lr.bit());
1119
+ stm(db_w, sp, r3.bit() | cp.bit() | fp.bit() | lr.bit());
1131
1120
  // Save the current handler as the next handler.
1132
1121
  mov(r3, Operand(ExternalReference(Isolate::k_handler_address, isolate())));
1133
1122
  ldr(r1, MemOperand(r3));
1134
- ASSERT(StackHandlerConstants::kNextOffset == 0);
1135
1123
  push(r1);
1136
1124
  // Link this handler as the new current one.
1137
1125
  str(sp, MemOperand(r3));
@@ -1141,16 +1129,13 @@ void MacroAssembler::PushTryHandler(CodeLocation try_location,
1141
1129
  // The frame pointer does not point to a JS frame so we save NULL
1142
1130
  // for fp. We expect the code throwing an exception to check fp
1143
1131
  // before dereferencing it to restore the context.
1144
- mov(ip, Operand(0, RelocInfo::NONE)); // To save a NULL frame pointer.
1145
- mov(r6, Operand(StackHandler::ENTRY));
1146
- ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize
1147
- && StackHandlerConstants::kFPOffset == 2 * kPointerSize
1148
- && StackHandlerConstants::kPCOffset == 3 * kPointerSize);
1149
- stm(db_w, sp, r6.bit() | ip.bit() | lr.bit());
1132
+ mov(r5, Operand(StackHandler::ENTRY)); // State.
1133
+ mov(r6, Operand(Smi::FromInt(0))); // Indicates no context.
1134
+ mov(r7, Operand(0, RelocInfo::NONE)); // NULL frame pointer.
1135
+ stm(db_w, sp, r5.bit() | r6.bit() | r7.bit() | lr.bit());
1150
1136
  // Save the current handler as the next handler.
1151
1137
  mov(r7, Operand(ExternalReference(Isolate::k_handler_address, isolate())));
1152
1138
  ldr(r6, MemOperand(r7));
1153
- ASSERT(StackHandlerConstants::kNextOffset == 0);
1154
1139
  push(r6);
1155
1140
  // Link this handler as the new current one.
1156
1141
  str(sp, MemOperand(r7));
@@ -1159,7 +1144,7 @@ void MacroAssembler::PushTryHandler(CodeLocation try_location,
1159
1144
 
1160
1145
 
1161
1146
  void MacroAssembler::PopTryHandler() {
1162
- ASSERT_EQ(0, StackHandlerConstants::kNextOffset);
1147
+ STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
1163
1148
  pop(r1);
1164
1149
  mov(ip, Operand(ExternalReference(Isolate::k_handler_address, isolate())));
1165
1150
  add(sp, sp, Operand(StackHandlerConstants::kSize - kPointerSize));
@@ -1168,39 +1153,40 @@ void MacroAssembler::PopTryHandler() {
1168
1153
 
1169
1154
 
1170
1155
  void MacroAssembler::Throw(Register value) {
1156
+ // Adjust this code if not the case.
1157
+ STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize);
1158
+ STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize);
1159
+ STATIC_ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize);
1160
+ STATIC_ASSERT(StackHandlerConstants::kContextOffset == 2 * kPointerSize);
1161
+ STATIC_ASSERT(StackHandlerConstants::kFPOffset == 3 * kPointerSize);
1162
+ STATIC_ASSERT(StackHandlerConstants::kPCOffset == 4 * kPointerSize);
1171
1163
  // r0 is expected to hold the exception.
1172
1164
  if (!value.is(r0)) {
1173
1165
  mov(r0, value);
1174
1166
  }
1175
1167
 
1176
- // Adjust this code if not the case.
1177
- STATIC_ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
1178
-
1179
1168
  // Drop the sp to the top of the handler.
1180
1169
  mov(r3, Operand(ExternalReference(Isolate::k_handler_address, isolate())));
1181
1170
  ldr(sp, MemOperand(r3));
1182
1171
 
1183
- // Restore the next handler and frame pointer, discard handler state.
1184
- STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
1172
+ // Restore the next handler.
1185
1173
  pop(r2);
1186
1174
  str(r2, MemOperand(r3));
1187
- STATIC_ASSERT(StackHandlerConstants::kFPOffset == 2 * kPointerSize);
1188
- ldm(ia_w, sp, r3.bit() | fp.bit()); // r3: discarded state.
1189
-
1190
- // Before returning we restore the context from the frame pointer if
1191
- // not NULL. The frame pointer is NULL in the exception handler of a
1192
- // JS entry frame.
1193
- cmp(fp, Operand(0, RelocInfo::NONE));
1194
- // Set cp to NULL if fp is NULL.
1195
- mov(cp, Operand(0, RelocInfo::NONE), LeaveCC, eq);
1196
- // Restore cp otherwise.
1197
- ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset), ne);
1175
+
1176
+ // Restore context and frame pointer, discard state (r3).
1177
+ ldm(ia_w, sp, r3.bit() | cp.bit() | fp.bit());
1178
+
1179
+ // If the handler is a JS frame, restore the context to the frame.
1180
+ // (r3 == ENTRY) == (fp == 0) == (cp == 0), so we could test any
1181
+ // of them.
1182
+ cmp(r3, Operand(StackHandler::ENTRY));
1183
+ str(cp, MemOperand(fp, StandardFrameConstants::kContextOffset), ne);
1184
+
1198
1185
  #ifdef DEBUG
1199
1186
  if (emit_debug_code()) {
1200
1187
  mov(lr, Operand(pc));
1201
1188
  }
1202
1189
  #endif
1203
- STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
1204
1190
  pop(pc);
1205
1191
  }
1206
1192
 
@@ -1208,8 +1194,12 @@ void MacroAssembler::Throw(Register value) {
1208
1194
  void MacroAssembler::ThrowUncatchable(UncatchableExceptionType type,
1209
1195
  Register value) {
1210
1196
  // Adjust this code if not the case.
1211
- STATIC_ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
1212
-
1197
+ STATIC_ASSERT(StackHandlerConstants::kSize == 5 * kPointerSize);
1198
+ STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0 * kPointerSize);
1199
+ STATIC_ASSERT(StackHandlerConstants::kStateOffset == 1 * kPointerSize);
1200
+ STATIC_ASSERT(StackHandlerConstants::kContextOffset == 2 * kPointerSize);
1201
+ STATIC_ASSERT(StackHandlerConstants::kFPOffset == 3 * kPointerSize);
1202
+ STATIC_ASSERT(StackHandlerConstants::kPCOffset == 4 * kPointerSize);
1213
1203
  // r0 is expected to hold the exception.
1214
1204
  if (!value.is(r0)) {
1215
1205
  mov(r0, value);
@@ -1234,7 +1224,6 @@ void MacroAssembler::ThrowUncatchable(UncatchableExceptionType type,
1234
1224
  bind(&done);
1235
1225
 
1236
1226
  // Set the top handler address to next handler past the current ENTRY handler.
1237
- STATIC_ASSERT(StackHandlerConstants::kNextOffset == 0);
1238
1227
  pop(r2);
1239
1228
  str(r2, MemOperand(r3));
1240
1229
 
@@ -1256,26 +1245,17 @@ void MacroAssembler::ThrowUncatchable(UncatchableExceptionType type,
1256
1245
 
1257
1246
  // Stack layout at this point. See also StackHandlerConstants.
1258
1247
  // sp -> state (ENTRY)
1248
+ // cp
1259
1249
  // fp
1260
1250
  // lr
1261
1251
 
1262
- // Discard handler state (r2 is not used) and restore frame pointer.
1263
- STATIC_ASSERT(StackHandlerConstants::kFPOffset == 2 * kPointerSize);
1264
- ldm(ia_w, sp, r2.bit() | fp.bit()); // r2: discarded state.
1265
- // Before returning we restore the context from the frame pointer if
1266
- // not NULL. The frame pointer is NULL in the exception handler of a
1267
- // JS entry frame.
1268
- cmp(fp, Operand(0, RelocInfo::NONE));
1269
- // Set cp to NULL if fp is NULL.
1270
- mov(cp, Operand(0, RelocInfo::NONE), LeaveCC, eq);
1271
- // Restore cp otherwise.
1272
- ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset), ne);
1252
+ // Restore context and frame pointer, discard state (r2).
1253
+ ldm(ia_w, sp, r2.bit() | cp.bit() | fp.bit());
1273
1254
  #ifdef DEBUG
1274
1255
  if (emit_debug_code()) {
1275
1256
  mov(lr, Operand(pc));
1276
1257
  }
1277
1258
  #endif
1278
- STATIC_ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
1279
1259
  pop(pc);
1280
1260
  }
1281
1261
 
@@ -1357,6 +1337,100 @@ void MacroAssembler::CheckAccessGlobalProxy(Register holder_reg,
1357
1337
  }
1358
1338
 
1359
1339
 
1340
+ void MacroAssembler::LoadFromNumberDictionary(Label* miss,
1341
+ Register elements,
1342
+ Register key,
1343
+ Register result,
1344
+ Register t0,
1345
+ Register t1,
1346
+ Register t2) {
1347
+ // Register use:
1348
+ //
1349
+ // elements - holds the slow-case elements of the receiver on entry.
1350
+ // Unchanged unless 'result' is the same register.
1351
+ //
1352
+ // key - holds the smi key on entry.
1353
+ // Unchanged unless 'result' is the same register.
1354
+ //
1355
+ // result - holds the result on exit if the load succeeded.
1356
+ // Allowed to be the same as 'key' or 'result'.
1357
+ // Unchanged on bailout so 'key' or 'result' can be used
1358
+ // in further computation.
1359
+ //
1360
+ // Scratch registers:
1361
+ //
1362
+ // t0 - holds the untagged key on entry and holds the hash once computed.
1363
+ //
1364
+ // t1 - used to hold the capacity mask of the dictionary
1365
+ //
1366
+ // t2 - used for the index into the dictionary.
1367
+ Label done;
1368
+
1369
+ // Compute the hash code from the untagged key. This must be kept in sync
1370
+ // with ComputeIntegerHash in utils.h.
1371
+ //
1372
+ // hash = ~hash + (hash << 15);
1373
+ mvn(t1, Operand(t0));
1374
+ add(t0, t1, Operand(t0, LSL, 15));
1375
+ // hash = hash ^ (hash >> 12);
1376
+ eor(t0, t0, Operand(t0, LSR, 12));
1377
+ // hash = hash + (hash << 2);
1378
+ add(t0, t0, Operand(t0, LSL, 2));
1379
+ // hash = hash ^ (hash >> 4);
1380
+ eor(t0, t0, Operand(t0, LSR, 4));
1381
+ // hash = hash * 2057;
1382
+ mov(t1, Operand(2057));
1383
+ mul(t0, t0, t1);
1384
+ // hash = hash ^ (hash >> 16);
1385
+ eor(t0, t0, Operand(t0, LSR, 16));
1386
+
1387
+ // Compute the capacity mask.
1388
+ ldr(t1, FieldMemOperand(elements, NumberDictionary::kCapacityOffset));
1389
+ mov(t1, Operand(t1, ASR, kSmiTagSize)); // convert smi to int
1390
+ sub(t1, t1, Operand(1));
1391
+
1392
+ // Generate an unrolled loop that performs a few probes before giving up.
1393
+ static const int kProbes = 4;
1394
+ for (int i = 0; i < kProbes; i++) {
1395
+ // Use t2 for index calculations and keep the hash intact in t0.
1396
+ mov(t2, t0);
1397
+ // Compute the masked index: (hash + i + i * i) & mask.
1398
+ if (i > 0) {
1399
+ add(t2, t2, Operand(NumberDictionary::GetProbeOffset(i)));
1400
+ }
1401
+ and_(t2, t2, Operand(t1));
1402
+
1403
+ // Scale the index by multiplying by the element size.
1404
+ ASSERT(NumberDictionary::kEntrySize == 3);
1405
+ add(t2, t2, Operand(t2, LSL, 1)); // t2 = t2 * 3
1406
+
1407
+ // Check if the key is identical to the name.
1408
+ add(t2, elements, Operand(t2, LSL, kPointerSizeLog2));
1409
+ ldr(ip, FieldMemOperand(t2, NumberDictionary::kElementsStartOffset));
1410
+ cmp(key, Operand(ip));
1411
+ if (i != kProbes - 1) {
1412
+ b(eq, &done);
1413
+ } else {
1414
+ b(ne, miss);
1415
+ }
1416
+ }
1417
+
1418
+ bind(&done);
1419
+ // Check that the value is a normal property.
1420
+ // t2: elements + (index * kPointerSize)
1421
+ const int kDetailsOffset =
1422
+ NumberDictionary::kElementsStartOffset + 2 * kPointerSize;
1423
+ ldr(t1, FieldMemOperand(t2, kDetailsOffset));
1424
+ tst(t1, Operand(Smi::FromInt(PropertyDetails::TypeField::mask())));
1425
+ b(ne, miss);
1426
+
1427
+ // Get the value at the masked, scaled index and return.
1428
+ const int kValueOffset =
1429
+ NumberDictionary::kElementsStartOffset + kPointerSize;
1430
+ ldr(result, FieldMemOperand(t2, kValueOffset));
1431
+ }
1432
+
1433
+
1360
1434
  void MacroAssembler::AllocateInNewSpace(int object_size,
1361
1435
  Register result,
1362
1436
  Register scratch1,
@@ -1676,6 +1750,16 @@ void MacroAssembler::CompareRoot(Register obj,
1676
1750
  }
1677
1751
 
1678
1752
 
1753
+ void MacroAssembler::CheckFastElements(Register map,
1754
+ Register scratch,
1755
+ Label* fail) {
1756
+ STATIC_ASSERT(JSObject::FAST_ELEMENTS == 0);
1757
+ ldrb(scratch, FieldMemOperand(map, Map::kBitField2Offset));
1758
+ cmp(scratch, Operand(Map::kMaximumBitField2FastElementValue));
1759
+ b(hi, fail);
1760
+ }
1761
+
1762
+
1679
1763
  void MacroAssembler::CheckMap(Register obj,
1680
1764
  Register scratch,
1681
1765
  Handle<Map> map,
@@ -1772,7 +1856,7 @@ void MacroAssembler::TryGetFunctionPrototype(Register function,
1772
1856
 
1773
1857
  void MacroAssembler::CallStub(CodeStub* stub, Condition cond) {
1774
1858
  ASSERT(allow_stub_calls()); // Stub calls are not allowed in some stubs.
1775
- Call(stub->GetCode(), RelocInfo::CODE_TARGET, cond);
1859
+ Call(stub->GetCode(), RelocInfo::CODE_TARGET, kNoASTId, cond);
1776
1860
  }
1777
1861
 
1778
1862
 
@@ -1782,7 +1866,8 @@ MaybeObject* MacroAssembler::TryCallStub(CodeStub* stub, Condition cond) {
1782
1866
  { MaybeObject* maybe_result = stub->TryGetCode();
1783
1867
  if (!maybe_result->ToObject(&result)) return maybe_result;
1784
1868
  }
1785
- Call(Handle<Code>(Code::cast(result)), RelocInfo::CODE_TARGET, cond);
1869
+ Handle<Code> code(Code::cast(result));
1870
+ Call(code, RelocInfo::CODE_TARGET, kNoASTId, cond);
1786
1871
  return result;
1787
1872
  }
1788
1873
 
@@ -2369,10 +2454,12 @@ void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id,
2369
2454
  GetBuiltinEntry(r2, id);
2370
2455
  if (flag == CALL_FUNCTION) {
2371
2456
  call_wrapper.BeforeCall(CallSize(r2));
2457
+ SetCallKind(r5, CALL_AS_METHOD);
2372
2458
  Call(r2);
2373
2459
  call_wrapper.AfterCall();
2374
2460
  } else {
2375
2461
  ASSERT(flag == JUMP_FUNCTION);
2462
+ SetCallKind(r5, CALL_AS_METHOD);
2376
2463
  Jump(r2);
2377
2464
  }
2378
2465
  }
@@ -2456,6 +2543,9 @@ void MacroAssembler::AssertFastElements(Register elements) {
2456
2543
  LoadRoot(ip, Heap::kFixedArrayMapRootIndex);
2457
2544
  cmp(elements, ip);
2458
2545
  b(eq, &ok);
2546
+ LoadRoot(ip, Heap::kFixedDoubleArrayMapRootIndex);
2547
+ cmp(elements, ip);
2548
+ b(eq, &ok);
2459
2549
  LoadRoot(ip, Heap::kFixedCOWArrayMapRootIndex);
2460
2550
  cmp(elements, ip);
2461
2551
  b(eq, &ok);
@@ -2518,12 +2608,9 @@ void MacroAssembler::Abort(const char* msg) {
2518
2608
  void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
2519
2609
  if (context_chain_length > 0) {
2520
2610
  // Move up the chain of contexts to the context containing the slot.
2521
- ldr(dst, MemOperand(cp, Context::SlotOffset(Context::CLOSURE_INDEX)));
2522
- // Load the function context (which is the incoming, outer context).
2523
- ldr(dst, FieldMemOperand(dst, JSFunction::kContextOffset));
2611
+ ldr(dst, MemOperand(cp, Context::SlotOffset(Context::PREVIOUS_INDEX)));
2524
2612
  for (int i = 1; i < context_chain_length; i++) {
2525
- ldr(dst, MemOperand(dst, Context::SlotOffset(Context::CLOSURE_INDEX)));
2526
- ldr(dst, FieldMemOperand(dst, JSFunction::kContextOffset));
2613
+ ldr(dst, MemOperand(dst, Context::SlotOffset(Context::PREVIOUS_INDEX)));
2527
2614
  }
2528
2615
  } else {
2529
2616
  // Slot is in the current function context. Move it into the
@@ -2531,17 +2618,6 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
2531
2618
  // cannot be allowed to destroy the context in esi).
2532
2619
  mov(dst, cp);
2533
2620
  }
2534
-
2535
- // We should not have found a 'with' context by walking the context chain
2536
- // (i.e., the static scope chain and runtime context chain do not agree).
2537
- // A variable occurring in such a scope should have slot type LOOKUP and
2538
- // not CONTEXT.
2539
- if (emit_debug_code()) {
2540
- ldr(ip, MemOperand(dst, Context::SlotOffset(Context::FCONTEXT_INDEX)));
2541
- cmp(dst, ip);
2542
- Check(eq, "Yo dawg, I heard you liked function contexts "
2543
- "so I put function contexts in all your contexts");
2544
- }
2545
2621
  }
2546
2622
 
2547
2623
 
@@ -2689,8 +2765,7 @@ void MacroAssembler::JumpIfNotBothSequentialAsciiStrings(Register first,
2689
2765
  // Check that neither is a smi.
2690
2766
  STATIC_ASSERT(kSmiTag == 0);
2691
2767
  and_(scratch1, first, Operand(second));
2692
- tst(scratch1, Operand(kSmiTagMask));
2693
- b(eq, failure);
2768
+ JumpIfSmi(scratch1, failure);
2694
2769
  JumpIfNonSmisNotBothSequentialAsciiStrings(first,
2695
2770
  second,
2696
2771
  scratch1,
@@ -3082,7 +3157,7 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg,
3082
3157
  Label done;
3083
3158
  Label in_bounds;
3084
3159
 
3085
- vmov(temp_double_reg, 0.0);
3160
+ Vmov(temp_double_reg, 0.0);
3086
3161
  VFPCompareAndSetFlags(input_reg, temp_double_reg);
3087
3162
  b(gt, &above_zero);
3088
3163
 
@@ -3092,7 +3167,7 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg,
3092
3167
 
3093
3168
  // Double value is >= 255, return 255.
3094
3169
  bind(&above_zero);
3095
- vmov(temp_double_reg, 255.0);
3170
+ Vmov(temp_double_reg, 255.0);
3096
3171
  VFPCompareAndSetFlags(input_reg, temp_double_reg);
3097
3172
  b(le, &in_bounds);
3098
3173
  mov(result_reg, Operand(255));
@@ -3100,7 +3175,7 @@ void MacroAssembler::ClampDoubleToUint8(Register result_reg,
3100
3175
 
3101
3176
  // In 0-255 range, round and truncate.
3102
3177
  bind(&in_bounds);
3103
- vmov(temp_double_reg, 0.5);
3178
+ Vmov(temp_double_reg, 0.5);
3104
3179
  vadd(temp_double_reg, input_reg, temp_double_reg);
3105
3180
  vcvt_u32_f64(s0, temp_double_reg);
3106
3181
  vmov(result_reg, s0);