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
@@ -43,6 +43,8 @@
43
43
  namespace v8 {
44
44
  namespace internal {
45
45
 
46
+ class CompilationInfo;
47
+
46
48
  #define CODE_TAGS_LIST(V) \
47
49
  V(LOAD_IC) \
48
50
  V(KEYED_LOAD_IC) \
@@ -113,11 +115,13 @@ class GDBJITInterface: public AllStatic {
113
115
  static void AddCode(const char* name,
114
116
  Code* code,
115
117
  CodeTag tag,
116
- Script* script = NULL);
118
+ Script* script,
119
+ CompilationInfo* info);
117
120
 
118
121
  static void AddCode(Handle<String> name,
119
122
  Handle<Script> script,
120
- Handle<Code> code);
123
+ Handle<Code> code,
124
+ CompilationInfo* info);
121
125
 
122
126
  static void AddCode(CodeTag tag, String* name, Code* code);
123
127
 
@@ -41,80 +41,151 @@ ObjectGroup::~ObjectGroup() {
41
41
  }
42
42
 
43
43
 
44
- class GlobalHandles::Node : public Malloced {
44
+ class GlobalHandles::Node {
45
45
  public:
46
+ // State transition diagram:
47
+ // FREE -> NORMAL <-> WEAK -> PENDING -> NEAR_DEATH -> { NORMAL, WEAK, FREE }
48
+ enum State {
49
+ FREE,
50
+ NORMAL, // Normal global handle.
51
+ WEAK, // Flagged as weak but not yet finalized.
52
+ PENDING, // Has been recognized as only reachable by weak handles.
53
+ NEAR_DEATH // Callback has informed the handle is near death.
54
+ };
46
55
 
47
- void Initialize(Object* object) {
48
- // Set the initial value of the handle.
49
- object_ = object;
50
- class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
51
- independent_ = false;
52
- state_ = NORMAL;
53
- parameter_or_next_free_.parameter = NULL;
54
- callback_ = NULL;
55
- }
56
-
57
- Node() {
58
- state_ = DESTROYED;
56
+ // Maps handle location (slot) to the containing node.
57
+ static Node* FromLocation(Object** location) {
58
+ ASSERT(OFFSET_OF(Node, object_) == 0);
59
+ return reinterpret_cast<Node*>(location);
59
60
  }
60
61
 
61
- explicit Node(Object* object) {
62
- Initialize(object);
63
- // Initialize link structure.
64
- next_ = NULL;
65
- }
62
+ Node() {}
66
63
 
67
- ~Node() {
68
- if (state_ != DESTROYED) Destroy(Isolate::Current()->global_handles());
69
64
  #ifdef DEBUG
65
+ ~Node() {
66
+ // TODO(1428): if it's a weak handle we should have invoked its callback.
70
67
  // Zap the values for eager trapping.
71
68
  object_ = NULL;
72
- next_ = NULL;
69
+ class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
70
+ index_ = 0;
71
+ independent_ = false;
72
+ in_new_space_list_ = false;
73
73
  parameter_or_next_free_.next_free = NULL;
74
+ callback_ = NULL;
75
+ }
74
76
  #endif
77
+
78
+ void Initialize(int index, Node** first_free) {
79
+ index_ = static_cast<uint8_t>(index);
80
+ ASSERT(static_cast<int>(index_) == index);
81
+ state_ = FREE;
82
+ in_new_space_list_ = false;
83
+ parameter_or_next_free_.next_free = *first_free;
84
+ *first_free = this;
75
85
  }
76
86
 
77
- void Destroy(GlobalHandles* global_handles) {
78
- if (state_ == WEAK || IsNearDeath()) {
87
+ void Acquire(Object* object, GlobalHandles* global_handles) {
88
+ ASSERT(state_ == FREE);
89
+ object_ = object;
90
+ class_id_ = v8::HeapProfiler::kPersistentHandleNoClassId;
91
+ independent_ = false;
92
+ state_ = NORMAL;
93
+ parameter_or_next_free_.parameter = NULL;
94
+ callback_ = NULL;
95
+ IncreaseBlockUses(global_handles);
96
+ }
97
+
98
+ void Release(GlobalHandles* global_handles) {
99
+ ASSERT(state_ != FREE);
100
+ if (IsWeakRetainer()) {
79
101
  global_handles->number_of_weak_handles_--;
80
102
  if (object_->IsJSGlobalObject()) {
81
103
  global_handles->number_of_global_object_weak_handles_--;
82
104
  }
83
105
  }
84
- state_ = DESTROYED;
106
+ state_ = FREE;
107
+ parameter_or_next_free_.next_free = global_handles->first_free_;
108
+ global_handles->first_free_ = this;
109
+ DecreaseBlockUses(global_handles);
110
+ }
111
+
112
+ // Object slot accessors.
113
+ Object* object() const { return object_; }
114
+ Object** location() { return &object_; }
115
+ Handle<Object> handle() { return Handle<Object>(location()); }
116
+
117
+ // Wrapper class ID accessors.
118
+ bool has_wrapper_class_id() const {
119
+ return class_id_ != v8::HeapProfiler::kPersistentHandleNoClassId;
85
120
  }
121
+ uint16_t wrapper_class_id() const { return class_id_; }
122
+ void set_wrapper_class_id(uint16_t class_id) {
123
+ class_id_ = class_id;
124
+ }
125
+
126
+ // State accessors.
127
+
128
+ State state() const { return state_; }
129
+
130
+ bool IsNearDeath() const {
131
+ // Check for PENDING to ensure correct answer when processing callbacks.
132
+ return state_ == PENDING || state_ == NEAR_DEATH;
133
+ }
134
+
135
+ bool IsWeak() const { return state_ == WEAK; }
136
+
137
+ bool IsRetainer() const { return state_ != FREE; }
86
138
 
87
- // Accessors for next_.
88
- Node* next() { return next_; }
89
- void set_next(Node* value) { next_ = value; }
90
- Node** next_addr() { return &next_; }
139
+ bool IsStrongRetainer() const { return state_ == NORMAL; }
140
+
141
+ bool IsWeakRetainer() const {
142
+ return state_ == WEAK || state_ == PENDING || state_ == NEAR_DEATH;
143
+ }
144
+
145
+ void MarkPending() {
146
+ ASSERT(state_ == WEAK);
147
+ state_ = PENDING;
148
+ }
149
+
150
+ // Independent flag accessors.
151
+ void MarkIndependent() {
152
+ ASSERT(state_ != FREE);
153
+ independent_ = true;
154
+ }
155
+ bool is_independent() const { return independent_; }
156
+
157
+ // In-new-space-list flag accessors.
158
+ void set_in_new_space_list(bool v) { in_new_space_list_ = v; }
159
+ bool is_in_new_space_list() const { return in_new_space_list_; }
160
+
161
+ // Callback accessor.
162
+ WeakReferenceCallback callback() { return callback_; }
163
+
164
+ // Callback parameter accessors.
165
+ void set_parameter(void* parameter) {
166
+ ASSERT(state_ != FREE);
167
+ parameter_or_next_free_.parameter = parameter;
168
+ }
169
+ void* parameter() const {
170
+ ASSERT(state_ != FREE);
171
+ return parameter_or_next_free_.parameter;
172
+ }
91
173
 
92
174
  // Accessors for next free node in the free list.
93
175
  Node* next_free() {
94
- ASSERT(state_ == DESTROYED);
176
+ ASSERT(state_ == FREE);
95
177
  return parameter_or_next_free_.next_free;
96
178
  }
97
179
  void set_next_free(Node* value) {
98
- ASSERT(state_ == DESTROYED);
180
+ ASSERT(state_ == FREE);
99
181
  parameter_or_next_free_.next_free = value;
100
182
  }
101
183
 
102
- // Returns a link from the handle.
103
- static Node* FromLocation(Object** location) {
104
- ASSERT(OFFSET_OF(Node, object_) == 0);
105
- return reinterpret_cast<Node*>(location);
106
- }
107
-
108
- // Returns the handle.
109
- Handle<Object> handle() { return Handle<Object>(&object_); }
110
-
111
- // Make this handle weak.
112
- void MakeWeak(GlobalHandles* global_handles, void* parameter,
184
+ void MakeWeak(GlobalHandles* global_handles,
185
+ void* parameter,
113
186
  WeakReferenceCallback callback) {
114
- LOG(global_handles->isolate(),
115
- HandleEvent("GlobalHandle::MakeWeak", handle().location()));
116
- ASSERT(state_ != DESTROYED);
117
- if (state_ != WEAK && !IsNearDeath()) {
187
+ ASSERT(state_ != FREE);
188
+ if (!IsWeakRetainer()) {
118
189
  global_handles->number_of_weak_handles_++;
119
190
  if (object_->IsJSGlobalObject()) {
120
191
  global_handles->number_of_global_object_weak_handles_++;
@@ -126,10 +197,8 @@ class GlobalHandles::Node : public Malloced {
126
197
  }
127
198
 
128
199
  void ClearWeakness(GlobalHandles* global_handles) {
129
- LOG(global_handles->isolate(),
130
- HandleEvent("GlobalHandle::ClearWeakness", handle().location()));
131
- ASSERT(state_ != DESTROYED);
132
- if (state_ == WEAK || IsNearDeath()) {
200
+ ASSERT(state_ != FREE);
201
+ if (IsWeakRetainer()) {
133
202
  global_handles->number_of_weak_handles_--;
134
203
  if (object_->IsJSGlobalObject()) {
135
204
  global_handles->number_of_global_object_weak_handles_--;
@@ -139,50 +208,12 @@ class GlobalHandles::Node : public Malloced {
139
208
  set_parameter(NULL);
140
209
  }
141
210
 
142
- void MarkIndependent(GlobalHandles* global_handles) {
143
- LOG(global_handles->isolate(),
144
- HandleEvent("GlobalHandle::MarkIndependent", handle().location()));
145
- ASSERT(state_ != DESTROYED);
146
- independent_ = true;
147
- }
148
-
149
- bool IsNearDeath() {
150
- // Check for PENDING to ensure correct answer when processing callbacks.
151
- return state_ == PENDING || state_ == NEAR_DEATH;
152
- }
153
-
154
- bool IsWeak() {
155
- return state_ == WEAK;
156
- }
157
-
158
- bool CanBeRetainer() {
159
- return state_ != DESTROYED && state_ != NEAR_DEATH;
160
- }
161
-
162
- void SetWrapperClassId(uint16_t class_id) {
163
- class_id_ = class_id;
164
- }
165
-
166
- // Returns the id for this weak handle.
167
- void set_parameter(void* parameter) {
168
- ASSERT(state_ != DESTROYED);
169
- parameter_or_next_free_.parameter = parameter;
170
- }
171
- void* parameter() {
172
- ASSERT(state_ != DESTROYED);
173
- return parameter_or_next_free_.parameter;
174
- }
175
-
176
- // Returns the callback for this weak handle.
177
- WeakReferenceCallback callback() { return callback_; }
178
-
179
211
  bool PostGarbageCollectionProcessing(Isolate* isolate,
180
212
  GlobalHandles* global_handles) {
181
213
  if (state_ != Node::PENDING) return false;
182
- LOG(isolate, HandleEvent("GlobalHandle::Processing", handle().location()));
183
214
  WeakReferenceCallback func = callback();
184
215
  if (func == NULL) {
185
- Destroy(global_handles);
216
+ Release(global_handles);
186
217
  return false;
187
218
  }
188
219
  void* par = parameter();
@@ -191,13 +222,6 @@ class GlobalHandles::Node : public Malloced {
191
222
 
192
223
  v8::Persistent<v8::Object> object = ToApi<v8::Object>(handle());
193
224
  {
194
- // Forbid reuse of destroyed nodes as they might be already deallocated.
195
- // It's fine though to reuse nodes that were destroyed in weak callback
196
- // as those cannot be deallocated until we are back from the callback.
197
- global_handles->set_first_free(NULL);
198
- if (global_handles->first_deallocated()) {
199
- global_handles->first_deallocated()->set_next(global_handles->head());
200
- }
201
225
  // Check that we are not passing a finalized external string to
202
226
  // the callback.
203
227
  ASSERT(!object_->IsExternalAsciiString() ||
@@ -214,97 +238,145 @@ class GlobalHandles::Node : public Malloced {
214
238
  return true;
215
239
  }
216
240
 
217
- // Place the handle address first to avoid offset computation.
218
- Object* object_; // Storage for object pointer.
241
+ private:
242
+ inline NodeBlock* FindBlock();
243
+ inline void IncreaseBlockUses(GlobalHandles* global_handles);
244
+ inline void DecreaseBlockUses(GlobalHandles* global_handles);
245
+
246
+ // Storage for object pointer.
247
+ // Placed first to avoid offset computation.
248
+ Object* object_;
219
249
 
250
+ // Next word stores class_id, index, state, and independent.
251
+ // Note: the most aligned fields should go first.
252
+
253
+ // Wrapper class ID.
220
254
  uint16_t class_id_;
221
255
 
222
- // Transition diagram:
223
- // NORMAL <-> WEAK -> PENDING -> NEAR_DEATH -> { NORMAL, WEAK, DESTROYED }
224
- enum State {
225
- NORMAL, // Normal global handle.
226
- WEAK, // Flagged as weak but not yet finalized.
227
- PENDING, // Has been recognized as only reachable by weak handles.
228
- NEAR_DEATH, // Callback has informed the handle is near death.
229
- DESTROYED
230
- };
231
- State state_ : 4; // Need one more bit for MSVC as it treats enums as signed.
256
+ // Index in the containing handle block.
257
+ uint8_t index_;
258
+
259
+ // Need one more bit for MSVC as it treats enums as signed.
260
+ State state_ : 4;
232
261
 
233
262
  bool independent_ : 1;
263
+ bool in_new_space_list_ : 1;
234
264
 
235
- private:
236
265
  // Handle specific callback.
237
266
  WeakReferenceCallback callback_;
238
- // Provided data for callback. In DESTROYED state, this is used for
267
+
268
+ // Provided data for callback. In FREE state, this is used for
239
269
  // the free list link.
240
270
  union {
241
271
  void* parameter;
242
272
  Node* next_free;
243
273
  } parameter_or_next_free_;
244
274
 
245
- // Linkage for the list.
246
- Node* next_;
275
+ DISALLOW_COPY_AND_ASSIGN(Node);
276
+ };
277
+
247
278
 
279
+ class GlobalHandles::NodeBlock {
248
280
  public:
249
- TRACK_MEMORY("GlobalHandles::Node")
250
- };
281
+ static const int kSize = 256;
251
282
 
283
+ explicit NodeBlock(NodeBlock* next)
284
+ : next_(next), used_nodes_(0), next_used_(NULL), prev_used_(NULL) {}
252
285
 
253
- class GlobalHandles::Pool {
254
- public:
255
- Pool() {
256
- current_ = new Chunk();
257
- current_->previous = NULL;
258
- next_ = current_->nodes;
259
- limit_ = current_->nodes + kNodesPerChunk;
286
+ void PutNodesOnFreeList(Node** first_free) {
287
+ for (int i = kSize - 1; i >= 0; --i) {
288
+ nodes_[i].Initialize(i, first_free);
260
289
  }
290
+ }
261
291
 
262
- ~Pool() {
263
- if (current_ != NULL) {
264
- Release();
265
- }
292
+ Node* node_at(int index) {
293
+ ASSERT(0 <= index && index < kSize);
294
+ return &nodes_[index];
295
+ }
296
+
297
+ void IncreaseUses(GlobalHandles* global_handles) {
298
+ ASSERT(used_nodes_ < kSize);
299
+ if (used_nodes_++ == 0) {
300
+ NodeBlock* old_first = global_handles->first_used_block_;
301
+ global_handles->first_used_block_ = this;
302
+ next_used_ = old_first;
303
+ prev_used_ = NULL;
304
+ if (old_first == NULL) return;
305
+ old_first->prev_used_ = this;
266
306
  }
307
+ }
267
308
 
268
- Node* Allocate() {
269
- if (next_ < limit_) {
270
- return next_++;
309
+ void DecreaseUses(GlobalHandles* global_handles) {
310
+ ASSERT(used_nodes_ > 0);
311
+ if (--used_nodes_ == 0) {
312
+ if (next_used_ != NULL) next_used_->prev_used_ = prev_used_;
313
+ if (prev_used_ != NULL) prev_used_->next_used_ = next_used_;
314
+ if (this == global_handles->first_used_block_) {
315
+ global_handles->first_used_block_ = next_used_;
271
316
  }
272
- return SlowAllocate();
273
317
  }
318
+ }
274
319
 
275
- void Release() {
276
- Chunk* current = current_;
277
- ASSERT(current != NULL); // At least a single block must by allocated
278
- do {
279
- Chunk* previous = current->previous;
280
- delete current;
281
- current = previous;
282
- } while (current != NULL);
283
- current_ = NULL;
284
- next_ = limit_ = NULL;
285
- }
320
+ // Next block in the list of all blocks.
321
+ NodeBlock* next() const { return next_; }
286
322
 
287
- private:
288
- static const int kNodesPerChunk = (1 << 12) - 1;
289
- struct Chunk : public Malloced {
290
- Chunk* previous;
291
- Node nodes[kNodesPerChunk];
292
- };
293
-
294
- Node* SlowAllocate() {
295
- Chunk* chunk = new Chunk();
296
- chunk->previous = current_;
297
- current_ = chunk;
298
-
299
- Node* new_nodes = current_->nodes;
300
- next_ = new_nodes + 1;
301
- limit_ = new_nodes + kNodesPerChunk;
302
- return new_nodes;
303
- }
323
+ // Next/previous block in the list of blocks with used nodes.
324
+ NodeBlock* next_used() const { return next_used_; }
325
+ NodeBlock* prev_used() const { return prev_used_; }
326
+
327
+ private:
328
+ Node nodes_[kSize];
329
+ NodeBlock* const next_;
330
+ int used_nodes_;
331
+ NodeBlock* next_used_;
332
+ NodeBlock* prev_used_;
333
+ };
334
+
335
+
336
+ GlobalHandles::NodeBlock* GlobalHandles::Node::FindBlock() {
337
+ intptr_t ptr = reinterpret_cast<intptr_t>(this);
338
+ ptr = ptr - index_ * sizeof(Node);
339
+ NodeBlock* block = reinterpret_cast<NodeBlock*>(ptr);
340
+ ASSERT(block->node_at(index_) == this);
341
+ return block;
342
+ }
343
+
344
+
345
+ void GlobalHandles::Node::IncreaseBlockUses(GlobalHandles* global_handles) {
346
+ FindBlock()->IncreaseUses(global_handles);
347
+ }
348
+
349
+
350
+ void GlobalHandles::Node::DecreaseBlockUses(GlobalHandles* global_handles) {
351
+ FindBlock()->DecreaseUses(global_handles);
352
+ }
353
+
354
+
355
+ class GlobalHandles::NodeIterator {
356
+ public:
357
+ explicit NodeIterator(GlobalHandles* global_handles)
358
+ : block_(global_handles->first_used_block_),
359
+ index_(0) {}
360
+
361
+ bool done() const { return block_ == NULL; }
362
+
363
+ Node* node() const {
364
+ ASSERT(!done());
365
+ return block_->node_at(index_);
366
+ }
304
367
 
305
- Chunk* current_;
306
- Node* next_;
307
- Node* limit_;
368
+ void Advance() {
369
+ ASSERT(!done());
370
+ if (++index_ < NodeBlock::kSize) return;
371
+ index_ = 0;
372
+ block_ = block_->next_used();
373
+ }
374
+
375
+ private:
376
+ NodeBlock* block_;
377
+ int index_;
378
+
379
+ DISALLOW_COPY_AND_ASSIGN(NodeIterator);
308
380
  };
309
381
 
310
382
 
@@ -312,41 +384,39 @@ GlobalHandles::GlobalHandles(Isolate* isolate)
312
384
  : isolate_(isolate),
313
385
  number_of_weak_handles_(0),
314
386
  number_of_global_object_weak_handles_(0),
315
- head_(NULL),
387
+ first_block_(NULL),
388
+ first_used_block_(NULL),
316
389
  first_free_(NULL),
317
- first_deallocated_(NULL),
318
- pool_(new Pool()),
319
- post_gc_processing_count_(0),
320
- object_groups_(4) {
321
- }
390
+ post_gc_processing_count_(0) {}
322
391
 
323
392
 
324
393
  GlobalHandles::~GlobalHandles() {
325
- delete pool_;
326
- pool_ = 0;
394
+ NodeBlock* block = first_block_;
395
+ while (block != NULL) {
396
+ NodeBlock* tmp = block->next();
397
+ delete block;
398
+ block = tmp;
399
+ }
400
+ first_block_ = NULL;
327
401
  }
328
402
 
329
403
 
330
404
  Handle<Object> GlobalHandles::Create(Object* value) {
331
405
  isolate_->counters()->global_handles()->Increment();
332
- Node* result;
333
- if (first_free()) {
334
- // Take the first node in the free list.
335
- result = first_free();
336
- set_first_free(result->next_free());
337
- } else if (first_deallocated()) {
338
- // Next try deallocated list
339
- result = first_deallocated();
340
- set_first_deallocated(result->next_free());
341
- ASSERT(result->next() == head());
342
- set_head(result);
343
- } else {
344
- // Allocate a new node.
345
- result = pool_->Allocate();
346
- result->set_next(head());
347
- set_head(result);
406
+ if (first_free_ == NULL) {
407
+ first_block_ = new NodeBlock(first_block_);
408
+ first_block_->PutNodesOnFreeList(&first_free_);
409
+ }
410
+ ASSERT(first_free_ != NULL);
411
+ // Take the first node in the free list.
412
+ Node* result = first_free_;
413
+ first_free_ = result->next_free();
414
+ result->Acquire(value, this);
415
+ if (isolate_->heap()->InNewSpace(value) &&
416
+ !result->is_in_new_space_list()) {
417
+ new_space_nodes_.Add(result);
418
+ result->set_in_new_space_list(true);
348
419
  }
349
- result->Initialize(value);
350
420
  return result->handle();
351
421
  }
352
422
 
@@ -354,11 +424,7 @@ Handle<Object> GlobalHandles::Create(Object* value) {
354
424
  void GlobalHandles::Destroy(Object** location) {
355
425
  isolate_->counters()->global_handles()->Decrement();
356
426
  if (location == NULL) return;
357
- Node* node = Node::FromLocation(location);
358
- node->Destroy(this);
359
- // Link the destroyed.
360
- node->set_next_free(first_free());
361
- set_first_free(node);
427
+ Node::FromLocation(location)->Release(this);
362
428
  }
363
429
 
364
430
 
@@ -375,7 +441,7 @@ void GlobalHandles::ClearWeakness(Object** location) {
375
441
 
376
442
 
377
443
  void GlobalHandles::MarkIndependent(Object** location) {
378
- Node::FromLocation(location)->MarkIndependent(this);
444
+ Node::FromLocation(location)->MarkIndependent();
379
445
  }
380
446
 
381
447
 
@@ -390,68 +456,66 @@ bool GlobalHandles::IsWeak(Object** location) {
390
456
 
391
457
 
392
458
  void GlobalHandles::SetWrapperClassId(Object** location, uint16_t class_id) {
393
- Node::FromLocation(location)->SetWrapperClassId(class_id);
459
+ Node::FromLocation(location)->set_wrapper_class_id(class_id);
394
460
  }
395
461
 
396
462
 
397
463
  void GlobalHandles::IterateWeakRoots(ObjectVisitor* v) {
398
- // Traversal of GC roots in the global handle list that are marked as
399
- // WEAK, PENDING or NEAR_DEATH.
400
- for (Node* current = head_; current != NULL; current = current->next()) {
401
- if (current->state_ == Node::WEAK
402
- || current->state_ == Node::PENDING
403
- || current->state_ == Node::NEAR_DEATH) {
404
- v->VisitPointer(&current->object_);
464
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
465
+ if (it.node()->IsWeakRetainer()) v->VisitPointer(it.node()->location());
466
+ }
467
+ }
468
+
469
+
470
+ void GlobalHandles::IterateWeakRoots(WeakReferenceGuest f,
471
+ WeakReferenceCallback callback) {
472
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
473
+ if (it.node()->IsWeak() && it.node()->callback() == callback) {
474
+ f(it.node()->object(), it.node()->parameter());
405
475
  }
406
476
  }
407
477
  }
408
478
 
409
479
 
410
- void GlobalHandles::IterateWeakIndependentRoots(ObjectVisitor* v) {
411
- // Traversal of GC roots in the global handle list that are independent
412
- // and marked as WEAK, PENDING or NEAR_DEATH.
413
- for (Node* current = head_; current != NULL; current = current->next()) {
414
- if (!current->independent_) continue;
415
- if (current->state_ == Node::WEAK
416
- || current->state_ == Node::PENDING
417
- || current->state_ == Node::NEAR_DEATH) {
418
- v->VisitPointer(&current->object_);
480
+ void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
481
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
482
+ if (it.node()->IsWeak() && f(it.node()->location())) {
483
+ it.node()->MarkPending();
419
484
  }
420
485
  }
421
486
  }
422
487
 
423
488
 
424
- void GlobalHandles::IterateWeakRoots(WeakReferenceGuest f,
425
- WeakReferenceCallback callback) {
426
- for (Node* current = head_; current != NULL; current = current->next()) {
427
- if (current->IsWeak() && current->callback() == callback) {
428
- f(current->object_, current->parameter());
489
+ void GlobalHandles::IterateNewSpaceStrongAndDependentRoots(ObjectVisitor* v) {
490
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
491
+ Node* node = new_space_nodes_[i];
492
+ if (node->IsStrongRetainer() ||
493
+ (node->IsWeakRetainer() && !node->is_independent())) {
494
+ v->VisitPointer(node->location());
429
495
  }
430
496
  }
431
497
  }
432
498
 
433
499
 
434
- void GlobalHandles::IdentifyWeakHandles(WeakSlotCallback f) {
435
- for (Node* current = head_; current != NULL; current = current->next()) {
436
- if (current->state_ == Node::WEAK) {
437
- if (f(&current->object_)) {
438
- current->state_ = Node::PENDING;
439
- LOG(isolate_,
440
- HandleEvent("GlobalHandle::Pending", current->handle().location()));
441
- }
500
+ void GlobalHandles::IdentifyNewSpaceWeakIndependentHandles(
501
+ WeakSlotCallbackWithHeap f) {
502
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
503
+ Node* node = new_space_nodes_[i];
504
+ ASSERT(node->is_in_new_space_list());
505
+ if (node->is_independent() && node->IsWeak() &&
506
+ f(isolate_->heap(), node->location())) {
507
+ node->MarkPending();
442
508
  }
443
509
  }
444
510
  }
445
511
 
446
512
 
447
- void GlobalHandles::IdentifyWeakIndependentHandles(WeakSlotCallbackWithHeap f) {
448
- for (Node* current = head_; current != NULL; current = current->next()) {
449
- if (current->state_ == Node::WEAK && current->independent_) {
450
- if (f(isolate_->heap(), &current->object_)) {
451
- current->state_ = Node::PENDING;
452
- LOG(isolate_,
453
- HandleEvent("GlobalHandle::Pending", current->handle().location()));
454
- }
513
+ void GlobalHandles::IterateNewSpaceWeakIndependentRoots(ObjectVisitor* v) {
514
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
515
+ Node* node = new_space_nodes_[i];
516
+ ASSERT(node->is_in_new_space_list());
517
+ if (node->is_independent() && node->IsWeakRetainer()) {
518
+ v->VisitPointer(node->location());
455
519
  }
456
520
  }
457
521
  }
@@ -462,116 +526,103 @@ bool GlobalHandles::PostGarbageCollectionProcessing(
462
526
  // Process weak global handle callbacks. This must be done after the
463
527
  // GC is completely done, because the callbacks may invoke arbitrary
464
528
  // API functions.
465
- // At the same time deallocate all DESTROYED nodes.
466
529
  ASSERT(isolate_->heap()->gc_state() == Heap::NOT_IN_GC);
467
530
  const int initial_post_gc_processing_count = ++post_gc_processing_count_;
468
531
  bool next_gc_likely_to_collect_more = false;
469
- Node** p = &head_;
470
- while (*p != NULL) {
471
- // Skip dependent handles. Their weak callbacks might expect to be
472
- // called between two global garbage collection callbacks which
473
- // are not called for minor collections.
474
- if (collector == SCAVENGER && !(*p)->independent_) {
475
- p = (*p)->next_addr();
476
- continue;
477
- }
478
-
479
- if ((*p)->PostGarbageCollectionProcessing(isolate_, this)) {
480
- if (initial_post_gc_processing_count != post_gc_processing_count_) {
481
- // Weak callback triggered another GC and another round of
482
- // PostGarbageCollection processing. The current node might
483
- // have been deleted in that round, so we need to bail out (or
484
- // restart the processing).
485
- break;
532
+ if (collector == SCAVENGER) {
533
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
534
+ Node* node = new_space_nodes_[i];
535
+ ASSERT(node->is_in_new_space_list());
536
+ // Skip dependent handles. Their weak callbacks might expect to be
537
+ // called between two global garbage collection callbacks which
538
+ // are not called for minor collections.
539
+ if (!node->is_independent()) continue;
540
+ if (node->PostGarbageCollectionProcessing(isolate_, this)) {
541
+ if (initial_post_gc_processing_count != post_gc_processing_count_) {
542
+ // Weak callback triggered another GC and another round of
543
+ // PostGarbageCollection processing. The current node might
544
+ // have been deleted in that round, so we need to bail out (or
545
+ // restart the processing).
546
+ return next_gc_likely_to_collect_more;
547
+ }
548
+ }
549
+ if (!node->IsRetainer()) {
550
+ next_gc_likely_to_collect_more = true;
486
551
  }
487
552
  }
488
- if ((*p)->state_ == Node::DESTROYED) {
489
- // Delete the link.
490
- Node* node = *p;
491
- *p = node->next(); // Update the link.
492
- if (first_deallocated()) {
493
- first_deallocated()->set_next(node);
553
+ } else {
554
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
555
+ if (it.node()->PostGarbageCollectionProcessing(isolate_, this)) {
556
+ if (initial_post_gc_processing_count != post_gc_processing_count_) {
557
+ // See the comment above.
558
+ return next_gc_likely_to_collect_more;
559
+ }
560
+ }
561
+ if (!it.node()->IsRetainer()) {
562
+ next_gc_likely_to_collect_more = true;
494
563
  }
495
- node->set_next_free(first_deallocated());
496
- set_first_deallocated(node);
497
- next_gc_likely_to_collect_more = true;
498
- } else {
499
- p = (*p)->next_addr();
500
564
  }
501
565
  }
502
- set_first_free(NULL);
503
- if (first_deallocated()) {
504
- first_deallocated()->set_next(head());
566
+ // Update the list of new space nodes.
567
+ int last = 0;
568
+ for (int i = 0; i < new_space_nodes_.length(); ++i) {
569
+ Node* node = new_space_nodes_[i];
570
+ ASSERT(node->is_in_new_space_list());
571
+ if (node->IsRetainer() && isolate_->heap()->InNewSpace(node->object())) {
572
+ new_space_nodes_[last++] = node;
573
+ } else {
574
+ node->set_in_new_space_list(false);
575
+ }
505
576
  }
506
-
577
+ new_space_nodes_.Rewind(last);
507
578
  return next_gc_likely_to_collect_more;
508
579
  }
509
580
 
510
581
 
511
582
  void GlobalHandles::IterateStrongRoots(ObjectVisitor* v) {
512
- // Traversal of global handles marked as NORMAL.
513
- for (Node* current = head_; current != NULL; current = current->next()) {
514
- if (current->state_ == Node::NORMAL) {
515
- v->VisitPointer(&current->object_);
583
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
584
+ if (it.node()->IsStrongRetainer()) {
585
+ v->VisitPointer(it.node()->location());
516
586
  }
517
587
  }
518
588
  }
519
589
 
520
590
 
521
591
  void GlobalHandles::IterateAllRoots(ObjectVisitor* v) {
522
- for (Node* current = head_; current != NULL; current = current->next()) {
523
- if (current->state_ != Node::DESTROYED) {
524
- v->VisitPointer(&current->object_);
525
- }
526
- }
527
- }
528
-
529
-
530
- void GlobalHandles::IterateStrongAndDependentRoots(ObjectVisitor* v) {
531
- for (Node* current = head_; current != NULL; current = current->next()) {
532
- if ((current->independent_ && current->state_ == Node::NORMAL) ||
533
- (!current->independent_ && current->state_ != Node::DESTROYED)) {
534
- v->VisitPointer(&current->object_);
592
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
593
+ if (it.node()->IsRetainer()) {
594
+ v->VisitPointer(it.node()->location());
535
595
  }
536
596
  }
537
597
  }
538
598
 
539
599
 
540
600
  void GlobalHandles::IterateAllRootsWithClassIds(ObjectVisitor* v) {
541
- for (Node* current = head_; current != NULL; current = current->next()) {
542
- if (current->class_id_ != v8::HeapProfiler::kPersistentHandleNoClassId &&
543
- current->CanBeRetainer()) {
544
- v->VisitEmbedderReference(&current->object_, current->class_id_);
601
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
602
+ if (it.node()->has_wrapper_class_id() && it.node()->IsRetainer()) {
603
+ v->VisitEmbedderReference(it.node()->location(),
604
+ it.node()->wrapper_class_id());
545
605
  }
546
606
  }
547
607
  }
548
608
 
549
609
 
550
- void GlobalHandles::TearDown() {
551
- // Reset all the lists.
552
- set_head(NULL);
553
- set_first_free(NULL);
554
- set_first_deallocated(NULL);
555
- pool_->Release();
556
- }
557
-
558
-
559
610
  void GlobalHandles::RecordStats(HeapStats* stats) {
560
611
  *stats->global_handle_count = 0;
561
612
  *stats->weak_global_handle_count = 0;
562
613
  *stats->pending_global_handle_count = 0;
563
614
  *stats->near_death_global_handle_count = 0;
564
- *stats->destroyed_global_handle_count = 0;
565
- for (Node* current = head_; current != NULL; current = current->next()) {
615
+ *stats->free_global_handle_count = 0;
616
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
566
617
  *stats->global_handle_count += 1;
567
- if (current->state_ == Node::WEAK) {
618
+ if (it.node()->state() == Node::WEAK) {
568
619
  *stats->weak_global_handle_count += 1;
569
- } else if (current->state_ == Node::PENDING) {
620
+ } else if (it.node()->state() == Node::PENDING) {
570
621
  *stats->pending_global_handle_count += 1;
571
- } else if (current->state_ == Node::NEAR_DEATH) {
622
+ } else if (it.node()->state() == Node::NEAR_DEATH) {
572
623
  *stats->near_death_global_handle_count += 1;
573
- } else if (current->state_ == Node::DESTROYED) {
574
- *stats->destroyed_global_handle_count += 1;
624
+ } else if (it.node()->state() == Node::FREE) {
625
+ *stats->free_global_handle_count += 1;
575
626
  }
576
627
  }
577
628
  }
@@ -585,12 +636,12 @@ void GlobalHandles::PrintStats() {
585
636
  int near_death = 0;
586
637
  int destroyed = 0;
587
638
 
588
- for (Node* current = head_; current != NULL; current = current->next()) {
639
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
589
640
  total++;
590
- if (current->state_ == Node::WEAK) weak++;
591
- if (current->state_ == Node::PENDING) pending++;
592
- if (current->state_ == Node::NEAR_DEATH) near_death++;
593
- if (current->state_ == Node::DESTROYED) destroyed++;
641
+ if (it.node()->state() == Node::WEAK) weak++;
642
+ if (it.node()->state() == Node::PENDING) pending++;
643
+ if (it.node()->state() == Node::NEAR_DEATH) near_death++;
644
+ if (it.node()->state() == Node::FREE) destroyed++;
594
645
  }
595
646
 
596
647
  PrintF("Global Handle Statistics:\n");
@@ -598,17 +649,17 @@ void GlobalHandles::PrintStats() {
598
649
  PrintF(" # weak = %d\n", weak);
599
650
  PrintF(" # pending = %d\n", pending);
600
651
  PrintF(" # near_death = %d\n", near_death);
601
- PrintF(" # destroyed = %d\n", destroyed);
652
+ PrintF(" # free = %d\n", destroyed);
602
653
  PrintF(" # total = %d\n", total);
603
654
  }
604
655
 
605
656
  void GlobalHandles::Print() {
606
657
  PrintF("Global handles:\n");
607
- for (Node* current = head_; current != NULL; current = current->next()) {
608
- PrintF(" handle %p to %p (weak=%d)\n",
609
- reinterpret_cast<void*>(current->handle().location()),
610
- reinterpret_cast<void*>(*current->handle()),
611
- current->state_ == Node::WEAK);
658
+ for (NodeIterator it(this); !it.done(); it.Advance()) {
659
+ PrintF(" handle %p to %p%s\n",
660
+ reinterpret_cast<void*>(it.node()->location()),
661
+ reinterpret_cast<void*>(it.node()->object()),
662
+ it.node()->IsWeak() ? " (weak)" : "");
612
663
  }
613
664
  }
614
665
 
@@ -621,7 +672,7 @@ void GlobalHandles::AddObjectGroup(Object*** handles,
621
672
  v8::RetainedObjectInfo* info) {
622
673
  #ifdef DEBUG
623
674
  for (size_t i = 0; i < length; ++i) {
624
- ASSERT(!Node::FromLocation(handles[i])->independent_);
675
+ ASSERT(!Node::FromLocation(handles[i])->is_independent());
625
676
  }
626
677
  #endif
627
678
  if (length == 0) {
@@ -636,9 +687,9 @@ void GlobalHandles::AddImplicitReferences(HeapObject** parent,
636
687
  Object*** children,
637
688
  size_t length) {
638
689
  #ifdef DEBUG
639
- ASSERT(!Node::FromLocation(BitCast<Object**>(parent))->independent_);
690
+ ASSERT(!Node::FromLocation(BitCast<Object**>(parent))->is_independent());
640
691
  for (size_t i = 0; i < length; ++i) {
641
- ASSERT(!Node::FromLocation(children[i])->independent_);
692
+ ASSERT(!Node::FromLocation(children[i])->is_independent());
642
693
  }
643
694
  #endif
644
695
  if (length == 0) return;
@@ -662,4 +713,9 @@ void GlobalHandles::RemoveImplicitRefGroups() {
662
713
  }
663
714
 
664
715
 
716
+ void GlobalHandles::TearDown() {
717
+ // TODO(1428): invoke weak callbacks.
718
+ }
719
+
720
+
665
721
  } } // namespace v8::internal