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
@@ -99,44 +99,11 @@ class MacroAssembler: public Assembler {
99
99
  // macro assembler.
100
100
  MacroAssembler(Isolate* isolate, void* buffer, int size);
101
101
 
102
- // Arguments macros.
102
+ // Arguments macros.
103
103
  #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2
104
104
  #define COND_ARGS cond, r1, r2
105
105
 
106
- // Prototypes.
107
-
108
- // Prototypes for functions with no target (eg Ret()).
109
- #define DECLARE_NOTARGET_PROTOTYPE(Name) \
110
- void Name(BranchDelaySlot bd = PROTECT); \
111
- void Name(COND_TYPED_ARGS, BranchDelaySlot bd = PROTECT); \
112
- inline void Name(BranchDelaySlot bd, COND_TYPED_ARGS) { \
113
- Name(COND_ARGS, bd); \
114
- }
115
-
116
- // Prototypes for functions with a target.
117
-
118
- // Cases when relocation may be needed.
119
- #define DECLARE_RELOC_PROTOTYPE(Name, target_type) \
120
- void Name(target_type target, \
121
- RelocInfo::Mode rmode, \
122
- BranchDelaySlot bd = PROTECT); \
123
- inline void Name(BranchDelaySlot bd, \
124
- target_type target, \
125
- RelocInfo::Mode rmode) { \
126
- Name(target, rmode, bd); \
127
- } \
128
- void Name(target_type target, \
129
- RelocInfo::Mode rmode, \
130
- COND_TYPED_ARGS, \
131
- BranchDelaySlot bd = PROTECT); \
132
- inline void Name(BranchDelaySlot bd, \
133
- target_type target, \
134
- RelocInfo::Mode rmode, \
135
- COND_TYPED_ARGS) { \
136
- Name(target, rmode, COND_ARGS, bd); \
137
- }
138
-
139
- // Cases when relocation is not needed.
106
+ // Cases when relocation is not needed.
140
107
  #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \
141
108
  void Name(target_type target, BranchDelaySlot bd = PROTECT); \
142
109
  inline void Name(BranchDelaySlot bd, target_type target) { \
@@ -151,44 +118,44 @@ class MacroAssembler: public Assembler {
151
118
  Name(target, COND_ARGS, bd); \
152
119
  }
153
120
 
154
- // Target prototypes.
155
-
156
- #define DECLARE_JUMP_CALL_PROTOTYPES(Name) \
157
- DECLARE_NORELOC_PROTOTYPE(Name, Register) \
158
- DECLARE_NORELOC_PROTOTYPE(Name, const Operand&) \
159
- DECLARE_RELOC_PROTOTYPE(Name, byte*) \
160
- DECLARE_RELOC_PROTOTYPE(Name, Handle<Code>)
161
-
162
121
  #define DECLARE_BRANCH_PROTOTYPES(Name) \
163
122
  DECLARE_NORELOC_PROTOTYPE(Name, Label*) \
164
123
  DECLARE_NORELOC_PROTOTYPE(Name, int16_t)
165
124
 
125
+ DECLARE_BRANCH_PROTOTYPES(Branch)
126
+ DECLARE_BRANCH_PROTOTYPES(BranchAndLink)
166
127
 
167
- DECLARE_JUMP_CALL_PROTOTYPES(Jump)
168
- DECLARE_JUMP_CALL_PROTOTYPES(Call)
169
-
170
- DECLARE_BRANCH_PROTOTYPES(Branch)
171
- DECLARE_BRANCH_PROTOTYPES(BranchAndLink)
172
-
173
- DECLARE_NOTARGET_PROTOTYPE(Ret)
174
-
128
+ #undef DECLARE_BRANCH_PROTOTYPES
175
129
  #undef COND_TYPED_ARGS
176
130
  #undef COND_ARGS
177
- #undef DECLARE_NOTARGET_PROTOTYPE
178
- #undef DECLARE_NORELOC_PROTOTYPE
179
- #undef DECLARE_RELOC_PROTOTYPE
180
- #undef DECLARE_JUMP_CALL_PROTOTYPES
181
- #undef DECLARE_BRANCH_PROTOTYPES
182
131
 
183
- void CallWithAstId(Handle<Code> code,
184
- RelocInfo::Mode rmode,
185
- unsigned ast_id,
186
- Condition cond = al,
187
- Register r1 = zero_reg,
188
- const Operand& r2 = Operand(zero_reg));
189
132
 
190
- int CallSize(Register reg);
191
- int CallSize(Handle<Code> code, RelocInfo::Mode rmode);
133
+ // Jump, Call, and Ret pseudo instructions implementing inter-working.
134
+ #define COND_ARGS Condition cond = al, Register rs = zero_reg, \
135
+ const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
136
+
137
+ void Jump(Register target, COND_ARGS);
138
+ void Jump(intptr_t target, RelocInfo::Mode rmode, COND_ARGS);
139
+ void Jump(Address target, RelocInfo::Mode rmode, COND_ARGS);
140
+ void Jump(Handle<Code> code, RelocInfo::Mode rmode, COND_ARGS);
141
+ int CallSize(Register target, COND_ARGS);
142
+ void Call(Register target, COND_ARGS);
143
+ int CallSize(Address target, RelocInfo::Mode rmode, COND_ARGS);
144
+ void Call(Address target, RelocInfo::Mode rmode, COND_ARGS);
145
+ int CallSize(Handle<Code> code,
146
+ RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
147
+ unsigned ast_id = kNoASTId,
148
+ COND_ARGS);
149
+ void Call(Handle<Code> code,
150
+ RelocInfo::Mode rmode = RelocInfo::CODE_TARGET,
151
+ unsigned ast_id = kNoASTId,
152
+ COND_ARGS);
153
+ void Ret(COND_ARGS);
154
+ inline void Ret(BranchDelaySlot bd) {
155
+ Ret(al, zero_reg, Operand(zero_reg), bd);
156
+ }
157
+
158
+ #undef COND_ARGS
192
159
 
193
160
  // Emit code to discard a non-negative number of pointer-sized elements
194
161
  // from the stack, clobbering only the sp register.
@@ -299,6 +266,16 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
299
266
  Register scratch,
300
267
  Label* miss);
301
268
 
269
+
270
+ void LoadFromNumberDictionary(Label* miss,
271
+ Register elements,
272
+ Register key,
273
+ Register result,
274
+ Register reg0,
275
+ Register reg1,
276
+ Register reg2);
277
+
278
+
302
279
  inline void MarkCode(NopMarkerTypes type) {
303
280
  nop(type);
304
281
  }
@@ -459,9 +436,6 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
459
436
  li(dst, Operand(value), gen2instr);
460
437
  }
