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.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
data/lib/libv8/v8/src/gdb-jit.h
CHANGED
@@ -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
|
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
|
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
|
-
|
48
|
-
|
49
|
-
object_
|
50
|
-
|
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
|
-
|
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
|
-
|
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
|
78
|
-
|
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_ =
|
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
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
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_ ==
|
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_ ==
|
180
|
+
ASSERT(state_ == FREE);
|
99
181
|
parameter_or_next_free_.next_free = value;
|
100
182
|
}
|
101
183
|
|
102
|
-
|
103
|
-
|
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
|
-
|
115
|
-
|
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
|
-
|
130
|
-
|
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
|
-
|
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
|
-
|
218
|
-
|
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
|
-
//
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
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
|
-
|
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
|
-
|
246
|
-
|
275
|
+
DISALLOW_COPY_AND_ASSIGN(Node);
|
276
|
+
};
|
277
|
+
|
247
278
|
|
279
|
+
class GlobalHandles::NodeBlock {
|
248
280
|
public:
|
249
|
-
|
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
|
-
|
254
|
-
|
255
|
-
|
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
|
-
|
263
|
-
|
264
|
-
|
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
|
-
|
269
|
-
|
270
|
-
|
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
|
-
|
276
|
-
|
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
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
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
|
-
|
306
|
-
|
307
|
-
|
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
|
-
|
387
|
+
first_block_(NULL),
|
388
|
+
first_used_block_(NULL),
|
316
389
|
first_free_(NULL),
|
317
|
-
|
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
|
-
|
326
|
-
|
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
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
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
|
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(
|
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)->
|
459
|
+
Node::FromLocation(location)->set_wrapper_class_id(class_id);
|
394
460
|
}
|
395
461
|
|
396
462
|
|
397
463
|
void GlobalHandles::IterateWeakRoots(ObjectVisitor* v) {
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
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::
|
411
|
-
|
412
|
-
|
413
|
-
|
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(¤t->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::
|
425
|
-
|
426
|
-
|
427
|
-
if (
|
428
|
-
|
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::
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
|
440
|
-
|
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::
|
448
|
-
for (
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
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
|
-
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
476
|
-
continue;
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
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
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
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
|
-
|
503
|
-
|
504
|
-
|
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
|
-
|
513
|
-
|
514
|
-
|
515
|
-
v->VisitPointer(¤t->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 (
|
523
|
-
if (
|
524
|
-
v->VisitPointer(
|
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(¤t->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 (
|
542
|
-
if (
|
543
|
-
|
544
|
-
|
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->
|
565
|
-
for (
|
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 (
|
618
|
+
if (it.node()->state() == Node::WEAK) {
|
568
619
|
*stats->weak_global_handle_count += 1;
|
569
|
-
} else if (
|
620
|
+
} else if (it.node()->state() == Node::PENDING) {
|
570
621
|
*stats->pending_global_handle_count += 1;
|
571
|
-
} else if (
|
622
|
+
} else if (it.node()->state() == Node::NEAR_DEATH) {
|
572
623
|
*stats->near_death_global_handle_count += 1;
|
573
|
-
} else if (
|
574
|
-
*stats->
|
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 (
|
639
|
+
for (NodeIterator it(this); !it.done(); it.Advance()) {
|
589
640
|
total++;
|
590
|
-
if (
|
591
|
-
if (
|
592
|
-
if (
|
593
|
-
if (
|
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(" #
|
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 (
|
608
|
-
PrintF(" handle %p to %p
|
609
|
-
reinterpret_cast<void*>(
|
610
|
-
reinterpret_cast<void*>(
|
611
|
-
|
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])->
|
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))->
|
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])->
|
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
|