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
@@ -77,6 +77,12 @@ class PreParser {
77
77
  kFunctionScope
78
78
  };
79
79
 
80
+ enum VariableDeclarationContext {
81
+ kSourceElement,
82
+ kStatement,
83
+ kForStatement
84
+ };
85
+
80
86
  class Expression;
81
87
 
82
88
  class Identifier {
@@ -93,15 +99,23 @@ class PreParser {
93
99
  static Identifier FutureReserved() {
94
100
  return Identifier(kFutureReservedIdentifier);
95
101
  }
102
+ static Identifier FutureStrictReserved() {
103
+ return Identifier(kFutureStrictReservedIdentifier);
104
+ }
96
105
  bool IsEval() { return type_ == kEvalIdentifier; }
97
106
  bool IsArguments() { return type_ == kArgumentsIdentifier; }
98
107
  bool IsEvalOrArguments() { return type_ >= kEvalIdentifier; }
99
108
  bool IsFutureReserved() { return type_ == kFutureReservedIdentifier; }
109
+ bool IsFutureStrictReserved() {
110
+ return type_ == kFutureStrictReservedIdentifier;
111
+ }
100
112
  bool IsValidStrictVariable() { return type_ == kUnknownIdentifier; }
113
+
101
114
  private:
102
115
  enum Type {
103
116
  kUnknownIdentifier,
104
117
  kFutureReservedIdentifier,
118
+ kFutureStrictReservedIdentifier,
105
119
  kEvalIdentifier,
106
120
  kArgumentsIdentifier
107
121
  };
@@ -336,7 +350,8 @@ class PreParser {
336
350
  strict_mode_violation_type_(NULL),
337
351
  stack_overflow_(false),
338
352
  allow_lazy_(true),
339
- parenthesized_function_(false) { }
353
+ parenthesized_function_(false),
354
+ harmony_block_scoping_(scanner->HarmonyBlockScoping()) { }
340
355
 
341
356
  // Preparse the program. Only called in PreParseProgram after creating
342
357
  // the instance.
@@ -369,13 +384,16 @@ class PreParser {
369
384
  // which is set to false if parsing failed; it is unchanged otherwise.
370
385
  // By making the 'exception handling' explicit, we are forced to check
371
386
  // for failure at the call sites.
387
+ Statement ParseSourceElement(bool* ok);
372
388
  SourceElements ParseSourceElements(int end_token, bool* ok);
373
389
  Statement ParseStatement(bool* ok);
374
390
  Statement ParseFunctionDeclaration(bool* ok);
375
- Statement ParseNativeDeclaration(bool* ok);
376
391
  Statement ParseBlock(bool* ok);
377
- Statement ParseVariableStatement(bool* ok);
378
- Statement ParseVariableDeclarations(bool accept_IN, int* num_decl, bool* ok);
392
+ Statement ParseVariableStatement(VariableDeclarationContext var_context,
393
+ bool* ok);
394
+ Statement ParseVariableDeclarations(VariableDeclarationContext var_context,
395
+ int* num_decl,
396
+ bool* ok);
379
397
  Statement ParseExpressionOrLabelledStatement(bool* ok);
380
398
  Statement ParseIfStatement(bool* ok);
381
399
  Statement ParseContinueStatement(bool* ok);
@@ -411,7 +429,9 @@ class PreParser {
411
429
 
412
430
  Identifier ParseIdentifier(bool* ok);
413
431
  Identifier ParseIdentifierName(bool* ok);
414
- Identifier ParseIdentifierOrGetOrSet(bool* is_get, bool* is_set, bool* ok);
432
+ Identifier ParseIdentifierNameOrGetOrSet(bool* is_get,
433
+ bool* is_set,
434
+ bool* ok);
415
435
 
416
436
  // Logs the currently parsed literal as a symbol in the preparser data.
417
437
  void LogSymbol();
@@ -487,6 +507,7 @@ class PreParser {
487
507
  bool stack_overflow_;
488
508
  bool allow_lazy_;
489
509
  bool parenthesized_function_;
510
+ bool harmony_block_scoping_;
490
511
  };
491
512
  } } // v8::preparser
492
513
 
@@ -1,4 +1,4 @@
1
- // Copyright 2006-2008 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -123,15 +123,16 @@ void PrettyPrinter::VisitReturnStatement(ReturnStatement* node) {
123
123
  }
124
124
 
125
125
 
126
- void PrettyPrinter::VisitWithEnterStatement(WithEnterStatement* node) {
127
- Print("<enter with> (");
126
+ void PrettyPrinter::VisitWithStatement(WithStatement* node) {
127
+ Print("with (");
128
128
  Visit(node->expression());
129
129
  Print(") ");
130
+ Visit(node->statement());
130
131
  }
131
132
 
132
133
 
133
- void PrettyPrinter::VisitWithExitStatement(WithExitStatement* node) {
134
- Print("<exit with>");
134
+ void PrettyPrinter::VisitExitContextStatement(ExitContextStatement* node) {
135
+ Print("<exit context>");
135
136
  }
136
137
 
137
138
 
@@ -201,7 +202,8 @@ void PrettyPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
201
202
  Print("try ");
202
203
  Visit(node->try_block());
203
204
  Print(" catch (");
204
- Visit(node->catch_var());
205
+ const bool quote = false;
206
+ PrintLiteral(node->variable()->name(), quote);
205
207
  Print(") ");
206
208
  Visit(node->catch_block());
207
209
  }
@@ -282,15 +284,6 @@ void PrettyPrinter::VisitArrayLiteral(ArrayLiteral* node) {
282
284
  }
283
285
 
284
286
 
285
- void PrettyPrinter::VisitCatchExtensionObject(CatchExtensionObject* node) {
286
- Print("{ ");
287
- Visit(node->key());
288
- Print(": ");
289
- Visit(node->value());
290
- Print(" }");
291
- }
292
-
293
-
294
287
  void PrettyPrinter::VisitSlot(Slot* node) {
295
288
  switch (node->type()) {
296
289
  case Slot::PARAMETER:
@@ -805,13 +798,15 @@ void AstPrinter::VisitReturnStatement(ReturnStatement* node) {
805
798
  }
806
799
 
807
800
 
808
- void AstPrinter::VisitWithEnterStatement(WithEnterStatement* node) {
809
- PrintIndentedVisit("WITH ENTER", node->expression());
801
+ void AstPrinter::VisitWithStatement(WithStatement* node) {
802
+ IndentedScope indent(this, "WITH");
803
+ PrintIndentedVisit("OBJECT", node->expression());
804
+ PrintIndentedVisit("BODY", node->statement());
810
805
  }
811
806
 
812
807
 
813
- void AstPrinter::VisitWithExitStatement(WithExitStatement* node) {
814
- PrintIndented("WITH EXIT\n");
808
+ void AstPrinter::VisitExitContextStatement(ExitContextStatement* node) {
809
+ PrintIndented("EXIT CONTEXT\n");
815
810
  }
816
811
 
817
812
 
@@ -862,7 +857,9 @@ void AstPrinter::VisitForInStatement(ForInStatement* node) {
862
857
  void AstPrinter::VisitTryCatchStatement(TryCatchStatement* node) {
863
858
  IndentedScope indent(this, "TRY CATCH");
864
859
  PrintIndentedVisit("TRY", node->try_block());
865
- PrintIndentedVisit("CATCHVAR", node->catch_var());
860
+ PrintLiteralWithModeIndented("CATCHVAR",
861
+ node->variable(),
862
+ node->variable()->name());
866
863
  PrintIndentedVisit("CATCH", node->catch_block());
867
864
  }
868
865
 
@@ -962,13 +959,6 @@ void AstPrinter::VisitArrayLiteral(ArrayLiteral* node) {
962
959
  }
963
960
 
964
961
 
965
- void AstPrinter::VisitCatchExtensionObject(CatchExtensionObject* node) {
966
- IndentedScope indent(this, "CatchExtensionObject");
967
- PrintIndentedVisit("KEY", node->key());
968
- PrintIndentedVisit("VALUE", node->value());
969
- }
970
-
971
-
972
962
  void AstPrinter::VisitSlot(Slot* node) {
973
963
  PrintIndented("SLOT ");
974
964
  PrettyPrinter::VisitSlot(node);
@@ -1205,14 +1195,15 @@ void JsonAstBuilder::VisitReturnStatement(ReturnStatement* stmt) {
1205
1195
  }
1206
1196
 
1207
1197
 
1208
- void JsonAstBuilder::VisitWithEnterStatement(WithEnterStatement* stmt) {
1209
- TagScope tag(this, "WithEnterStatement");
1198
+ void JsonAstBuilder::VisitWithStatement(WithStatement* stmt) {
1199
+ TagScope tag(this, "WithStatement");
1210
1200
  Visit(stmt->expression());
1201
+ Visit(stmt->statement());
1211
1202
  }
1212
1203
 
1213
1204
 
1214
- void JsonAstBuilder::VisitWithExitStatement(WithExitStatement* stmt) {
1215
- TagScope tag(this, "WithExitStatement");
1205
+ void JsonAstBuilder::VisitExitContextStatement(ExitContextStatement* stmt) {
1206
+ TagScope tag(this, "ExitContextStatement");
1216
1207
  }
1217
1208
 
1218
1209
 
@@ -1254,8 +1245,10 @@ void JsonAstBuilder::VisitForInStatement(ForInStatement* stmt) {
1254
1245
 
1255
1246
  void JsonAstBuilder::VisitTryCatchStatement(TryCatchStatement* stmt) {
1256
1247
  TagScope tag(this, "TryCatchStatement");
1248
+ { AttributesScope attributes(this);
1249
+ AddAttribute("variable", stmt->variable()->name());
1250
+ }
1257
1251
  Visit(stmt->try_block());
1258
- Visit(stmt->catch_var());
1259
1252
  Visit(stmt->catch_block());
1260
1253
  }
1261
1254
 
@@ -1360,13 +1353,6 @@ void JsonAstBuilder::VisitArrayLiteral(ArrayLiteral* expr) {
1360
1353
  }
1361
1354
 
1362
1355
 
1363
- void JsonAstBuilder::VisitCatchExtensionObject(CatchExtensionObject* expr) {
1364
- TagScope tag(this, "CatchExtensionObject");
1365
- Visit(expr->key());
1366
- Visit(expr->value());
1367
- }
1368
-
1369
-
1370
1356
  void JsonAstBuilder::VisitAssignment(Assignment* expr) {
1371
1357
  TagScope tag(this, "Assignment");
1372
1358
  {
@@ -1386,10 +1372,6 @@ void JsonAstBuilder::VisitThrow(Throw* expr) {
1386
1372
 
1387
1373
  void JsonAstBuilder::VisitProperty(Property* expr) {
1388
1374
  TagScope tag(this, "Property");
1389
- {
1390
- AttributesScope attributes(this);
1391
- AddAttribute("type", expr->is_synthetic() ? "SYNTHETIC" : "NORMAL");
1392
- }
1393
1375
  Visit(expr->obj());
1394
1376
  Visit(expr->key());
1395
1377
  }
@@ -28,8 +28,6 @@
28
28
  #ifndef V8_PROFILE_GENERATOR_INL_H_
29
29
  #define V8_PROFILE_GENERATOR_INL_H_
30
30
 
31
- #ifdef ENABLE_LOGGING_AND_PROFILING
32
-
33
31
  #include "profile-generator.h"
34
32
 
35
33
  namespace v8 {
@@ -123,6 +121,4 @@ uint64_t HeapEntry::id() {
123
121
 
124
122
  } } // namespace v8::internal
125
123
 
126
- #endif // ENABLE_LOGGING_AND_PROFILING
127
-
128
124
  #endif // V8_PROFILE_GENERATOR_INL_H_
@@ -25,8 +25,6 @@
25
25
  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
26
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
- #ifdef ENABLE_LOGGING_AND_PROFILING
29
-
30
28
  #include "v8.h"
31
29
 
32
30
  #include "profile-generator-inl.h"
@@ -1096,7 +1094,7 @@ class RetainedSizeCalculator {
1096
1094
  : retained_size_(0) {
1097
1095
  }
1098
1096
 
1099
- int reained_size() const { return retained_size_; }
1097
+ int retained_size() const { return retained_size_; }
1100
1098
 
1101
1099
  void Apply(HeapEntry** entry_ptr) {
1102
1100
  if ((*entry_ptr)->painted_reachable()) {
@@ -1137,7 +1135,7 @@ void HeapEntry::CalculateExactRetainedSize() {
1137
1135
 
1138
1136
  RetainedSizeCalculator ret_size_calc;
1139
1137
  snapshot()->IterateEntries(&ret_size_calc);
1140
- retained_size_ = ret_size_calc.reained_size();
1138
+ retained_size_ = ret_size_calc.retained_size();
1141
1139
  ASSERT((retained_size_ & kExactRetainedSizeTag) == 0);
1142
1140
  retained_size_ |= kExactRetainedSizeTag;
1143
1141
  }
@@ -1602,6 +1600,28 @@ void HeapObjectsSet::Insert(Object* obj) {
1602
1600
  }
1603
1601
 
1604
1602
 
1603
+ const char* HeapObjectsSet::GetTag(Object* obj) {
1604
+ HeapObject* object = HeapObject::cast(obj);
1605
+ HashMap::Entry* cache_entry =
1606
+ entries_.Lookup(object, HeapEntriesMap::Hash(object), false);
1607
+ if (cache_entry != NULL
1608
+ && cache_entry->value != HeapEntriesMap::kHeapEntryPlaceholder) {
1609
+ return reinterpret_cast<const char*>(cache_entry->value);
1610
+ } else {
1611
+ return NULL;
1612
+ }
1613
+ }
1614
+
1615
+
1616
+ void HeapObjectsSet::SetTag(Object* obj, const char* tag) {
1617
+ if (!obj->IsHeapObject()) return;
1618
+ HeapObject* object = HeapObject::cast(obj);
1619
+ HashMap::Entry* cache_entry =
1620
+ entries_.Lookup(object, HeapEntriesMap::Hash(object), true);
1621
+ cache_entry->value = const_cast<char*>(tag);
1622
+ }
1623
+
1624
+
1605
1625
  HeapObject *const V8HeapExplorer::kInternalRootObject =
1606
1626
  reinterpret_cast<HeapObject*>(
1607
1627
  static_cast<intptr_t>(HeapObjectsMap::kInternalRootObjectId));
@@ -1613,7 +1633,8 @@ HeapObject *const V8HeapExplorer::kGcRootsObject =
1613
1633
  V8HeapExplorer::V8HeapExplorer(
1614
1634
  HeapSnapshot* snapshot,
1615
1635
  SnapshottingProgressReportingInterface* progress)
1616
- : snapshot_(snapshot),
1636
+ : heap_(Isolate::Current()->heap()),
1637
+ snapshot_(snapshot),
1617
1638
  collection_(snapshot_->collection()),
1618
1639
  progress_(progress),
1619
1640
  filler_(NULL) {
@@ -1639,6 +1660,18 @@ HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object,
1639
1660
  return snapshot_->AddRootEntry(children_count);
1640
1661
  } else if (object == kGcRootsObject) {
1641
1662
  return snapshot_->AddGcRootsEntry(children_count, retainers_count);
1663
+ } else if (object->IsJSGlobalObject()) {
1664
+ const char* tag = objects_tags_.GetTag(object);
1665
+ const char* name = collection_->names()->GetName(
1666
+ GetConstructorName(JSObject::cast(object)));
1667
+ if (tag != NULL) {
1668
+ name = collection_->names()->GetFormatted("%s / %s", name, tag);
1669
+ }
1670
+ return AddEntry(object,
1671
+ HeapEntry::kObject,
1672
+ name,
1673
+ children_count,
1674
+ retainers_count);
1642
1675
  } else if (object->IsJSFunction()) {
1643
1676
  JSFunction* func = JSFunction::cast(object);
1644
1677
  SharedFunctionInfo* shared = func->shared();
@@ -1658,8 +1691,7 @@ HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object,
1658
1691
  return AddEntry(object,
1659
1692
  HeapEntry::kObject,
1660
1693
  collection_->names()->GetName(
1661
- GetConstructorNameForHeapProfile(
1662
- JSObject::cast(object))),
1694
+ GetConstructorName(JSObject::cast(object))),
1663
1695
  children_count,
1664
1696
  retainers_count);
1665
1697
  } else if (object->IsString()) {
@@ -1691,10 +1723,14 @@ HeapEntry* V8HeapExplorer::AddEntry(HeapObject* object,
1691
1723
  : "",
1692
1724
  children_count,
1693
1725
  retainers_count);
1694
- } else if (object->IsFixedArray() || object->IsByteArray()) {
1726
+ } else if (object->IsFixedArray() ||
1727
+ object->IsFixedDoubleArray() ||
1728
+ object->IsByteArray() ||
1729
+ object->IsExternalArray()) {
1730
+ const char* tag = objects_tags_.GetTag(object);
1695
1731
  return AddEntry(object,
1696
1732
  HeapEntry::kArray,
1697
- "",
1733
+ tag != NULL ? tag : "",
1698
1734
  children_count,
1699
1735
  retainers_count);
1700
1736
  } else if (object->IsHeapNumber()) {
@@ -1780,6 +1816,7 @@ class IndexedReferencesExtractor : public ObjectVisitor {
1780
1816
  ASSERT(Memory::Object_at(field)->IsHeapObject());
1781
1817
  *field |= kFailureTag;
1782
1818
  }
1819
+
1783
1820
  private:
1784
1821
  bool CheckVisitedAndUnmark(Object** field) {
1785
1822
  if ((*field)->IsFailure()) {
@@ -1801,15 +1838,13 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1801
1838
  HeapEntry* entry = GetEntry(obj);
1802
1839
  if (entry == NULL) return; // No interest in this object.
1803
1840
 
1841
+ bool extract_indexed_refs = true;
1804
1842
  if (obj->IsJSGlobalProxy()) {
1805
1843
  // We need to reference JS global objects from snapshot's root.
1806
1844
  // We use JSGlobalProxy because this is what embedder (e.g. browser)
1807
1845
  // uses for the global object.
1808
1846
  JSGlobalProxy* proxy = JSGlobalProxy::cast(obj);
1809
1847
  SetRootShortcutReference(proxy->map()->prototype());
1810
- SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
1811
- IndexedReferencesExtractor refs_extractor(this, obj, entry);
1812
- obj->Iterate(&refs_extractor);
1813
1848
  } else if (obj->IsJSObject()) {
1814
1849
  JSObject* js_obj = JSObject::cast(obj);
1815
1850
  ExtractClosureReferences(js_obj, entry);
@@ -1817,7 +1852,7 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1817
1852
  ExtractElementReferences(js_obj, entry);
1818
1853
  ExtractInternalReferences(js_obj, entry);
1819
1854
  SetPropertyReference(
1820
- obj, entry, HEAP->Proto_symbol(), js_obj->GetPrototype());
1855
+ obj, entry, heap_->Proto_symbol(), js_obj->GetPrototype());
1821
1856
  if (obj->IsJSFunction()) {
1822
1857
  JSFunction* js_fun = JSFunction::cast(js_obj);
1823
1858
  Object* proto_or_map = js_fun->prototype_or_initial_map();
@@ -1825,39 +1860,49 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1825
1860
  if (!proto_or_map->IsMap()) {
1826
1861
  SetPropertyReference(
1827
1862
  obj, entry,
1828
- HEAP->prototype_symbol(), proto_or_map,
1863
+ heap_->prototype_symbol(), proto_or_map,
1829
1864
  JSFunction::kPrototypeOrInitialMapOffset);
1830
1865
  } else {
1831
1866
  SetPropertyReference(
1832
1867
  obj, entry,
1833
- HEAP->prototype_symbol(), js_fun->prototype());
1868
+ heap_->prototype_symbol(), js_fun->prototype());
1834
1869
  }
1835
1870
  }
1836
1871
  SetInternalReference(js_fun, entry,
1837
1872
  "shared", js_fun->shared(),
1838
1873
  JSFunction::kSharedFunctionInfoOffset);
1874
+ TagObject(js_fun->unchecked_context(), "(context)");
1839
1875
  SetInternalReference(js_fun, entry,
1840
1876
  "context", js_fun->unchecked_context(),
1841
1877
  JSFunction::kContextOffset);
1878
+ TagObject(js_fun->literals(), "(function literals)");
1842
1879
  SetInternalReference(js_fun, entry,
1843
1880
  "literals", js_fun->literals(),
1844
1881
  JSFunction::kLiteralsOffset);
1845
1882
  }
1883
+ TagObject(js_obj->properties(), "(object properties)");
1846
1884
  SetInternalReference(obj, entry,
1847
1885
  "properties", js_obj->properties(),
1848
1886
  JSObject::kPropertiesOffset);
1887
+ TagObject(js_obj->elements(), "(object elements)");
1849
1888
  SetInternalReference(obj, entry,
1850
1889
  "elements", js_obj->elements(),
1851
1890
  JSObject::kElementsOffset);
1852
- SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
1853
- IndexedReferencesExtractor refs_extractor(this, obj, entry);
1854
- obj->Iterate(&refs_extractor);
1855
1891
  } else if (obj->IsString()) {
1856
1892
  if (obj->IsConsString()) {
1857
1893
  ConsString* cs = ConsString::cast(obj);
1858
1894
  SetInternalReference(obj, entry, 1, cs->first());
1859
1895
  SetInternalReference(obj, entry, 2, cs->second());
1860
1896
  }
1897
+ extract_indexed_refs = false;
1898
+ } else if (obj->IsGlobalContext()) {
1899
+ Context* context = Context::cast(obj);
1900
+ TagObject(context->jsfunction_result_caches(),
1901
+ "(context func. result caches)");
1902
+ TagObject(context->normalized_map_cache(), "(context norm. map cache)");
1903
+ TagObject(context->runtime_context(), "(runtime context)");
1904
+ TagObject(context->map_cache(), "(context map cache)");
1905
+ TagObject(context->data(), "(context data)");
1861
1906
  } else if (obj->IsMap()) {
1862
1907
  Map* map = Map::cast(obj);
1863
1908
  SetInternalReference(obj, entry,
@@ -1866,6 +1911,7 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1866
1911
  "constructor", map->constructor(),
1867
1912
  Map::kConstructorOffset);
1868
1913
  if (!map->instance_descriptors()->IsEmpty()) {
1914
+ TagObject(map->instance_descriptors(), "(map descriptors)");
1869
1915
  SetInternalReference(obj, entry,
1870
1916
  "descriptors", map->instance_descriptors(),
1871
1917
  Map::kInstanceDescriptorsOrBitField3Offset);
@@ -1873,9 +1919,6 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1873
1919
  SetInternalReference(obj, entry,
1874
1920
  "code_cache", map->code_cache(),
1875
1921
  Map::kCodeCacheOffset);
1876
- SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
1877
- IndexedReferencesExtractor refs_extractor(this, obj, entry);
1878
- obj->Iterate(&refs_extractor);
1879
1922
  } else if (obj->IsSharedFunctionInfo()) {
1880
1923
  SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
1881
1924
  SetInternalReference(obj, entry,
@@ -1884,16 +1927,61 @@ void V8HeapExplorer::ExtractReferences(HeapObject* obj) {
1884
1927
  SetInternalReference(obj, entry,
1885
1928
  "code", shared->unchecked_code(),
1886
1929
  SharedFunctionInfo::kCodeOffset);
1930
+ TagObject(shared->scope_info(), "(function scope info)");
1931
+ SetInternalReference(obj, entry,
1932
+ "scope_info", shared->scope_info(),
1933
+ SharedFunctionInfo::kScopeInfoOffset);
1887
1934
  SetInternalReference(obj, entry,
1888
1935
  "instance_class_name", shared->instance_class_name(),
1889
1936
  SharedFunctionInfo::kInstanceClassNameOffset);
1890
1937
  SetInternalReference(obj, entry,
1891
1938
  "script", shared->script(),
1892
1939
  SharedFunctionInfo::kScriptOffset);
1893
- SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
1894
- IndexedReferencesExtractor refs_extractor(this, obj, entry);
1895
- obj->Iterate(&refs_extractor);
1896
- } else {
1940
+ } else if (obj->IsScript()) {
1941
+ Script* script = Script::cast(obj);
1942
+ SetInternalReference(obj, entry,
1943
+ "source", script->source(),
1944
+ Script::kSourceOffset);
1945
+ SetInternalReference(obj, entry,
1946
+ "name", script->name(),
1947
+ Script::kNameOffset);
1948
+ SetInternalReference(obj, entry,
1949
+ "data", script->data(),
1950
+ Script::kDataOffset);
1951
+ SetInternalReference(obj, entry,
1952
+ "context_data", script->context_data(),
1953
+ Script::kContextOffset);
1954
+ TagObject(script->line_ends(), "(script line ends)");
1955
+ SetInternalReference(obj, entry,
1956
+ "line_ends", script->line_ends(),
1957
+ Script::kLineEndsOffset);
1958
+ } else if (obj->IsDescriptorArray()) {
1959
+ DescriptorArray* desc_array = DescriptorArray::cast(obj);
1960
+ if (desc_array->length() > DescriptorArray::kContentArrayIndex) {
1961
+ Object* content_array =
1962
+ desc_array->get(DescriptorArray::kContentArrayIndex);
1963
+ TagObject(content_array, "(map descriptor content)");
1964
+ SetInternalReference(obj, entry,
1965
+ "content", content_array,
1966
+ FixedArray::OffsetOfElementAt(
1967
+ DescriptorArray::kContentArrayIndex));
1968
+ }
1969
+ } else if (obj->IsCodeCache()) {
1970
+ CodeCache* code_cache = CodeCache::cast(obj);
1971
+ TagObject(code_cache->default_cache(), "(default code cache)");
1972
+ SetInternalReference(obj, entry,
1973
+ "default_cache", code_cache->default_cache(),
1974
+ CodeCache::kDefaultCacheOffset);
1975
+ TagObject(code_cache->normal_type_cache(), "(code type cache)");
1976
+ SetInternalReference(obj, entry,
1977
+ "type_cache", code_cache->normal_type_cache(),
1978
+ CodeCache::kNormalTypeCacheOffset);
1979
+ } else if (obj->IsCode()) {
1980
+ Code* code = Code::cast(obj);
1981
+ TagObject(code->unchecked_relocation_info(), "(code relocation info)");
1982
+ TagObject(code->unchecked_deoptimization_data(), "(code deopt data)");
1983
+ }
1984
+ if (extract_indexed_refs) {
1897
1985
  SetInternalReference(obj, entry, "map", obj->map(), HeapObject::kMapOffset);
1898
1986
  IndexedReferencesExtractor refs_extractor(this, obj, entry);
1899
1987
  obj->Iterate(&refs_extractor);
@@ -2012,6 +2100,31 @@ void V8HeapExplorer::ExtractInternalReferences(JSObject* js_obj,
2012
2100
  }
2013
2101
 
2014
2102
 
2103
+ String* V8HeapExplorer::GetConstructorName(JSObject* object) {
2104
+ if (object->IsJSFunction()) return HEAP->closure_symbol();
2105
+ String* constructor_name = object->constructor_name();
2106
+ if (constructor_name == HEAP->Object_symbol()) {
2107
+ // Look up an immediate "constructor" property, if it is a function,
2108
+ // return its name. This is for instances of binding objects, which
2109
+ // have prototype constructor type "Object".
2110
+ Object* constructor_prop = NULL;
2111
+ LookupResult result;
2112
+ object->LocalLookupRealNamedProperty(HEAP->constructor_symbol(), &result);
2113
+ if (result.IsProperty()) {
2114
+ constructor_prop = result.GetLazyValue();
2115
+ }
2116
+ if (constructor_prop->IsJSFunction()) {
2117
+ Object* maybe_name = JSFunction::cast(constructor_prop)->shared()->name();
2118
+ if (maybe_name->IsString()) {
2119
+ String* name = String::cast(maybe_name);
2120
+ if (name->length() > 0) return name;
2121
+ }
2122
+ }
2123
+ }
2124
+ return object->constructor_name();
2125
+ }
2126
+
2127
+
2015
2128
  HeapEntry* V8HeapExplorer::GetEntry(Object* obj) {
2016
2129
  if (!obj->IsHeapObject()) return NULL;
2017
2130
  return filler_->FindOrAddEntry(obj, this);
@@ -2051,7 +2164,7 @@ bool V8HeapExplorer::IterateAndExtractReferences(
2051
2164
  }
2052
2165
  SetRootGcRootsReference();
2053
2166
  RootsReferencesExtractor extractor(this);
2054
- HEAP->IterateRoots(&extractor, VISIT_ALL);
2167
+ heap_->IterateRoots(&extractor, VISIT_ALL);
2055
2168
  filler_ = NULL;
2056
2169
  return progress_->ProgressReport(false);
2057
2170
  }
@@ -2206,6 +2319,76 @@ void V8HeapExplorer::SetGcRootsReference(Object* child_obj) {
2206
2319
  }
2207
2320
 
2208
2321
 
2322
+ void V8HeapExplorer::TagObject(Object* obj, const char* tag) {
2323
+ if (obj->IsHeapObject() &&
2324
+ !obj->IsOddball() &&
2325
+ obj != heap_->raw_unchecked_empty_byte_array() &&
2326
+ obj != heap_->raw_unchecked_empty_fixed_array() &&
2327
+ obj != heap_->raw_unchecked_empty_fixed_double_array() &&
2328
+ obj != heap_->raw_unchecked_empty_descriptor_array()) {
2329
+ objects_tags_.SetTag(obj, tag);
2330
+ }
2331
+ }
2332
+
2333
+
2334
+ class GlobalObjectsEnumerator : public ObjectVisitor {
2335
+ public:
2336
+ virtual void VisitPointers(Object** start, Object** end) {
2337
+ for (Object** p = start; p < end; p++) {
2338
+ if ((*p)->IsGlobalContext()) {
2339
+ Context* context = Context::cast(*p);
2340
+ JSObject* proxy = context->global_proxy();
2341
+ if (proxy->IsJSGlobalProxy()) {
2342
+ Object* global = proxy->map()->prototype();
2343
+ if (global->IsJSGlobalObject()) {
2344
+ objects_.Add(Handle<JSGlobalObject>(JSGlobalObject::cast(global)));
2345
+ }
2346
+ }
2347
+ }
2348
+ }
2349
+ }
2350
+ int count() { return objects_.length(); }
2351
+ Handle<JSGlobalObject>& at(int i) { return objects_[i]; }
2352
+
2353
+ private:
2354
+ List<Handle<JSGlobalObject> > objects_;
2355
+ };
2356
+
2357
+
2358
+ // Modifies heap. Must not be run during heap traversal.
2359
+ void V8HeapExplorer::TagGlobalObjects() {
2360
+ Isolate* isolate = Isolate::Current();
2361
+ GlobalObjectsEnumerator enumerator;
2362
+ isolate->global_handles()->IterateAllRoots(&enumerator);
2363
+ Handle<String> document_string =
2364
+ isolate->factory()->NewStringFromAscii(CStrVector("document"));
2365
+ Handle<String> url_string =
2366
+ isolate->factory()->NewStringFromAscii(CStrVector("URL"));
2367
+ const char** urls = NewArray<const char*>(enumerator.count());
2368
+ for (int i = 0, l = enumerator.count(); i < l; ++i) {
2369
+ urls[i] = NULL;
2370
+ Handle<JSGlobalObject> global_obj = enumerator.at(i);
2371
+ Object* obj_document;
2372
+ if (global_obj->GetProperty(*document_string)->ToObject(&obj_document) &&
2373
+ obj_document->IsJSObject()) {
2374
+ JSObject* document = JSObject::cast(obj_document);
2375
+ Object* obj_url;
2376
+ if (document->GetProperty(*url_string)->ToObject(&obj_url) &&
2377
+ obj_url->IsString()) {
2378
+ urls[i] = collection_->names()->GetName(String::cast(obj_url));
2379
+ }
2380
+ }
2381
+ }
2382
+
2383
+ AssertNoAllocation no_allocation;
2384
+ for (int i = 0, l = enumerator.count(); i < l; ++i) {
2385
+ objects_tags_.SetTag(*enumerator.at(i), urls[i]);
2386
+ }
2387
+
2388
+ DeleteArray(urls);
2389
+ }
2390
+
2391
+
2209
2392
  class GlobalHandlesExtractor : public ObjectVisitor {
2210
2393
  public:
2211
2394
  explicit GlobalHandlesExtractor(NativeObjectsExplorer* explorer)
@@ -2448,6 +2631,7 @@ class SnapshotCounter : public SnapshotFillerInterface {
2448
2631
  HeapEntry*) {
2449
2632
  entries_->CountReference(parent_ptr, child_ptr);
2450
2633
  }
2634
+
2451
2635
  private:
2452
2636
  HeapEntriesMap* entries_;
2453
2637
  };
@@ -2519,6 +2703,7 @@ class SnapshotFiller : public SnapshotFillerInterface {
2519
2703
  child_entry,
2520
2704
  retainer_index);
2521
2705
  }
2706
+
2522
2707
  private:
2523
2708
  HeapSnapshot* snapshot_;
2524
2709
  HeapSnapshotsCollection* collection_;
@@ -2527,6 +2712,8 @@ class SnapshotFiller : public SnapshotFillerInterface {
2527
2712
 
2528
2713
 
2529
2714
  bool HeapSnapshotGenerator::GenerateSnapshot() {
2715
+ v8_heap_explorer_.TagGlobalObjects();
2716
+
2530
2717
  AssertNoAllocation no_alloc;
2531
2718
 
2532
2719
  SetProgressTotal(4); // 2 passes + dominators + sizes.
@@ -3087,12 +3274,4 @@ void HeapSnapshotJSONSerializer::SortHashMap(
3087
3274
  sorted_entries->Sort(SortUsingEntryValue);
3088
3275
  }
3089
3276
 
3090
-
3091
- String* GetConstructorNameForHeapProfile(JSObject* object) {
3092
- if (object->IsJSFunction()) return HEAP->closure_symbol();
3093
- return object->constructor_name();
3094
- }
3095
-
3096
3277
  } } // namespace v8::internal
3097
-
3098
- #endif // ENABLE_LOGGING_AND_PROFILING