461
438
 
462
- // Exception-generating instructions and debugging support.
463
- void stop(const char* msg);
464
-
465
439
  // Push multiple registers on the stack.
466
440
  // Registers are saved in numerical order, with higher numbered registers
467
441
  // saved in higher memory addresses.
@@ -474,6 +448,9 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
474
448
  sw(src, MemOperand(sp, 0));
475
449
  }
476
450
 
451
+ // Push a handle.
452
+ void Push(Handle<Object> handle);
453
+
477
454
  // Push two registers. Pushes leftmost register first (to highest address).
478
455
  void Push(Register src1, Register src2) {
479
456
  Subu(sp, sp, Operand(2 * kPointerSize));
@@ -547,12 +524,12 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
547
524
  void Ext(Register rt, Register rs, uint16_t pos, uint16_t size);
548
525
 
549
526
  // Convert unsigned word to double.
550
- void Cvt_d_uw(FPURegister fd, FPURegister fs);
551
- void Cvt_d_uw(FPURegister fd, Register rs);
527
+ void Cvt_d_uw(FPURegister fd, FPURegister fs, FPURegister scratch);
528
+ void Cvt_d_uw(FPURegister fd, Register rs, FPURegister scratch);
552
529
 
553
530
  // Convert double to unsigned word.
554
- void Trunc_uw_d(FPURegister fd, FPURegister fs);
555
- void Trunc_uw_d(FPURegister fd, Register rs);
531
+ void Trunc_uw_d(FPURegister fd, FPURegister fs, FPURegister scratch);
532
+ void Trunc_uw_d(FPURegister fd, Register rs, FPURegister scratch);
556
533
 
557
534
  // Convert the HeapNumber pointed to by source to a 32bits signed integer
558
535
  // dest. If the HeapNumber does not fit into a 32bits signed integer branch
@@ -576,6 +553,16 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
576
553
  Register input_low,
577
554
  Register scratch);
578
555
 
556
+ // Performs a truncating conversion of a floating point number as used by
557
+ // the JS bitwise operations. See ECMA-262 9.5: ToInt32.
558
+ // Exits with 'result' holding the answer and all other registers clobbered.
559
+ void EmitECMATruncate(Register result,
560
+ FPURegister double_input,
561
+ FPURegister single_scratch,
562
+ Register scratch,
563
+ Register scratch2,
564
+ Register scratch3);
565
+
579
566
  // -------------------------------------------------------------------------
580
567
  // Activation frames.
581
568
 
@@ -624,27 +611,28 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
624
611
  const ParameterCount& expected,
625
612
  const ParameterCount& actual,
626
613
  InvokeFlag flag,
627
- const CallWrapper& call_wrapper = NullCallWrapper(),
628
- CallKind call_kind = CALL_AS_METHOD);
614
+ const CallWrapper& call_wrapper,
615
+ CallKind call_kind);
629
616
 
630
617
  void InvokeCode(Handle<Code> code,
631
618
  const ParameterCount& expected,
632
619
  const ParameterCount& actual,
633
620
  RelocInfo::Mode rmode,
634
621
  InvokeFlag flag,
635
- CallKind call_kind = CALL_AS_METHOD);
622
+ CallKind call_kind);
636
623
 
637
624
  // Invoke the JavaScript function in the given register. Changes the
638
625
  // current context to the context in the function before invoking.
