libv8 3.3.10.4 → 3.5.10.beta1

Sign up to get free protection for your applications and to get access to all the features.
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