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.
- 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
|