639
626
  void InvokeFunction(Register function,
640
627
  const ParameterCount& actual,
641
628
  InvokeFlag flag,
642
- const CallWrapper& call_wrapper = NullCallWrapper(),
643
- CallKind call_kind = CALL_AS_METHOD);
629
+ const CallWrapper& call_wrapper,
630
+ CallKind call_kind);
644
631
 
645
632
  void InvokeFunction(JSFunction* function,
646
633
  const ParameterCount& actual,
647
- InvokeFlag flag);
634
+ InvokeFlag flag,
635
+ CallKind call_kind);
648
636
 
649
637
 
650
638
  void IsObjectJSObjectType(Register heap_object,
@@ -715,6 +703,12 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
715
703
  Register map,
716
704
  Register type_reg);
717
705
 
706
+ // Check if a map for a JSObject indicates that the object has fast elements.
707
+ // Jump to the specified label if it does not.
708
+ void CheckFastElements(Register map,
709
+ Register scratch,
710
+ Label* fail);
711
+
718
712
  // Check if the map of an object is equal to a specified map (either
719
713
  // given directly or as an index into the root list) and branch to
720
714
  // label if not. Skip the smi check if not required (object is known
@@ -1088,16 +1082,25 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
1088
1082
  Register scratch,
1089
1083
  int num_arguments);
1090
1084
 
1091
- void Jump(intptr_t target, RelocInfo::Mode rmode,
1092
- BranchDelaySlot bd = PROTECT);
1093
- void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1094
- Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1095
- BranchDelaySlot bd = PROTECT);
1096
- void Call(intptr_t target, RelocInfo::Mode rmode,
1097
- BranchDelaySlot bd = PROTECT);
1098
- void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1099
- Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1100
- BranchDelaySlot bd = PROTECT);
1085
+ void BranchShort(int16_t offset, BranchDelaySlot bdslot = PROTECT);
1086
+ void BranchShort(int16_t offset, Condition cond, Register rs,
1087
+ const Operand& rt,
1088
+ BranchDelaySlot bdslot = PROTECT);
1089
+ void BranchShort(Label* L, BranchDelaySlot bdslot = PROTECT);
1090
+ void BranchShort(Label* L, Condition cond, Register rs,
1091
+ const Operand& rt,
1092
+ BranchDelaySlot bdslot = PROTECT);
1093
+ void BranchAndLinkShort(int16_t offset, BranchDelaySlot bdslot = PROTECT);
1094
+ void BranchAndLinkShort(int16_t offset, Condition cond, Register rs,
1095
+ const Operand& rt,
1096
+ BranchDelaySlot bdslot = PROTECT);
1097
+ void BranchAndLinkShort(Label* L, BranchDelaySlot bdslot = PROTECT);
1098
+ void BranchAndLinkShort(Label* L, Condition cond, Register rs,
1099
+ const Operand& rt,
1100
+ BranchDelaySlot bdslot = PROTECT);
1101
+ void J(Label* L, BranchDelaySlot bdslot);
1102
+ void Jr(Label* L, BranchDelaySlot bdslot);
1103
+ void Jalr(Label* L, BranchDelaySlot bdslot);
1101
1104
 
1102
1105
  // Helper functions for generating invokes.
1103
1106
  void InvokePrologue(const ParameterCount& expected,
@@ -1106,8 +1109,8 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
1106
1109
  Register code_reg,
1107
1110
  Label* done,
1108
1111
  InvokeFlag flag,
1109
- const CallWrapper& call_wrapper = NullCallWrapper(),
1110
- CallKind call_kind = CALL_AS_METHOD);
1112
+ const CallWrapper& call_wrapper,
1113
+ CallKind call_kind);
1111
1114
 
1112
1115
  // Get the code for the given builtin. Returns if able to resolve
1113
1116
  // the function in the 'resolved' flag.
@@ -1128,6 +1131,8 @@ DECLARE_NOTARGET_PROTOTYPE(Ret)
1128
1131
  MemOperand SafepointRegisterSlot(Register reg);
1129
1132
  MemOperand SafepointRegistersAndDoublesSlot(Register reg);
1130
1133
 
1134
+ bool UseAbsoluteCodePointers();
1135
+
1131
1136
  bool generating_stub_;
1132
1137
  bool allow_stub_calls_;
1133
1138
  // This handle will be patched with the code object on installation.
@@ -179,7 +179,7 @@ void RegExpMacroAssemblerMIPS::Backtrack() {
179
179
  // Pop Code* offset from backtrack stack, add Code* and jump to location.
180
180
  Pop(a0);
181
181
  __ Addu(a0, a0, code_pointer());
182
- __ Jump(Operand(a0));
182
+ __ Jump(a0);
183
183
  }
184
184
 
185
185
 
@@ -1036,12 +1036,12 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
1036
1036
  }
1037
1037
 
1038
1038
  // Prepare for possible GC.
1039
- HandleScope handles;
1039
+ HandleScope handles(isolate);
1040
1040
  Handle<Code> code_handle(re_code);
1041
1041
 
1042
1042
  Handle<String> subject(frame_entry<String*>(re_frame, kInputString));
1043
1043
  // Current string.
1044
- bool is_ascii = subject->IsAsciiRepresentation();
1044
+ bool is_ascii = subject->IsAsciiRepresentationUnderneath();
1045
1045
 
1046
1046
  ASSERT(re_code->instruction_start() <= *return_address);
1047
1047
  ASSERT(*return_address <=
@@ -1050,7 +1050,7 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
1050
1050
  MaybeObject* result = Execution::HandleStackGuardInterrupt();
1051
1051
 
1052
1052
  if (*code_handle != re_code) { // Return address no longer valid.
1053
- int delta = *code_handle - re_code;
1053
+ int delta = code_handle->address() - re_code->address();
1054
1054
  // Overwrite the return address on the stack.
1055
1055
  *return_address += delta;
1056
1056
  }
@@ -1059,8 +1059,20 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
1059
1059
  return EXCEPTION;
1060
1060
  }
1061
1061
 
1062
+ Handle<String> subject_tmp = subject;
1063
+ int slice_offset = 0;
1064
+
1065
+ // Extract the underlying string and the slice offset.
1066
+ if (StringShape(*subject_tmp).IsCons()) {
1067
+ subject_tmp = Handle<String>(ConsString::cast(*subject_tmp)->first());
1068
+ } else if (StringShape(*subject_tmp).IsSliced()) {
1069
+ SlicedString* slice = SlicedString::cast(*subject_tmp);
1070
+ subject_tmp = Handle<String>(slice->parent());
1071
+ slice_offset = slice->offset();
1072
+ }
1073
+
1062
1074
  // String might have changed.
1063
- if (subject->IsAsciiRepresentation() != is_ascii) {
1075
+ if (subject_tmp->IsAsciiRepresentation() != is_ascii) {
1064
1076
  // If we changed between an ASCII and an UC16 string, the specialized
1065
1077
  // code cannot be used, and we need to restart regexp matching from
1066
1078
  // scratch (including, potentially, compiling a new version of the code).
@@ -1071,8 +1083,8 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
1071
1083
  // be a sequential or external string with the same content.
1072
1084
  // Update the start and end pointers in the stack frame to the current
1073
1085
  // location (whether it has actually moved or not).
1074
- ASSERT(StringShape(*subject).IsSequential() ||
1075
- StringShape(*subject).IsExternal());
1086
+ ASSERT(StringShape(*subject_tmp).IsSequential() ||
1087
+ StringShape(*subject_tmp).IsExternal());
1076
1088
 
1077
1089
  // The original start address of the characters to match.
1078
1090
  const byte* start_address = frame_entry<const byte*>(re_frame, kInputStart);
@@ -1080,13 +1092,14 @@ int RegExpMacroAssemblerMIPS::CheckStackGuardState(Address* return_address,
1080
1092
  // Find the current start address of the same character at the current string
1081
1093
  // position.
1082
1094
  int start_index = frame_entry<int>(re_frame, kStartIndex);
1083
- const byte* new_address = StringCharacterPosition(*subject, start_index);
1095
+ const byte* new_address = StringCharacterPosition(*subject_tmp,
1096
+ start_index + slice_offset);
1084
1097
 
1085
1098
  if (start_address != new_address) {
1086
1099
  // If there is a difference, update the object pointer and start and end
1087
1100
  // addresses in the RegExp stack frame to match the new value.
1088
1101
  const byte* end_address = frame_entry<const byte* >(re_frame, kInputEnd);
1089
- int byte_length = end_address - start_address;
1102
+ int byte_length = static_cast<int>(end_address - start_address);
1090
1103
  frame_entry<const String*>(re_frame, kInputString) = *subject;
1091
1104
  frame_entry<const byte*>(re_frame, kInputStart) = new_address;
1092
1105
  frame_entry<const byte*>(re_frame, kInputEnd) = new_address + byte_length;
@@ -1238,7 +1251,7 @@ void RegExpCEntryStub::Generate(MacroAssembler* masm_) {
1238
1251
  __ Call(t9);
1239
1252
  __ lw(ra, MemOperand(sp, 0));
1240
1253
  __ Addu(sp, sp, Operand(stack_alignment));
1241
- __ Jump(Operand(ra));
1254
+ __ Jump(ra);
1242
1255
  }
1243
1256
 
1244
1257
 
@@ -29,6 +29,12 @@
29
29
  #ifndef V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
30
30
  #define V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
31
31
 
32
+ #include "mips/assembler-mips.h"
33
+ #include "mips/assembler-mips-inl.h"
34
+ #include "macro-assembler.h"
35
+ #include "code.h"
36
+ #include "mips/macro-assembler-mips.h"
37
+
32
38
  namespace v8 {
33
39
  namespace internal {
34
40
 
@@ -249,4 +255,3 @@ class RegExpMacroAssemblerMIPS: public NativeRegExpMacroAssembler {
249
255
  }} // namespace v8::internal
250
256
 
251
257
  #endif // V8_MIPS_REGEXP_MACRO_ASSEMBLER_MIPS_H_
252
-
@@ -126,16 +126,29 @@ static void InitializeCoverage() {
126
126
 
127
127
 
128
128
  void MipsDebugger::Stop(Instruction* instr) {
129
- UNIMPLEMENTED_MIPS();
130
- char* str = reinterpret_cast<char*>(instr->InstructionBits());
131
- if (strlen(str) > 0) {
129
+ // Get the stop code.
130
+ uint32_t code = instr->Bits(25, 6);
131
+ // Retrieve the encoded address, which comes just after this stop.
132
+ char** msg_address =
133
+ reinterpret_cast<char**>(sim_->get_pc() + Instr::kInstrSize);
134
+ char* msg = *msg_address;
135
+ ASSERT(msg != NULL);
136
+
137
+ // Update this stop description.
138
+ if (!watched_stops[code].desc) {
139
+ watched_stops[code].desc = msg;
140
+ }
141
+
142
+ if (strlen(msg) > 0) {
132
143
  if (coverage_log != NULL) {
133
144
  fprintf(coverage_log, "%s\n", str);
134
145
  fflush(coverage_log);
135
146
  }
136
- instr->SetInstructionBits(0x0); // Overwrite with nop.
147
+ // Overwrite the instruction and address with nops.
148
+ instr->SetInstructionBits(kNopInstr);
149
+ reinterpret_cast<Instr*>(msg_address)->SetInstructionBits(kNopInstr);
137
150
  }
138
- sim_->set_pc(sim_->get_pc() + Instruction::kInstrSize);
151
+ sim_->set_pc(sim_->get_pc() + 2 * Instruction::kInstructionSize);
139
152
  }
140
153
 
141
154
 
@@ -147,9 +160,17 @@ static void InitializeCoverage() {}
147
160
 
148
161
 
149
162
  void MipsDebugger::Stop(Instruction* instr) {
150
- const char* str = reinterpret_cast<char*>(instr->InstructionBits());
151
- PrintF("Simulator hit %s\n", str);
152
- sim_->set_pc(sim_->get_pc() + Instruction::kInstrSize);
163
+ // Get the stop code.
164
+ uint32_t code = instr->Bits(25, 6);
165
+ // Retrieve the encoded address, which comes just after this stop.
166
+ char* msg = *reinterpret_cast<char**>(sim_->get_pc() +
167
+ Instruction::kInstrSize);
168
+ // Update this stop description.
169
+ if (!sim_->watched_stops[code].desc) {
170
+ sim_->watched_stops[code].desc = msg;
171
+ }
172
+ PrintF("Simulator hit %s (%u)\n", msg, code);
173
+ sim_->set_pc(sim_->get_pc() + 2 * Instruction::kInstrSize);
153
174
  Debug();
154
175
  }
155
176
  #endif // GENERATED_CODE_COVERAGE
@@ -585,8 +606,67 @@ void MipsDebugger::Debug() {
585
606
  }
586
607
  } else if (strcmp(cmd, "flags") == 0) {
587
608
  PrintF("No flags on MIPS !\n");
588
- } else if (strcmp(cmd, "unstop") == 0) {
589
- PrintF("Unstop command not implemented on MIPS.");
609
+ } else if (strcmp(cmd, "stop") == 0) {
610
+ int32_t value;
611
+ intptr_t stop_pc = sim_->get_pc() -
612
+ 2 * Instruction::kInstrSize;
613
+ Instruction* stop_instr = reinterpret_cast<Instruction*>(stop_pc);
614
+ Instruction* msg_address =
615
+ reinterpret_cast<Instruction*>(stop_pc +
616
+ Instruction::kInstrSize);
617
+ if ((argc == 2) && (strcmp(arg1, "unstop") == 0)) {
618
+ // Remove the current stop.
619
+ if (sim_->IsStopInstruction(stop_instr)) {
620
+ stop_instr->SetInstructionBits(kNopInstr);
621
+ msg_address->SetInstructionBits(kNopInstr);
622
+ } else {
623
+ PrintF("Not at debugger stop.\n");
624
+ }
625
+ } else if (argc == 3) {
626
+ // Print information about all/the specified breakpoint(s).
627
+ if (strcmp(arg1, "info") == 0) {
628
+ if (strcmp(arg2, "all") == 0) {
629
+ PrintF("Stop information:\n");
630
+ for (uint32_t i = kMaxWatchpointCode + 1;
631
+ i <= kMaxStopCode;
632
+ i++) {
633
+ sim_->PrintStopInfo(i);
634
+ }
635
+ } else if (GetValue(arg2, &value)) {
636
+ sim_->PrintStopInfo(value);
637
+ } else {
638
+ PrintF("Unrecognized argument.\n");
639
+ }
640
+ } else if (strcmp(arg1, "enable") == 0) {
641
+ // Enable all/the specified breakpoint(s).
642
+ if (strcmp(arg2, "all") == 0) {
643
+ for (uint32_t i = kMaxWatchpointCode + 1;
644
+ i <= kMaxStopCode;
645
+ i++) {
646
+ sim_->EnableStop(i);
647
+ }
648
+ } else if (GetValue(arg2, &value)) {
649
+ sim_->EnableStop(value);
650
+ } else {
651
+ PrintF("Unrecognized argument.\n");
652
+ }
653
+ } else if (strcmp(arg1, "disable") == 0) {
654
+ // Disable all/the specified breakpoint(s).
655
+ if (strcmp(arg2, "all") == 0) {
656
+ for (uint32_t i = kMaxWatchpointCode + 1;
657
+ i <= kMaxStopCode;
658
+ i++) {
659
+ sim_->DisableStop(i);
660
+ }
661
+ } else if (GetValue(arg2, &value)) {
662
+ sim_->DisableStop(value);
663
+ } else {
664
+ PrintF("Unrecognized argument.\n");
665
+ }
666
+ }
667
+ } else {
668
+ PrintF("Wrong usage. Use help command for more information.\n");
669
+ }
590
670
  } else if ((strcmp(cmd, "stat") == 0) || (strcmp(cmd, "st") == 0)) {
591
671
  // Print registers and disassemble.
592
672
  PrintAllRegs();
@@ -652,9 +732,26 @@ void MipsDebugger::Debug() {
652
732
  PrintF(" set a break point on the address\n");
653
733
  PrintF("del\n");
654
734
  PrintF(" delete the breakpoint\n");
655
- PrintF("unstop\n");
656
- PrintF(" ignore the stop instruction at the current location");
657
- PrintF(" from now on\n");
735
+ PrintF("stop feature:\n");
736
+ PrintF(" Description:\n");
737
+ PrintF(" Stops are debug instructions inserted by\n");
738
+ PrintF(" the Assembler::stop() function.\n");
739
+ PrintF(" When hitting a stop, the Simulator will\n");
740
+ PrintF(" stop and and give control to the Debugger.\n");
741
+ PrintF(" All stop codes are watched:\n");
742
+ PrintF(" - They can be enabled / disabled: the Simulator\n");
743
+ PrintF(" will / won't stop when hitting them.\n");
744
+ PrintF(" - The Simulator keeps track of how many times they \n");
745
+ PrintF(" are met. (See the info command.) Going over a\n");
746
+ PrintF(" disabled stop still increases its counter. \n");
747
+ PrintF(" Commands:\n");
748
+ PrintF(" stop info all/<code> : print infos about number <code>\n");
749
+ PrintF(" or all stop(s).\n");
750
+ PrintF(" stop enable/disable all/<code> : enables / disables\n");
751
+ PrintF(" all or number <code> stop(s)\n");
752
+ PrintF(" stop unstop\n");
753
+ PrintF(" ignore the stop instruction at the current location\n");
754
+ PrintF(" from now on\n");
658
755
  } else {
659
756
  PrintF("Unknown command: %s\n", cmd);
660
757
  }
@@ -1062,15 +1159,30 @@ bool Simulator::test_fcsr_bit(uint32_t cc) {
1062
1159
  // Sets the rounding error codes in FCSR based on the result of the rounding.
1063
1160
  // Returns true if the operation was invalid.
1064
1161
  bool Simulator::set_fcsr_round_error(double original, double rounded) {
1065
- if (!isfinite(original) ||
1066
- rounded > LONG_MAX ||
1067
- rounded < LONG_MIN) {
1068
- set_fcsr_bit(6, true); // Invalid operation.
1069
- return true;
1070
- } else if (original != static_cast<double>(rounded)) {
1071
- set_fcsr_bit(2, true); // Inexact.
1162
+ bool ret = false;
1163
+
1164
+ if (!isfinite(original) || !isfinite(rounded)) {
1165
+ set_fcsr_bit(kFCSRInvalidOpFlagBit, true);
1166
+ ret = true;
1072
1167
  }
1073
- return false;
1168
+
1169
+ if (original != rounded) {
1170
+ set_fcsr_bit(kFCSRInexactFlagBit, true);
1171
+ }
1172
+
1173
+ if (rounded < DBL_MIN && rounded > -DBL_MIN && rounded != 0) {
1174
+ set_fcsr_bit(kFCSRUnderflowFlagBit, true);
1175
+ ret = true;
1176
+ }
1177
+
1178
+ if (rounded > INT_MAX || rounded < INT_MIN) {
1179
+ set_fcsr_bit(kFCSROverflowFlagBit, true);
1180
+ // The reference is not really clear but it seems this is required:
1181
+ set_fcsr_bit(kFCSRInvalidOpFlagBit, true);
1182
+ ret = true;
1183
+ }
1184
+
1185
+ return ret;
1074
1186
  }
1075
1187
 
1076
1188
 
@@ -1288,7 +1400,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
1288
1400
  // the break_ instruction, or several variants of traps. All
1289
1401
  // Are "SPECIAL" class opcode, and are distinuished by function.
1290
1402
  int32_t func = instr->FunctionFieldRaw();
1291
- int32_t code = (func == BREAK) ? instr->Bits(25, 6) : -1;
1403
+ uint32_t code = (func == BREAK) ? instr->Bits(25, 6) : -1;
1292
1404
 
1293
1405
  // We first check if we met a call_rt_redirected.
1294
1406
  if (instr->InstructionBits() == rtCallRedirInstr) {
@@ -1297,20 +1409,11 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
1297
1409
  int32_t arg1 = get_register(a1);
1298
1410
  int32_t arg2 = get_register(a2);
1299
1411
  int32_t arg3 = get_register(a3);
1300
- int32_t arg4 = 0;
1301
- int32_t arg5 = 0;
1302
1412
 
1303
- // Need to check if sp is valid before assigning arg4, arg5.
1304
- // This is a fix for cctest test-api/CatchStackOverflow which causes
1305
- // the stack to overflow. For some reason arm doesn't need this
1306
- // stack check here.
1307
1413
  int32_t* stack_pointer = reinterpret_cast<int32_t*>(get_register(sp));
1308
- int32_t* stack = reinterpret_cast<int32_t*>(stack_);
1309
- if (stack_pointer >= stack && stack_pointer < stack + stack_size_ - 5) {
1310
- // Args 4 and 5 are on the stack after the reserved space for args 0..3.
1311
- arg4 = stack_pointer[4];
1312
- arg5 = stack_pointer[5];
1313
- }
1414
+ // Args 4 and 5 are on the stack after the reserved space for args 0..3.
1415
+ int32_t arg4 = stack_pointer[4];
1416
+ int32_t arg5 = stack_pointer[5];
1314
1417
 
1315
1418
  bool fp_call =
1316
1419
  (redirection->type() == ExternalReference::BUILTIN_FP_FP_CALL) ||
@@ -1372,7 +1475,7 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
1372
1475
  case ExternalReference::BUILTIN_FP_CALL:
1373
1476
  GetFpArgs(&dval0);
1374
1477
  PrintF("Call to host function at %p with arg %f",
1375
- FUNCTION_ADDR(target), dval1);
1478
+ FUNCTION_ADDR(target), dval0);
1376
1479
  break;
1377
1480
  case ExternalReference::BUILTIN_FP_INT_CALL:
1378
1481
  GetFpArgs(&dval0, &ival);
@@ -1440,14 +1543,13 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
1440
1543
  set_register(ra, saved_ra);
1441
1544
  set_pc(get_register(ra));
1442
1545
 
1443
- } else if (func == BREAK && code >= 0 && code < 32) {
1444
- // First 32 break_ codes interpreted as debug-markers/watchpoints.
1445
- MipsDebugger dbg(this);
1446
- ++break_count_;
1447
- PrintF("\n---- break %d marker: %3d (instr count: %8d) ----------"
1448
- "----------------------------------",
1449
- code, break_count_, icount_);
1450
- dbg.PrintAllRegs(); // Print registers and continue running.
1546
+ } else if (func == BREAK && code <= kMaxStopCode) {
1547
+ if (IsWatchpoint(code)) {
1548
+ PrintWatchpoint(code);
1549
+ } else {
1550
+ IncreaseStopCounter(code);
1551
+ HandleStop(code, instr);
1552
+ }
1451
1553
  } else {
1452
1554
  // All remaining break_ codes, and all traps are handled here.
1453
1555
  MipsDebugger dbg(this);
@@ -1456,6 +1558,99 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
1456
1558
  }
1457
1559
 
1458
1560
 
1561
+ // Stop helper functions.
1562
+ bool Simulator::IsWatchpoint(uint32_t code) {
1563
+ return (code <= kMaxWatchpointCode);
1564
+ }
1565
+
1566
+
1567
+ void Simulator::PrintWatchpoint(uint32_t code) {
1568
+ MipsDebugger dbg(this);
1569
+ ++break_count_;
1570
+ PrintF("\n---- break %d marker: %3d (instr count: %8d) ----------"
1571
+ "----------------------------------",
1572
+ code, break_count_, icount_);
1573
+ dbg.PrintAllRegs(); // Print registers and continue running.
1574
+ }
1575
+
1576
+
1577
+ void Simulator::HandleStop(uint32_t code, Instruction* instr) {
1578
+ // Stop if it is enabled, otherwise go on jumping over the stop
1579
+ // and the message address.
1580
+ if (IsEnabledStop(code)) {
1581
+ MipsDebugger dbg(this);
1582
+ dbg.Stop(instr);
1583
+ } else {
1584
+ set_pc(get_pc() + 2 * Instruction::kInstrSize);
1585
+ }
1586
+ }
1587
+
1588
+
1589
+ bool Simulator::IsStopInstruction(Instruction* instr) {
1590
+ int32_t func = instr->FunctionFieldRaw();
1591
+ uint32_t code = static_cast<uint32_t>(instr->Bits(25, 6));
1592
+ return (func == BREAK) && code > kMaxWatchpointCode && code <= kMaxStopCode;
1593
+ }
1594
+
1595
+
1596
+ bool Simulator::IsEnabledStop(uint32_t code) {
1597
+ ASSERT(code <= kMaxStopCode);
1598
+ ASSERT(code > kMaxWatchpointCode);
1599
+ return !(watched_stops[code].count & kStopDisabledBit);
1600
+ }
1601
+
1602
+
1603
+ void Simulator::EnableStop(uint32_t code) {
1604
+ if (!IsEnabledStop(code)) {
1605
+ watched_stops[code].count &= ~kStopDisabledBit;
1606
+ }
1607
+ }
1608
+
1609
+
1610
+ void Simulator::DisableStop(uint32_t code) {
1611
+ if (IsEnabledStop(code)) {
1612
+ watched_stops[code].count |= kStopDisabledBit;
1613
+ }
1614
+ }
1615
+
1616
+
1617
+ void Simulator::IncreaseStopCounter(uint32_t code) {
1618
+ ASSERT(code <= kMaxStopCode);
1619
+ if ((watched_stops[code].count & ~(1 << 31)) == 0x7fffffff) {
1620
+ PrintF("Stop counter for code %i has overflowed.\n"
1621
+ "Enabling this code and reseting the counter to 0.\n", code);
1622
+ watched_stops[code].count = 0;
1623
+ EnableStop(code);
1624
+ } else {
1625
+ watched_stops[code].count++;
1626
+ }
1627
+ }
1628
+
1629
+
1630
+ // Print a stop status.
1631
+ void Simulator::PrintStopInfo(uint32_t code) {
1632
+ if (code <= kMaxWatchpointCode) {
1633
+ PrintF("That is a watchpoint, not a stop.\n");
1634
+ return;
1635
+ } else if (code > kMaxStopCode) {
1636
+ PrintF("Code too large, only %u stops can be used\n", kMaxStopCode + 1);
1637
+ return;
1638
+ }
1639
+ const char* state = IsEnabledStop(code) ? "Enabled" : "Disabled";
1640
+ int32_t count = watched_stops[code].count & ~kStopDisabledBit;
1641
+ // Don't print the state of unused breakpoints.
1642
+ if (count != 0) {
1643
+ if (watched_stops[code].desc) {
1644
+ PrintF("stop %i - 0x%x: \t%s, \tcounter = %i, \t%s\n",
1645
+ code, code, state, count, watched_stops[code].desc);
1646
+ } else {
1647
+ PrintF("stop %i - 0x%x: \t%s, \tcounter = %i\n",
1648
+ code, code, state, count);
1649
+ }
1650
+ }
1651
+ }
1652
+
1653
+
1459
1654
  void Simulator::SignalExceptions() {
1460
1655
  for (int i = 1; i < kNumExceptions; i++) {
1461
1656
  if (exceptions[i] != 0) {
@@ -1865,9 +2060,10 @@ void Simulator::DecodeTypeRegister(Instruction* instr) {
1865
2060
  break;
1866
2061
  case TRUNC_W_D: // Truncate double to word (round towards 0).
1867
2062
  {
1868
- int32_t result = static_cast<int32_t>(fs);
2063
+ double rounded = trunc(fs);
2064
+ int32_t result = static_cast<int32_t>(rounded);
1869
2065
  set_fpu_register(fd_reg, result);
1870
- if (set_fcsr_round_error(fs, static_cast<double>(result))) {
2066
+ if (set_fcsr_round_error(fs, rounded)) {
1871
2067
  set_fpu_register(fd_reg, kFPUInvalidResult);
1872
2068
  }
1873
2069
  }
@@ -1895,16 +2091,20 @@ void Simulator::DecodeTypeRegister(Instruction* instr) {
1895
2091
  case CVT_S_D: // Convert double to float (single).
1896
2092
  set_fpu_register_float(fd_reg, static_cast<float>(fs));
1897
2093
  break;
1898
- case CVT_L_D: // Mips32r2: Truncate double to 64-bit long-word.
1899
- i64 = static_cast<int64_t>(fs);
2094
+ case CVT_L_D: { // Mips32r2: Truncate double to 64-bit long-word.
2095
+ double rounded = trunc(fs);
2096
+ i64 = static_cast<int64_t>(rounded);
1900
2097
  set_fpu_register(fd_reg, i64 & 0xffffffff);
1901
2098
  set_fpu_register(fd_reg + 1, i64 >> 32);
1902
2099
  break;
1903
- case TRUNC_L_D: // Mips32r2 instruction.
1904
- i64 = static_cast<int64_t>(fs);
2100
+ }
2101
+ case TRUNC_L_D: { // Mips32r2 instruction.
2102
+ double rounded = trunc(fs);
2103
+ i64 = static_cast<int64_t>(rounded);
1905
2104
  set_fpu_register(fd_reg, i64 & 0xffffffff);
1906
2105
  set_fpu_register(fd_reg + 1, i64 >> 32);
1907
2106
  break;
2107
+ }
1908
2108
  case ROUND_L_D: { // Mips32r2 instruction.
1909
2109
  double rounded = fs > 0 ? floor(fs + 0.5) : ceil(fs - 0.5);
1910
2110
  i64 = static_cast<int64_t>(rounded);