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/objects.h
CHANGED
@@ -48,41 +48,48 @@
|
|
48
48
|
// - Object
|
49
49
|
// - Smi (immediate small integer)
|
50
50
|
// - HeapObject (superclass for everything allocated in the heap)
|
51
|
-
// -
|
52
|
-
// -
|
53
|
-
//
|
54
|
-
//
|
55
|
-
//
|
56
|
-
// -
|
57
|
-
// -
|
58
|
-
//
|
59
|
-
//
|
60
|
-
//
|
61
|
-
//
|
62
|
-
//
|
63
|
-
// -
|
64
|
-
//
|
65
|
-
//
|
66
|
-
// -
|
67
|
-
// -
|
68
|
-
//
|
69
|
-
//
|
70
|
-
//
|
71
|
-
//
|
72
|
-
//
|
73
|
-
//
|
74
|
-
//
|
75
|
-
// -
|
76
|
-
// -
|
77
|
-
// -
|
78
|
-
//
|
79
|
-
// -
|
80
|
-
//
|
81
|
-
//
|
51
|
+
// - JSReceiver (suitable for property access)
|
52
|
+
// - JSObject
|
53
|
+
// - JSArray
|
54
|
+
// - JSWeakMap
|
55
|
+
// - JSRegExp
|
56
|
+
// - JSFunction
|
57
|
+
// - GlobalObject
|
58
|
+
// - JSGlobalObject
|
59
|
+
// - JSBuiltinsObject
|
60
|
+
// - JSGlobalProxy
|
61
|
+
// - JSValue
|
62
|
+
// - JSMessageObject
|
63
|
+
// - JSProxy
|
64
|
+
// - JSFunctionProxy
|
65
|
+
// - FixedArrayBase
|
66
|
+
// - ByteArray
|
67
|
+
// - FixedArray
|
68
|
+
// - DescriptorArray
|
69
|
+
// - HashTable
|
70
|
+
// - Dictionary
|
71
|
+
// - SymbolTable
|
72
|
+
// - CompilationCacheTable
|
73
|
+
// - CodeCacheHashTable
|
74
|
+
// - MapCache
|
75
|
+
// - Context
|
76
|
+
// - JSFunctionResultCache
|
77
|
+
// - SerializedScopeInfo
|
78
|
+
// - FixedDoubleArray
|
79
|
+
// - ExternalArray
|
80
|
+
// - ExternalPixelArray
|
81
|
+
// - ExternalByteArray
|
82
|
+
// - ExternalUnsignedByteArray
|
83
|
+
// - ExternalShortArray
|
84
|
+
// - ExternalUnsignedShortArray
|
85
|
+
// - ExternalIntArray
|
86
|
+
// - ExternalUnsignedIntArray
|
87
|
+
// - ExternalFloatArray
|
82
88
|
// - String
|
83
89
|
// - SeqString
|
84
90
|
// - SeqAsciiString
|
85
91
|
// - SeqTwoByteString
|
92
|
+
// - SlicedString
|
86
93
|
// - ConsString
|
87
94
|
// - ExternalString
|
88
95
|
// - ExternalAsciiString
|
@@ -91,7 +98,6 @@
|
|
91
98
|
// - Code
|
92
99
|
// - Map
|
93
100
|
// - Oddball
|
94
|
-
// - JSProxy
|
95
101
|
// - Foreign
|
96
102
|
// - SharedFunctionInfo
|
97
103
|
// - Struct
|
@@ -134,7 +140,6 @@ namespace internal {
|
|
134
140
|
// They are used both in property dictionaries and instance descriptors.
|
135
141
|
class PropertyDetails BASE_EMBEDDED {
|
136
142
|
public:
|
137
|
-
|
138
143
|
PropertyDetails(PropertyAttributes attributes,
|
139
144
|
PropertyType type,
|
140
145
|
int index = 0) {
|
@@ -214,6 +219,7 @@ class PropertyDetails BASE_EMBEDDED {
|
|
214
219
|
class StorageField: public BitField<uint32_t, 8, 32-8> {};
|
215
220
|
|
216
221
|
static const int kInitialIndex = 1;
|
222
|
+
|
217
223
|
private:
|
218
224
|
uint32_t value_;
|
219
225
|
};
|
@@ -278,6 +284,7 @@ static const int kVariableSizeSentinel = 0;
|
|
278
284
|
V(ASCII_STRING_TYPE) \
|
279
285
|
V(CONS_STRING_TYPE) \
|
280
286
|
V(CONS_ASCII_STRING_TYPE) \
|
287
|
+
V(SLICED_STRING_TYPE) \
|
281
288
|
V(EXTERNAL_STRING_TYPE) \
|
282
289
|
V(EXTERNAL_STRING_WITH_ASCII_DATA_TYPE) \
|
283
290
|
V(EXTERNAL_ASCII_STRING_TYPE) \
|
@@ -289,7 +296,6 @@ static const int kVariableSizeSentinel = 0;
|
|
289
296
|
V(JS_GLOBAL_PROPERTY_CELL_TYPE) \
|
290
297
|
\
|
291
298
|
V(HEAP_NUMBER_TYPE) \
|
292
|
-
V(JS_PROXY_TYPE) \
|
293
299
|
V(FOREIGN_TYPE) \
|
294
300
|
V(BYTE_ARRAY_TYPE) \
|
295
301
|
/* Note: the order of these external array */ \
|
@@ -315,8 +321,10 @@ static const int kVariableSizeSentinel = 0;
|
|
315
321
|
V(TYPE_SWITCH_INFO_TYPE) \
|
316
322
|
V(SCRIPT_TYPE) \
|
317
323
|
V(CODE_CACHE_TYPE) \
|
324
|
+
V(POLYMORPHIC_CODE_CACHE_TYPE) \
|
318
325
|
\
|
319
326
|
V(FIXED_ARRAY_TYPE) \
|
327
|
+
V(FIXED_DOUBLE_ARRAY_TYPE) \
|
320
328
|
V(SHARED_FUNCTION_INFO_TYPE) \
|
321
329
|
\
|
322
330
|
V(JS_MESSAGE_OBJECT_TYPE) \
|
@@ -328,9 +336,12 @@ static const int kVariableSizeSentinel = 0;
|
|
328
336
|
V(JS_BUILTINS_OBJECT_TYPE) \
|
329
337
|
V(JS_GLOBAL_PROXY_TYPE) \
|
330
338
|
V(JS_ARRAY_TYPE) \
|
339
|
+
V(JS_PROXY_TYPE) \
|
340
|
+
V(JS_WEAK_MAP_TYPE) \
|
331
341
|
V(JS_REGEXP_TYPE) \
|
332
342
|
\
|
333
343
|
V(JS_FUNCTION_TYPE) \
|
344
|
+
V(JS_FUNCTION_PROXY_TYPE) \
|
334
345
|
|
335
346
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
336
347
|
#define INSTANCE_TYPE_LIST_DEBUGGER(V) \
|
@@ -392,6 +403,14 @@ static const int kVariableSizeSentinel = 0;
|
|
392
403
|
ConsString::kSize, \
|
393
404
|
cons_ascii_string, \
|
394
405
|
ConsAsciiString) \
|
406
|
+
V(SLICED_STRING_TYPE, \
|
407
|
+
SlicedString::kSize, \
|
408
|
+
sliced_string, \
|
409
|
+
SlicedString) \
|
410
|
+
V(SLICED_ASCII_STRING_TYPE, \
|
411
|
+
SlicedString::kSize, \
|
412
|
+
sliced_ascii_string, \
|
413
|
+
SlicedAsciiString) \
|
395
414
|
V(EXTERNAL_STRING_TYPE, \
|
396
415
|
ExternalTwoByteString::kSize, \
|
397
416
|
external_string, \
|
@@ -424,7 +443,8 @@ static const int kVariableSizeSentinel = 0;
|
|
424
443
|
V(SIGNATURE_INFO, SignatureInfo, signature_info) \
|
425
444
|
V(TYPE_SWITCH_INFO, TypeSwitchInfo, type_switch_info) \
|
426
445
|
V(SCRIPT, Script, script) \
|
427
|
-
V(CODE_CACHE, CodeCache, code_cache)
|
446
|
+
V(CODE_CACHE, CodeCache, code_cache) \
|
447
|
+
V(POLYMORPHIC_CODE_CACHE, PolymorphicCodeCache, polymorphic_code_cache)
|
428
448
|
|
429
449
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
430
450
|
#define STRUCT_LIST_DEBUGGER(V) \
|
@@ -464,9 +484,22 @@ const uint32_t kStringRepresentationMask = 0x03;
|
|
464
484
|
enum StringRepresentationTag {
|
465
485
|
kSeqStringTag = 0x0,
|
466
486
|
kConsStringTag = 0x1,
|
467
|
-
kExternalStringTag = 0x2
|
487
|
+
kExternalStringTag = 0x2,
|
488
|
+
kSlicedStringTag = 0x3
|
468
489
|
};
|
469
|
-
const uint32_t
|
490
|
+
const uint32_t kIsIndirectStringMask = 0x1;
|
491
|
+
const uint32_t kIsIndirectStringTag = 0x1;
|
492
|
+
STATIC_ASSERT((kSeqStringTag & kIsIndirectStringMask) == 0);
|
493
|
+
STATIC_ASSERT((kExternalStringTag & kIsIndirectStringMask) == 0);
|
494
|
+
STATIC_ASSERT(
|
495
|
+
(kConsStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
|
496
|
+
STATIC_ASSERT(
|
497
|
+
(kSlicedStringTag & kIsIndirectStringMask) == kIsIndirectStringTag);
|
498
|
+
|
499
|
+
// Use this mask to distinguish between cons and slice only after making
|
500
|
+
// sure that the string is one of the two (an indirect string).
|
501
|
+
const uint32_t kSlicedNotConsMask = kSlicedStringTag & ~kConsStringTag;
|
502
|
+
STATIC_ASSERT(IS_POWER_OF_TWO(kSlicedNotConsMask) && kSlicedNotConsMask != 0);
|
470
503
|
|
471
504
|
// If bit 7 is clear, then bit 3 indicates whether this two-byte
|
472
505
|
// string actually contains ascii data.
|
@@ -501,6 +534,8 @@ enum InstanceType {
|
|
501
534
|
ASCII_STRING_TYPE = kAsciiStringTag | kSeqStringTag,
|
502
535
|
CONS_STRING_TYPE = kTwoByteStringTag | kConsStringTag,
|
503
536
|
CONS_ASCII_STRING_TYPE = kAsciiStringTag | kConsStringTag,
|
537
|
+
SLICED_STRING_TYPE = kTwoByteStringTag | kSlicedStringTag,
|
538
|
+
SLICED_ASCII_STRING_TYPE = kAsciiStringTag | kSlicedStringTag,
|
504
539
|
EXTERNAL_STRING_TYPE = kTwoByteStringTag | kExternalStringTag,
|
505
540
|
EXTERNAL_STRING_WITH_ASCII_DATA_TYPE =
|
506
541
|
kTwoByteStringTag | kExternalStringTag | kAsciiDataHintTag,
|
@@ -518,7 +553,6 @@ enum InstanceType {
|
|
518
553
|
// objects.
|
519
554
|
HEAP_NUMBER_TYPE,
|
520
555
|
FOREIGN_TYPE,
|
521
|
-
JS_PROXY_TYPE,
|
522
556
|
BYTE_ARRAY_TYPE,
|
523
557
|
EXTERNAL_BYTE_ARRAY_TYPE, // FIRST_EXTERNAL_ARRAY_TYPE
|
524
558
|
EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE,
|
@@ -529,6 +563,7 @@ enum InstanceType {
|
|
529
563
|
EXTERNAL_FLOAT_ARRAY_TYPE,
|
530
564
|
EXTERNAL_DOUBLE_ARRAY_TYPE,
|
531
565
|
EXTERNAL_PIXEL_ARRAY_TYPE, // LAST_EXTERNAL_ARRAY_TYPE
|
566
|
+
FIXED_DOUBLE_ARRAY_TYPE,
|
532
567
|
FILLER_TYPE, // LAST_DATA_TYPE
|
533
568
|
|
534
569
|
// Structs.
|
@@ -542,6 +577,7 @@ enum InstanceType {
|
|
542
577
|
TYPE_SWITCH_INFO_TYPE,
|
543
578
|
SCRIPT_TYPE,
|
544
579
|
CODE_CACHE_TYPE,
|
580
|
+
POLYMORPHIC_CODE_CACHE_TYPE,
|
545
581
|
// The following two instance types are only used when ENABLE_DEBUGGER_SUPPORT
|
546
582
|
// is defined. However as include/v8.h contain some of the instance type
|
547
583
|
// constants always having them avoids them getting different numbers
|
@@ -554,21 +590,24 @@ enum InstanceType {
|
|
554
590
|
|
555
591
|
JS_MESSAGE_OBJECT_TYPE,
|
556
592
|
|
557
|
-
JS_VALUE_TYPE, //
|
593
|
+
JS_VALUE_TYPE, // FIRST_NON_CALLABLE_OBJECT_TYPE, FIRST_JS_RECEIVER_TYPE
|
558
594
|
JS_OBJECT_TYPE,
|
559
595
|
JS_CONTEXT_EXTENSION_OBJECT_TYPE,
|
560
596
|
JS_GLOBAL_OBJECT_TYPE,
|
561
597
|
JS_BUILTINS_OBJECT_TYPE,
|
562
598
|
JS_GLOBAL_PROXY_TYPE,
|
563
599
|
JS_ARRAY_TYPE,
|
600
|
+
JS_PROXY_TYPE,
|
601
|
+
JS_WEAK_MAP_TYPE,
|
564
602
|
|
565
|
-
JS_REGEXP_TYPE, //
|
603
|
+
JS_REGEXP_TYPE, // LAST_NONCALLABLE_SPEC_OBJECT_TYPE
|
566
604
|
|
567
|
-
JS_FUNCTION_TYPE,
|
605
|
+
JS_FUNCTION_TYPE, // FIRST_CALLABLE_SPEC_OBJECT_TYPE
|
606
|
+
JS_FUNCTION_PROXY_TYPE, // LAST_CALLABLE_SPEC_OBJECT_TYPE
|
568
607
|
|
569
608
|
// Pseudo-types
|
570
609
|
FIRST_TYPE = 0x0,
|
571
|
-
LAST_TYPE =
|
610
|
+
LAST_TYPE = JS_FUNCTION_PROXY_TYPE,
|
572
611
|
INVALID_TYPE = FIRST_TYPE - 1,
|
573
612
|
FIRST_NONSTRING_TYPE = MAP_TYPE,
|
574
613
|
// Boundaries for testing for an external array.
|
@@ -576,14 +615,22 @@ enum InstanceType {
|
|
576
615
|
LAST_EXTERNAL_ARRAY_TYPE = EXTERNAL_PIXEL_ARRAY_TYPE,
|
577
616
|
// Boundary for promotion to old data space/old pointer space.
|
578
617
|
LAST_DATA_TYPE = FILLER_TYPE,
|
579
|
-
//
|
580
|
-
//
|
581
|
-
//
|
582
|
-
|
583
|
-
|
584
|
-
|
585
|
-
|
586
|
-
|
618
|
+
// Boundary for objects represented as JSReceiver (i.e. JSObject or JSProxy).
|
619
|
+
// Note that there is no range for JSObject or JSProxy, since their subtypes
|
620
|
+
// are not continuous in this enum! The enum ranges instead reflect the
|
621
|
+
// external class names, where proxies are treated as either ordinary objects,
|
622
|
+
// or functions.
|
623
|
+
FIRST_JS_RECEIVER_TYPE = JS_VALUE_TYPE,
|
624
|
+
LAST_JS_RECEIVER_TYPE = LAST_TYPE,
|
625
|
+
// Boundaries for testing the types for which typeof is "object".
|
626
|
+
FIRST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_VALUE_TYPE,
|
627
|
+
LAST_NONCALLABLE_SPEC_OBJECT_TYPE = JS_REGEXP_TYPE,
|
628
|
+
// Boundaries for testing the types for which typeof is "function".
|
629
|
+
FIRST_CALLABLE_SPEC_OBJECT_TYPE = JS_FUNCTION_TYPE,
|
630
|
+
LAST_CALLABLE_SPEC_OBJECT_TYPE = JS_FUNCTION_PROXY_TYPE,
|
631
|
+
// Boundaries for testing whether the type is a JavaScript object.
|
632
|
+
FIRST_SPEC_OBJECT_TYPE = FIRST_NONCALLABLE_SPEC_OBJECT_TYPE,
|
633
|
+
LAST_SPEC_OBJECT_TYPE = LAST_CALLABLE_SPEC_OBJECT_TYPE
|
587
634
|
};
|
588
635
|
|
589
636
|
static const int kExternalArrayTypeCount = LAST_EXTERNAL_ARRAY_TYPE -
|
@@ -614,8 +661,11 @@ enum CompareResult {
|
|
614
661
|
WriteBarrierMode mode = UPDATE_WRITE_BARRIER); \
|
615
662
|
|
616
663
|
|
617
|
-
class
|
664
|
+
class DictionaryElementsAccessor;
|
665
|
+
class ElementsAccessor;
|
666
|
+
class FixedArrayBase;
|
618
667
|
class ObjectVisitor;
|
668
|
+
class StringStream;
|
619
669
|
|
620
670
|
struct ValueInfo : public Malloced {
|
621
671
|
ValueInfo() : type(FIRST_TYPE), ptr(NULL), str(NULL), number(0) { }
|
@@ -693,6 +743,7 @@ class MaybeObject BASE_EMBEDDED {
|
|
693
743
|
V(SeqString) \
|
694
744
|
V(ExternalString) \
|
695
745
|
V(ConsString) \
|
746
|
+
V(SlicedString) \
|
696
747
|
V(ExternalTwoByteString) \
|
697
748
|
V(ExternalAsciiString) \
|
698
749
|
V(SeqTwoByteString) \
|
@@ -709,6 +760,7 @@ class MaybeObject BASE_EMBEDDED {
|
|
709
760
|
V(ExternalDoubleArray) \
|
710
761
|
V(ExternalPixelArray) \
|
711
762
|
V(ByteArray) \
|
763
|
+
V(JSReceiver) \
|
712
764
|
V(JSObject) \
|
713
765
|
V(JSContextExtensionObject) \
|
714
766
|
V(Map) \
|
@@ -716,9 +768,10 @@ class MaybeObject BASE_EMBEDDED {
|
|
716
768
|
V(DeoptimizationInputData) \
|
717
769
|
V(DeoptimizationOutputData) \
|
718
770
|
V(FixedArray) \
|
771
|
+
V(FixedDoubleArray) \
|
719
772
|
V(Context) \
|
720
|
-
V(CatchContext) \
|
721
773
|
V(GlobalContext) \
|
774
|
+
V(SerializedScopeInfo) \
|
722
775
|
V(JSFunction) \
|
723
776
|
V(Code) \
|
724
777
|
V(Oddball) \
|
@@ -730,6 +783,8 @@ class MaybeObject BASE_EMBEDDED {
|
|
730
783
|
V(Boolean) \
|
731
784
|
V(JSArray) \
|
732
785
|
V(JSProxy) \
|
786
|
+
V(JSFunctionProxy) \
|
787
|
+
V(JSWeakMap) \
|
733
788
|
V(JSRegExp) \
|
734
789
|
V(HashTable) \
|
735
790
|
V(Dictionary) \
|
@@ -738,6 +793,7 @@ class MaybeObject BASE_EMBEDDED {
|
|
738
793
|
V(NormalizedMapCache) \
|
739
794
|
V(CompilationCacheTable) \
|
740
795
|
V(CodeCacheHashTable) \
|
796
|
+
V(PolymorphicCodeCacheHashTable) \
|
741
797
|
V(MapCache) \
|
742
798
|
V(Primitive) \
|
743
799
|
V(GlobalObject) \
|
@@ -771,6 +827,8 @@ class Object : public MaybeObject {
|
|
771
827
|
STRUCT_LIST(DECLARE_STRUCT_PREDICATE)
|
772
828
|
#undef DECLARE_STRUCT_PREDICATE
|
773
829
|
|
830
|
+
INLINE(bool IsSpecObject());
|
831
|
+
|
774
832
|
// Oddball testing.
|
775
833
|
INLINE(bool IsUndefined());
|
776
834
|
INLINE(bool IsNull());
|
@@ -782,6 +840,10 @@ class Object : public MaybeObject {
|
|
782
840
|
// Extract the number.
|
783
841
|
inline double Number();
|
784
842
|
|
843
|
+
// Returns true if the object is of the correct type to be used as a
|
844
|
+
// implementation of a JSObject's elements.
|
845
|
+
inline bool HasValidElements();
|
846
|
+
|
785
847
|
inline bool HasSpecificClassOf(String* name);
|
786
848
|
|
787
849
|
MUST_USE_RESULT MaybeObject* ToObject(); // ECMA-262 9.9.
|
@@ -1332,11 +1394,9 @@ class HeapNumber: public HeapObject {
|
|
1332
1394
|
};
|
1333
1395
|
|
1334
1396
|
|
1335
|
-
//
|
1336
|
-
//
|
1337
|
-
|
1338
|
-
// caching.
|
1339
|
-
class JSObject: public HeapObject {
|
1397
|
+
// JSReceiver includes types on which properties can be defined, i.e.,
|
1398
|
+
// JSObject and JSProxy.
|
1399
|
+
class JSReceiver: public HeapObject {
|
1340
1400
|
public:
|
1341
1401
|
enum DeleteMode {
|
1342
1402
|
NORMAL_DELETION,
|
@@ -1344,11 +1404,77 @@ class JSObject: public HeapObject {
|
|
1344
1404
|
FORCE_DELETION
|
1345
1405
|
};
|
1346
1406
|
|
1407
|
+
// Casting.
|
1408
|
+
static inline JSReceiver* cast(Object* obj);
|
1409
|
+
|
1410
|
+
// Can cause GC.
|
1411
|
+
MUST_USE_RESULT MaybeObject* SetProperty(String* key,
|
1412
|
+
Object* value,
|
1413
|
+
PropertyAttributes attributes,
|
1414
|
+
StrictModeFlag strict_mode);
|
1415
|
+
MUST_USE_RESULT MaybeObject* SetProperty(LookupResult* result,
|
1416
|
+
String* key,
|
1417
|
+
Object* value,
|
1418
|
+
PropertyAttributes attributes,
|
1419
|
+
StrictModeFlag strict_mode);
|
1420
|
+
|
1421
|
+
MUST_USE_RESULT MaybeObject* DeleteProperty(String* name, DeleteMode mode);
|
1422
|
+
|
1423
|
+
// Returns the class name ([[Class]] property in the specification).
|
1424
|
+
String* class_name();
|
1425
|
+
|
1426
|
+
// Returns the constructor name (the name (possibly, inferred name) of the
|
1427
|
+
// function that was used to instantiate the object).
|
1428
|
+
String* constructor_name();
|
1429
|
+
|
1430
|
+
inline PropertyAttributes GetPropertyAttribute(String* name);
|
1431
|
+
PropertyAttributes GetPropertyAttributeWithReceiver(JSReceiver* receiver,
|
1432
|
+
String* name);
|
1433
|
+
PropertyAttributes GetLocalPropertyAttribute(String* name);
|
1434
|
+
|
1435
|
+
// Can cause a GC.
|
1436
|
+
inline bool HasProperty(String* name);
|
1437
|
+
inline bool HasLocalProperty(String* name);
|
1438
|
+
|
1439
|
+
// Return the object's prototype (might be Heap::null_value()).
|
1440
|
+
inline Object* GetPrototype();
|
1441
|
+
|
1442
|
+
// Set the object's prototype (only JSReceiver and null are allowed).
|
1443
|
+
MUST_USE_RESULT MaybeObject* SetPrototype(Object* value,
|
1444
|
+
bool skip_hidden_prototypes);
|
1445
|
+
|
1446
|
+
// Lookup a property. If found, the result is valid and has
|
1447
|
+
// detailed information.
|
1448
|
+
void LocalLookup(String* name, LookupResult* result);
|
1449
|
+
void Lookup(String* name, LookupResult* result);
|
1450
|
+
|
1451
|
+
private:
|
1452
|
+
PropertyAttributes GetPropertyAttribute(JSReceiver* receiver,
|
1453
|
+
LookupResult* result,
|
1454
|
+
String* name,
|
1455
|
+
bool continue_search);
|
1456
|
+
|
1457
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(JSReceiver);
|
1458
|
+
};
|
1459
|
+
|
1460
|
+
// The JSObject describes real heap allocated JavaScript objects with
|
1461
|
+
// properties.
|
1462
|
+
// Note that the map of JSObject changes during execution to enable inline
|
1463
|
+
// caching.
|
1464
|
+
class JSObject: public JSReceiver {
|
1465
|
+
public:
|
1347
1466
|
enum ElementsKind {
|
1348
|
-
// The
|
1467
|
+
// The "fast" kind for tagged values. Must be first to make it possible
|
1468
|
+
// to efficiently check maps if they have fast elements.
|
1349
1469
|
FAST_ELEMENTS,
|
1350
|
-
|
1470
|
+
|
1471
|
+
// The "fast" kind for unwrapped, non-tagged double values.
|
1472
|
+
FAST_DOUBLE_ELEMENTS,
|
1473
|
+
|
1474
|
+
// The "slow" kind.
|
1351
1475
|
DICTIONARY_ELEMENTS,
|
1476
|
+
NON_STRICT_ARGUMENTS_ELEMENTS,
|
1477
|
+
// The "fast" kind for external arrays
|
1352
1478
|
EXTERNAL_BYTE_ELEMENTS,
|
1353
1479
|
EXTERNAL_UNSIGNED_BYTE_ELEMENTS,
|
1354
1480
|
EXTERNAL_SHORT_ELEMENTS,
|
@@ -1357,9 +1483,18 @@ class JSObject: public HeapObject {
|
|
1357
1483
|
EXTERNAL_UNSIGNED_INT_ELEMENTS,
|
1358
1484
|
EXTERNAL_FLOAT_ELEMENTS,
|
1359
1485
|
EXTERNAL_DOUBLE_ELEMENTS,
|
1360
|
-
EXTERNAL_PIXEL_ELEMENTS
|
1486
|
+
EXTERNAL_PIXEL_ELEMENTS,
|
1487
|
+
|
1488
|
+
// Derived constants from ElementsKind
|
1489
|
+
FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_BYTE_ELEMENTS,
|
1490
|
+
LAST_EXTERNAL_ARRAY_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS,
|
1491
|
+
FIRST_ELEMENTS_KIND = FAST_ELEMENTS,
|
1492
|
+
LAST_ELEMENTS_KIND = EXTERNAL_PIXEL_ELEMENTS
|
1361
1493
|
};
|
1362
1494
|
|
1495
|
+
static const int kElementsKindCount =
|
1496
|
+
LAST_ELEMENTS_KIND - FIRST_ELEMENTS_KIND + 1;
|
1497
|
+
|
1363
1498
|
// [properties]: Backing storage for properties.
|
1364
1499
|
// properties is a FixedArray in the fast case and a Dictionary in the
|
1365
1500
|
// slow case.
|
@@ -1376,18 +1511,23 @@ class JSObject: public HeapObject {
|
|
1376
1511
|
//
|
1377
1512
|
// In the fast mode elements is a FixedArray and so each element can
|
1378
1513
|
// be quickly accessed. This fact is used in the generated code. The
|
1379
|
-
// elements array can have one of
|
1380
|
-
// fixed_array_map or
|
1381
|
-
// arrays). In the latter case
|
1382
|
-
//
|
1383
|
-
//
|
1514
|
+
// elements array can have one of three maps in this mode:
|
1515
|
+
// fixed_array_map, non_strict_arguments_elements_map or
|
1516
|
+
// fixed_cow_array_map (for copy-on-write arrays). In the latter case
|
1517
|
+
// the elements array may be shared by a few objects and so before
|
1518
|
+
// writing to any element the array must be copied. Use
|
1519
|
+
// EnsureWritableFastElements in this case.
|
1384
1520
|
//
|
1385
|
-
// In the slow mode elements is either a NumberDictionary
|
1386
|
-
|
1521
|
+
// In the slow mode the elements is either a NumberDictionary, an
|
1522
|
+
// ExternalArray, or a FixedArray parameter map for a (non-strict)
|
1523
|
+
// arguments object.
|
1524
|
+
DECL_ACCESSORS(elements, FixedArrayBase)
|
1387
1525
|
inline void initialize_elements();
|
1388
1526
|
MUST_USE_RESULT inline MaybeObject* ResetElements();
|
1389
1527
|
inline ElementsKind GetElementsKind();
|
1528
|
+
inline ElementsAccessor* GetElementsAccessor();
|
1390
1529
|
inline bool HasFastElements();
|
1530
|
+
inline bool HasFastDoubleElements();
|
1391
1531
|
inline bool HasDictionaryElements();
|
1392
1532
|
inline bool HasExternalPixelElements();
|
1393
1533
|
inline bool HasExternalArrayElements();
|
@@ -1399,9 +1539,12 @@ class JSObject: public HeapObject {
|
|
1399
1539
|
inline bool HasExternalUnsignedIntElements();
|
1400
1540
|
inline bool HasExternalFloatElements();
|
1401
1541
|
inline bool HasExternalDoubleElements();
|
1542
|
+
bool HasFastArgumentsElements();
|
1543
|
+
bool HasDictionaryArgumentsElements();
|
1402
1544
|
inline bool AllowsSetElementsLength();
|
1403
1545
|
inline NumberDictionary* element_dictionary(); // Gets slow elements.
|
1404
|
-
|
1546
|
+
|
1547
|
+
// Requires: HasFastElements().
|
1405
1548
|
MUST_USE_RESULT inline MaybeObject* EnsureWritableFastElements();
|
1406
1549
|
|
1407
1550
|
// Collects elements starting at index 0.
|
@@ -1412,11 +1555,7 @@ class JSObject: public HeapObject {
|
|
1412
1555
|
// a dictionary, and it will stay a dictionary.
|
1413
1556
|
MUST_USE_RESULT MaybeObject* PrepareSlowElementsForSort(uint32_t limit);
|
1414
1557
|
|
1415
|
-
MUST_USE_RESULT MaybeObject*
|
1416
|
-
Object* value,
|
1417
|
-
PropertyAttributes attributes,
|
1418
|
-
StrictModeFlag strict_mode);
|
1419
|
-
MUST_USE_RESULT MaybeObject* SetProperty(LookupResult* result,
|
1558
|
+
MUST_USE_RESULT MaybeObject* SetPropertyForResult(LookupResult* result,
|
1420
1559
|
String* key,
|
1421
1560
|
Object* value,
|
1422
1561
|
PropertyAttributes attributes,
|
@@ -1425,11 +1564,14 @@ class JSObject: public HeapObject {
|
|
1425
1564
|
LookupResult* result,
|
1426
1565
|
String* name,
|
1427
1566
|
Object* value,
|
1428
|
-
bool check_prototype
|
1429
|
-
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1567
|
+
bool check_prototype,
|
1568
|
+
StrictModeFlag strict_mode);
|
1569
|
+
MUST_USE_RESULT MaybeObject* SetPropertyWithCallback(
|
1570
|
+
Object* structure,
|
1571
|
+
String* name,
|
1572
|
+
Object* value,
|
1573
|
+
JSObject* holder,
|
1574
|
+
StrictModeFlag strict_mode);
|
1433
1575
|
MUST_USE_RESULT MaybeObject* SetPropertyWithDefinedSetter(JSFunction* setter,
|
1434
1576
|
Object* value);
|
1435
1577
|
MUST_USE_RESULT MaybeObject* SetPropertyWithInterceptor(
|
@@ -1465,21 +1607,22 @@ class JSObject: public HeapObject {
|
|
1465
1607
|
MUST_USE_RESULT MaybeObject* DeleteNormalizedProperty(String* name,
|
1466
1608
|
DeleteMode mode);
|
1467
1609
|
|
1468
|
-
// Returns the class name ([[Class]] property in the specification).
|
1469
|
-
String* class_name();
|
1470
|
-
|
1471
|
-
// Returns the constructor name (the name (possibly, inferred name) of the
|
1472
|
-
// function that was used to instantiate the object).
|
1473
|
-
String* constructor_name();
|
1474
|
-
|
1475
1610
|
// Retrieve interceptors.
|
1476
1611
|
InterceptorInfo* GetNamedInterceptor();
|
1477
1612
|
InterceptorInfo* GetIndexedInterceptor();
|
1478
1613
|
|
1479
|
-
|
1480
|
-
PropertyAttributes
|
1481
|
-
|
1482
|
-
|
1614
|
+
// Used from JSReceiver.
|
1615
|
+
PropertyAttributes GetPropertyAttributePostInterceptor(JSObject* receiver,
|
1616
|
+
String* name,
|
1617
|
+
bool continue_search);
|
1618
|
+
PropertyAttributes GetPropertyAttributeWithInterceptor(JSObject* receiver,
|
1619
|
+
String* name,
|
1620
|
+
bool continue_search);
|
1621
|
+
PropertyAttributes GetPropertyAttributeWithFailedAccessCheck(
|
1622
|
+
Object* receiver,
|
1623
|
+
LookupResult* result,
|
1624
|
+
String* name,
|
1625
|
+
bool continue_search);
|
1483
1626
|
|
1484
1627
|
MUST_USE_RESULT MaybeObject* DefineAccessor(String* name,
|
1485
1628
|
bool is_getter,
|
@@ -1496,14 +1639,14 @@ class JSObject: public HeapObject {
|
|
1496
1639
|
String* name,
|
1497
1640
|
PropertyAttributes* attributes);
|
1498
1641
|
MaybeObject* GetPropertyWithInterceptor(
|
1499
|
-
|
1642
|
+
JSReceiver* receiver,
|
1500
1643
|
String* name,
|
1501
1644
|
PropertyAttributes* attributes);
|
1502
1645
|
MaybeObject* GetPropertyPostInterceptor(
|
1503
|
-
|
1646
|
+
JSReceiver* receiver,
|
1504
1647
|
String* name,
|
1505
1648
|
PropertyAttributes* attributes);
|
1506
|
-
MaybeObject* GetLocalPropertyPostInterceptor(
|
1649
|
+
MaybeObject* GetLocalPropertyPostInterceptor(JSReceiver* receiver,
|
1507
1650
|
String* name,
|
1508
1651
|
PropertyAttributes* attributes);
|
1509
1652
|
|
@@ -1511,15 +1654,6 @@ class JSObject: public HeapObject {
|
|
1511
1654
|
// been modified since it was created. May give false positives.
|
1512
1655
|
bool IsDirty();
|
1513
1656
|
|
1514
|
-
bool HasProperty(String* name) {
|
1515
|
-
return GetPropertyAttribute(name) != ABSENT;
|
1516
|
-
}
|
1517
|
-
|
1518
|
-
// Can cause a GC if it hits an interceptor.
|
1519
|
-
bool HasLocalProperty(String* name) {
|
1520
|
-
return GetLocalPropertyAttribute(name) != ABSENT;
|
1521
|
-
}
|
1522
|
-
|
1523
1657
|
// If the receiver is a JSGlobalProxy this method will return its prototype,
|
1524
1658
|
// otherwise the result is the receiver itself.
|
1525
1659
|
inline Object* BypassGlobalProxy();
|
@@ -1542,6 +1676,23 @@ class JSObject: public HeapObject {
|
|
1542
1676
|
MUST_USE_RESULT inline MaybeObject* SetHiddenPropertiesObject(
|
1543
1677
|
Object* hidden_obj);
|
1544
1678
|
|
1679
|
+
// Indicates whether the hidden properties object should be created.
|
1680
|
+
enum HiddenPropertiesFlag { ALLOW_CREATION, OMIT_CREATION };
|
1681
|
+
|
1682
|
+
// Retrieves the hidden properties object.
|
1683
|
+
//
|
1684
|
+
// The undefined value might be returned in case no hidden properties object
|
1685
|
+
// is present and creation was omitted.
|
1686
|
+
inline bool HasHiddenProperties();
|
1687
|
+
MUST_USE_RESULT MaybeObject* GetHiddenProperties(HiddenPropertiesFlag flag);
|
1688
|
+
|
1689
|
+
// Retrieves a permanent object identity hash code.
|
1690
|
+
//
|
1691
|
+
// The identity hash is stored as a hidden property. The undefined value might
|
1692
|
+
// be returned in case no hidden properties object is present and creation was
|
1693
|
+
// omitted.
|
1694
|
+
MUST_USE_RESULT MaybeObject* GetIdentityHash(HiddenPropertiesFlag flag);
|
1695
|
+
|
1545
1696
|
MUST_USE_RESULT MaybeObject* DeleteProperty(String* name, DeleteMode mode);
|
1546
1697
|
MUST_USE_RESULT MaybeObject* DeleteElement(uint32_t index, DeleteMode mode);
|
1547
1698
|
|
@@ -1556,17 +1707,13 @@ class JSObject: public HeapObject {
|
|
1556
1707
|
// storage would. In that case the JSObject should have fast
|
1557
1708
|
// elements.
|
1558
1709
|
bool ShouldConvertToFastElements();
|
1559
|
-
|
1560
|
-
//
|
1561
|
-
|
1562
|
-
|
1563
|
-
// Set the object's prototype (only JSObject and null are allowed).
|
1564
|
-
MUST_USE_RESULT MaybeObject* SetPrototype(Object* value,
|
1565
|
-
bool skip_hidden_prototypes);
|
1710
|
+
// Returns true if the elements of JSObject contains only values that can be
|
1711
|
+
// represented in a FixedDoubleArray.
|
1712
|
+
bool CanConvertToFastDoubleElements();
|
1566
1713
|
|
1567
1714
|
// Tells whether the index'th element is present.
|
1568
1715
|
inline bool HasElement(uint32_t index);
|
1569
|
-
bool HasElementWithReceiver(
|
1716
|
+
bool HasElementWithReceiver(JSReceiver* receiver, uint32_t index);
|
1570
1717
|
|
1571
1718
|
// Computes the new capacity when expanding the elements of a JSObject.
|
1572
1719
|
static int NewElementsCapacity(int old_capacity) {
|
@@ -1594,33 +1741,43 @@ class JSObject: public HeapObject {
|
|
1594
1741
|
|
1595
1742
|
LocalElementType HasLocalElement(uint32_t index);
|
1596
1743
|
|
1597
|
-
bool HasElementWithInterceptor(
|
1598
|
-
bool HasElementPostInterceptor(
|
1744
|
+
bool HasElementWithInterceptor(JSReceiver* receiver, uint32_t index);
|
1745
|
+
bool HasElementPostInterceptor(JSReceiver* receiver, uint32_t index);
|
1599
1746
|
|
1600
1747
|
MUST_USE_RESULT MaybeObject* SetFastElement(uint32_t index,
|
1601
1748
|
Object* value,
|
1602
1749
|
StrictModeFlag strict_mode,
|
1603
|
-
bool check_prototype
|
1750
|
+
bool check_prototype);
|
1751
|
+
MUST_USE_RESULT MaybeObject* SetDictionaryElement(uint32_t index,
|
1752
|
+
Object* value,
|
1753
|
+
StrictModeFlag strict_mode,
|
1754
|
+
bool check_prototype);
|
1755
|
+
|
1756
|
+
MUST_USE_RESULT MaybeObject* SetFastDoubleElement(
|
1757
|
+
uint32_t index,
|
1758
|
+
Object* value,
|
1759
|
+
StrictModeFlag strict_mode,
|
1760
|
+
bool check_prototype = true);
|
1604
1761
|
|
1605
1762
|
// Set the index'th array element.
|
1606
1763
|
// A Failure object is returned if GC is needed.
|
1607
1764
|
MUST_USE_RESULT MaybeObject* SetElement(uint32_t index,
|
1608
1765
|
Object* value,
|
1609
1766
|
StrictModeFlag strict_mode,
|
1610
|
-
bool check_prototype
|
1767
|
+
bool check_prototype);
|
1611
1768
|
|
1612
1769
|
// Returns the index'th element.
|
1613
1770
|
// The undefined object if index is out of bounds.
|
1614
|
-
MaybeObject* GetElementWithReceiver(Object* receiver, uint32_t index);
|
1615
1771
|
MaybeObject* GetElementWithInterceptor(Object* receiver, uint32_t index);
|
1616
1772
|
|
1617
|
-
//
|
1618
|
-
//
|
1619
|
-
//
|
1620
|
-
MaybeObject* GetExternalElement(uint32_t index);
|
1621
|
-
|
1773
|
+
// Replace the elements' backing store with fast elements of the given
|
1774
|
+
// capacity. Update the length for JSArrays. Returns the new backing
|
1775
|
+
// store.
|
1622
1776
|
MUST_USE_RESULT MaybeObject* SetFastElementsCapacityAndLength(int capacity,
|
1623
1777
|
int length);
|
1778
|
+
MUST_USE_RESULT MaybeObject* SetFastDoubleElementsCapacityAndLength(
|
1779
|
+
int capacity,
|
1780
|
+
int length);
|
1624
1781
|
MUST_USE_RESULT MaybeObject* SetSlowElements(Object* length);
|
1625
1782
|
|
1626
1783
|
// Lookup interceptors are used for handling properties controlled by host
|
@@ -1648,7 +1805,6 @@ class JSObject: public HeapObject {
|
|
1648
1805
|
// Lookup a property. If found, the result is valid and has
|
1649
1806
|
// detailed information.
|
1650
1807
|
void LocalLookup(String* name, LookupResult* result);
|
1651
|
-
void Lookup(String* name, LookupResult* result);
|
1652
1808
|
|
1653
1809
|
// The following lookup functions skip interceptors.
|
1654
1810
|
void LocalLookupRealNamedProperty(String* name, LookupResult* result);
|
@@ -1656,7 +1812,7 @@ class JSObject: public HeapObject {
|
|
1656
1812
|
void LookupRealNamedPropertyInPrototypes(String* name, LookupResult* result);
|
1657
1813
|
void LookupCallbackSetterInPrototypes(String* name, LookupResult* result);
|
1658
1814
|
MUST_USE_RESULT MaybeObject* SetElementWithCallbackSetterInPrototypes(
|
1659
|
-
uint32_t index, Object* value, bool* found);
|
1815
|
+
uint32_t index, Object* value, bool* found, StrictModeFlag strict_mode);
|
1660
1816
|
void LookupCallback(String* name, LookupResult* result);
|
1661
1817
|
|
1662
1818
|
// Returns the number of properties on this object filtering out properties
|
@@ -1746,6 +1902,9 @@ class JSObject: public HeapObject {
|
|
1746
1902
|
MUST_USE_RESULT MaybeObject* NormalizeProperties(
|
1747
1903
|
PropertyNormalizationMode mode,
|
1748
1904
|
int expected_additional_properties);
|
1905
|
+
|
1906
|
+
// Convert and update the elements backing store to be a NumberDictionary
|
1907
|
+
// dictionary. Returns the backing after conversion.
|
1749
1908
|
MUST_USE_RESULT MaybeObject* NormalizeElements();
|
1750
1909
|
|
1751
1910
|
MUST_USE_RESULT MaybeObject* UpdateMapCodeCache(String* name, Code* code);
|
@@ -1838,8 +1997,21 @@ class JSObject: public HeapObject {
|
|
1838
1997
|
// Also maximal value of JSArray's length property.
|
1839
1998
|
static const uint32_t kMaxElementCount = 0xffffffffu;
|
1840
1999
|
|
2000
|
+
// Constants for heuristics controlling conversion of fast elements
|
2001
|
+
// to slow elements.
|
2002
|
+
|
2003
|
+
// Maximal gap that can be introduced by adding an element beyond
|
2004
|
+
// the current elements length.
|
1841
2005
|
static const uint32_t kMaxGap = 1024;
|
1842
|
-
|
2006
|
+
|
2007
|
+
// Maximal length of fast elements array that won't be checked for
|
2008
|
+
// being dense enough on expansion.
|
2009
|
+
static const int kMaxUncheckedFastElementsLength = 5000;
|
2010
|
+
|
2011
|
+
// Same as above but for old arrays. This limit is more strict. We
|
2012
|
+
// don't want to be wasteful with long lived objects.
|
2013
|
+
static const int kMaxUncheckedOldFastElementsLength = 500;
|
2014
|
+
|
1843
2015
|
static const int kInitialMaxFastElementArray = 100000;
|
1844
2016
|
static const int kMaxFastProperties = 12;
|
1845
2017
|
static const int kMaxInstanceSize = 255 * kPointerSize;
|
@@ -1861,6 +2033,8 @@ class JSObject: public HeapObject {
|
|
1861
2033
|
};
|
1862
2034
|
|
1863
2035
|
private:
|
2036
|
+
friend class DictionaryElementsAccessor;
|
2037
|
+
|
1864
2038
|
MUST_USE_RESULT MaybeObject* GetElementWithCallback(Object* receiver,
|
1865
2039
|
Object* structure,
|
1866
2040
|
uint32_t index,
|
@@ -1868,7 +2042,8 @@ class JSObject: public HeapObject {
|
|
1868
2042
|
MaybeObject* SetElementWithCallback(Object* structure,
|
1869
2043
|
uint32_t index,
|
1870
2044
|
Object* value,
|
1871
|
-
JSObject* holder
|
2045
|
+
JSObject* holder,
|
2046
|
+
StrictModeFlag strict_mode);
|
1872
2047
|
MUST_USE_RESULT MaybeObject* SetElementWithInterceptor(
|
1873
2048
|
uint32_t index,
|
1874
2049
|
Object* value,
|
@@ -1880,35 +2055,29 @@ class JSObject: public HeapObject {
|
|
1880
2055
|
StrictModeFlag strict_mode,
|
1881
2056
|
bool check_prototype);
|
1882
2057
|
|
1883
|
-
MaybeObject* GetElementPostInterceptor(Object* receiver, uint32_t index);
|
1884
|
-
|
1885
2058
|
MUST_USE_RESULT MaybeObject* DeletePropertyPostInterceptor(String* name,
|
1886
2059
|
DeleteMode mode);
|
1887
2060
|
MUST_USE_RESULT MaybeObject* DeletePropertyWithInterceptor(String* name);
|
1888
2061
|
|
1889
|
-
MUST_USE_RESULT MaybeObject* DeleteElementPostInterceptor(uint32_t index,
|
1890
|
-
DeleteMode mode);
|
1891
2062
|
MUST_USE_RESULT MaybeObject* DeleteElementWithInterceptor(uint32_t index);
|
1892
2063
|
|
1893
|
-
|
1894
|
-
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
1898
|
-
|
1899
|
-
|
1900
|
-
|
1901
|
-
|
1902
|
-
|
1903
|
-
bool continue_search);
|
1904
|
-
PropertyAttributes GetPropertyAttribute(JSObject* receiver,
|
1905
|
-
LookupResult* result,
|
1906
|
-
String* name,
|
1907
|
-
bool continue_search);
|
2064
|
+
MUST_USE_RESULT MaybeObject* DeleteFastElement(uint32_t index);
|
2065
|
+
MUST_USE_RESULT MaybeObject* DeleteDictionaryElement(uint32_t index,
|
2066
|
+
DeleteMode mode);
|
2067
|
+
|
2068
|
+
bool ReferencesObjectFromElements(FixedArray* elements,
|
2069
|
+
ElementsKind kind,
|
2070
|
+
Object* object);
|
2071
|
+
bool HasElementInElements(FixedArray* elements,
|
2072
|
+
ElementsKind kind,
|
2073
|
+
uint32_t index);
|
1908
2074
|
|
1909
2075
|
// Returns true if most of the elements backing storage is used.
|
1910
2076
|
bool HasDenseElements();
|
1911
2077
|
|
2078
|
+
// Gets the current elements capacity and the number of used elements.
|
2079
|
+
void GetElementsCapacityAndUsage(int* capacity, int* used);
|
2080
|
+
|
1912
2081
|
bool CanSetCallback(String* name);
|
1913
2082
|
MUST_USE_RESULT MaybeObject* SetElementCallback(
|
1914
2083
|
uint32_t index,
|
@@ -1928,17 +2097,33 @@ class JSObject: public HeapObject {
|
|
1928
2097
|
};
|
1929
2098
|
|
1930
2099
|
|
1931
|
-
//
|
1932
|
-
|
2100
|
+
// Common superclass for FixedArrays that allow implementations to share
|
2101
|
+
// common accessors and some code paths.
|
2102
|
+
class FixedArrayBase: public HeapObject {
|
1933
2103
|
public:
|
1934
2104
|
// [length]: length of the array.
|
1935
2105
|
inline int length();
|
1936
2106
|
inline void set_length(int value);
|
1937
2107
|
|
2108
|
+
inline static FixedArrayBase* cast(Object* object);
|
2109
|
+
|
2110
|
+
// Layout description.
|
2111
|
+
// Length is smi tagged when it is stored.
|
2112
|
+
static const int kLengthOffset = HeapObject::kHeaderSize;
|
2113
|
+
static const int kHeaderSize = kLengthOffset + kPointerSize;
|
2114
|
+
};
|
2115
|
+
|
2116
|
+
|
2117
|
+
class FixedDoubleArray;
|
2118
|
+
|
2119
|
+
// FixedArray describes fixed-sized arrays with element type Object*.
|
2120
|
+
class FixedArray: public FixedArrayBase {
|
2121
|
+
public:
|
1938
2122
|
// Setter and getter for elements.
|
1939
2123
|
inline Object* get(int index);
|
1940
2124
|
// Setter that uses write barrier.
|
1941
2125
|
inline void set(int index, Object* value);
|
2126
|
+
inline bool is_the_hole(int index);
|
1942
2127
|
|
1943
2128
|
// Setter that doesn't need write barrier).
|
1944
2129
|
inline void set(int index, Smi* value);
|
@@ -1985,11 +2170,6 @@ class FixedArray: public HeapObject {
|
|
1985
2170
|
// Casting.
|
1986
2171
|
static inline FixedArray* cast(Object* obj);
|
1987
2172
|
|
1988
|
-
// Layout description.
|
1989
|
-
// Length is smi tagged when it is stored.
|
1990
|
-
static const int kLengthOffset = HeapObject::kHeaderSize;
|
1991
|
-
static const int kHeaderSize = kLengthOffset + kPointerSize;
|
1992
|
-
|
1993
2173
|
// Maximal allowed size, in bytes, of a single FixedArray.
|
1994
2174
|
// Prevents overflowing size computations, as well as extreme memory
|
1995
2175
|
// consumption.
|
@@ -2037,6 +2217,61 @@ class FixedArray: public HeapObject {
|
|
2037
2217
|
};
|
2038
2218
|
|
2039
2219
|
|
2220
|
+
// FixedDoubleArray describes fixed-sized arrays with element type double.
|
2221
|
+
class FixedDoubleArray: public FixedArrayBase {
|
2222
|
+
public:
|
2223
|
+
inline void Initialize(FixedArray* from);
|
2224
|
+
inline void Initialize(FixedDoubleArray* from);
|
2225
|
+
inline void Initialize(NumberDictionary* from);
|
2226
|
+
|
2227
|
+
// Setter and getter for elements.
|
2228
|
+
inline double get_scalar(int index);
|
2229
|
+
inline MaybeObject* get(int index);
|
2230
|
+
inline void set(int index, double value);
|
2231
|
+
inline void set_the_hole(int index);
|
2232
|
+
|
2233
|
+
// Checking for the hole.
|
2234
|
+
inline bool is_the_hole(int index);
|
2235
|
+
|
2236
|
+
// Garbage collection support.
|
2237
|
+
inline static int SizeFor(int length) {
|
2238
|
+
return kHeaderSize + length * kDoubleSize;
|
2239
|
+
}
|
2240
|
+
|
2241
|
+
// Code Generation support.
|
2242
|
+
static int OffsetOfElementAt(int index) { return SizeFor(index); }
|
2243
|
+
|
2244
|
+
inline static bool is_the_hole_nan(double value);
|
2245
|
+
inline static double hole_nan_as_double();
|
2246
|
+
inline static double canonical_not_the_hole_nan_as_double();
|
2247
|
+
|
2248
|
+
// Casting.
|
2249
|
+
static inline FixedDoubleArray* cast(Object* obj);
|
2250
|
+
|
2251
|
+
// Maximal allowed size, in bytes, of a single FixedDoubleArray.
|
2252
|
+
// Prevents overflowing size computations, as well as extreme memory
|
2253
|
+
// consumption.
|
2254
|
+
static const int kMaxSize = 512 * MB;
|
2255
|
+
// Maximally allowed length of a FixedArray.
|
2256
|
+
static const int kMaxLength = (kMaxSize - kHeaderSize) / kDoubleSize;
|
2257
|
+
|
2258
|
+
// Dispatched behavior.
|
2259
|
+
#ifdef OBJECT_PRINT
|
2260
|
+
inline void FixedDoubleArrayPrint() {
|
2261
|
+
FixedDoubleArrayPrint(stdout);
|
2262
|
+
}
|
2263
|
+
void FixedDoubleArrayPrint(FILE* out);
|
2264
|
+
#endif
|
2265
|
+
|
2266
|
+
#ifdef DEBUG
|
2267
|
+
void FixedDoubleArrayVerify();
|
2268
|
+
#endif
|
2269
|
+
|
2270
|
+
private:
|
2271
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(FixedDoubleArray);
|
2272
|
+
};
|
2273
|
+
|
2274
|
+
|
2040
2275
|
// DescriptorArrays are fixed arrays used to hold instance descriptors.
|
2041
2276
|
// The format of the these objects is:
|
2042
2277
|
// TODO(1399): It should be possible to make room for bit_field3 in the map
|
@@ -2318,6 +2553,10 @@ class HashTable: public FixedArray {
|
|
2318
2553
|
int at_least_space_for,
|
2319
2554
|
PretenureFlag pretenure = NOT_TENURED);
|
2320
2555
|
|
2556
|
+
// Computes the required capacity for a table holding the given
|
2557
|
+
// number of elements. May be more than HashTable::kMaxCapacity.
|
2558
|
+
static int ComputeCapacity(int at_least_space_for);
|
2559
|
+
|
2321
2560
|
// Returns the key at entry.
|
2322
2561
|
Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
|
2323
2562
|
|
@@ -2365,7 +2604,6 @@ class HashTable: public FixedArray {
|
|
2365
2604
|
int FindEntry(Isolate* isolate, Key key);
|
2366
2605
|
|
2367
2606
|
protected:
|
2368
|
-
|
2369
2607
|
// Find the entry at which to insert element with the given key that
|
2370
2608
|
// has the given hash value.
|
2371
2609
|
uint32_t FindInsertionEntry(uint32_t hash);
|
@@ -2410,6 +2648,12 @@ class HashTable: public FixedArray {
|
|
2410
2648
|
return (last + number) & (size - 1);
|
2411
2649
|
}
|
2412
2650
|
|
2651
|
+
// Rehashes this hash-table into the new table.
|
2652
|
+
MUST_USE_RESULT MaybeObject* Rehash(HashTable* new_table, Key key);
|
2653
|
+
|
2654
|
+
// Attempt to shrink hash table after removal of key.
|
2655
|
+
MUST_USE_RESULT MaybeObject* Shrink(Key key);
|
2656
|
+
|
2413
2657
|
// Ensure enough space for n additional elements.
|
2414
2658
|
MUST_USE_RESULT MaybeObject* EnsureCapacity(int n, Key key);
|
2415
2659
|
};
|
@@ -2532,7 +2776,6 @@ class MapCache: public HashTable<MapCacheShape, HashTableKey*> {
|
|
2532
2776
|
template <typename Shape, typename Key>
|
2533
2777
|
class Dictionary: public HashTable<Shape, Key> {
|
2534
2778
|
public:
|
2535
|
-
|
2536
2779
|
static inline Dictionary<Shape, Key>* cast(Object* obj) {
|
2537
2780
|
return reinterpret_cast<Dictionary<Shape, Key>*>(obj);
|
2538
2781
|
}
|
@@ -2575,6 +2818,9 @@ class Dictionary: public HashTable<Shape, Key> {
|
|
2575
2818
|
// Delete a property from the dictionary.
|
2576
2819
|
Object* DeleteProperty(int entry, JSObject::DeleteMode mode);
|
2577
2820
|
|
2821
|
+
// Attempt to shrink the dictionary after deletion of key.
|
2822
|
+
MUST_USE_RESULT MaybeObject* Shrink(Key key);
|
2823
|
+
|
2578
2824
|
// Returns the number of elements in the dictionary filtering out properties
|
2579
2825
|
// with the specified attributes.
|
2580
2826
|
int NumberOfElementsFilterAttributes(PropertyAttributes filter);
|
@@ -2582,10 +2828,13 @@ class Dictionary: public HashTable<Shape, Key> {
|
|
2582
2828
|
// Returns the number of enumerable elements in the dictionary.
|
2583
2829
|
int NumberOfEnumElements();
|
2584
2830
|
|
2831
|
+
enum SortMode { UNSORTED, SORTED };
|
2585
2832
|
// Copies keys to preallocated fixed array.
|
2586
|
-
void CopyKeysTo(FixedArray* storage,
|
2833
|
+
void CopyKeysTo(FixedArray* storage,
|
2834
|
+
PropertyAttributes filter,
|
2835
|
+
SortMode sort_mode);
|
2587
2836
|
// Fill in details for properties into storage.
|
2588
|
-
void CopyKeysTo(FixedArray* storage);
|
2837
|
+
void CopyKeysTo(FixedArray* storage, int index, SortMode sort_mode);
|
2589
2838
|
|
2590
2839
|
// Accessors for next enumeration index.
|
2591
2840
|
void SetNextEnumerationIndex(int index) {
|
@@ -2730,6 +2979,48 @@ class NumberDictionary: public Dictionary<NumberDictionaryShape, uint32_t> {
|
|
2730
2979
|
};
|
2731
2980
|
|
2732
2981
|
|
2982
|
+
class ObjectHashTableShape {
|
2983
|
+
public:
|
2984
|
+
static inline bool IsMatch(JSObject* key, Object* other);
|
2985
|
+
static inline uint32_t Hash(JSObject* key);
|
2986
|
+
static inline uint32_t HashForObject(JSObject* key, Object* object);
|
2987
|
+
MUST_USE_RESULT static inline MaybeObject* AsObject(JSObject* key);
|
2988
|
+
static const int kPrefixSize = 0;
|
2989
|
+
static const int kEntrySize = 2;
|
2990
|
+
};
|
2991
|
+
|
2992
|
+
|
2993
|
+
// ObjectHashTable maps keys that are JavaScript objects to object values by
|
2994
|
+
// using the identity hash of the key for hashing purposes.
|
2995
|
+
class ObjectHashTable: public HashTable<ObjectHashTableShape, JSObject*> {
|
2996
|
+
public:
|
2997
|
+
static inline ObjectHashTable* cast(Object* obj) {
|
2998
|
+
ASSERT(obj->IsHashTable());
|
2999
|
+
return reinterpret_cast<ObjectHashTable*>(obj);
|
3000
|
+
}
|
3001
|
+
|
3002
|
+
// Looks up the value associated with the given key. The undefined value is
|
3003
|
+
// returned in case the key is not present.
|
3004
|
+
Object* Lookup(JSObject* key);
|
3005
|
+
|
3006
|
+
// Adds (or overwrites) the value associated with the given key. Mapping a
|
3007
|
+
// key to the undefined value causes removal of the whole entry.
|
3008
|
+
MUST_USE_RESULT MaybeObject* Put(JSObject* key, Object* value);
|
3009
|
+
|
3010
|
+
private:
|
3011
|
+
friend class MarkCompactCollector;
|
3012
|
+
|
3013
|
+
void AddEntry(int entry, JSObject* key, Object* value);
|
3014
|
+
void RemoveEntry(int entry, Heap* heap);
|
3015
|
+
inline void RemoveEntry(int entry);
|
3016
|
+
|
3017
|
+
// Returns the index to the value of an entry.
|
3018
|
+
static inline int EntryToValueIndex(int entry) {
|
3019
|
+
return EntryToIndex(entry) + 1;
|
3020
|
+
}
|
3021
|
+
};
|
3022
|
+
|
3023
|
+
|
2733
3024
|
// JSFunctionResultCache caches results of some JSFunction invocation.
|
2734
3025
|
// It is a fixed array with fixed structure:
|
2735
3026
|
// [0]: factory function
|
@@ -2786,23 +3077,14 @@ class NormalizedMapCache: public FixedArray {
|
|
2786
3077
|
#ifdef DEBUG
|
2787
3078
|
void NormalizedMapCacheVerify();
|
2788
3079
|
#endif
|
2789
|
-
|
2790
|
-
private:
|
2791
|
-
static int Hash(Map* fast);
|
2792
|
-
|
2793
|
-
static bool CheckHit(Map* slow, Map* fast, PropertyNormalizationMode mode);
|
2794
3080
|
};
|
2795
3081
|
|
2796
3082
|
|
2797
3083
|
// ByteArray represents fixed sized byte arrays. Used by the outside world,
|
2798
3084
|
// such as PCRE, and also by the memory allocator and garbage collector to
|
2799
3085
|
// fill in free blocks in the heap.
|
2800
|
-
class ByteArray: public
|
3086
|
+
class ByteArray: public FixedArrayBase {
|
2801
3087
|
public:
|
2802
|
-
// [length]: length of the array.
|
2803
|
-
inline int length();
|
2804
|
-
inline void set_length(int value);
|
2805
|
-
|
2806
3088
|
// Setter and getter.
|
2807
3089
|
inline byte get(int index);
|
2808
3090
|
inline void set(int index, byte value);
|
@@ -2847,10 +3129,6 @@ class ByteArray: public HeapObject {
|
|
2847
3129
|
#endif
|
2848
3130
|
|
2849
3131
|
// Layout description.
|
2850
|
-
// Length is smi tagged when it is stored.
|
2851
|
-
static const int kLengthOffset = HeapObject::kHeaderSize;
|
2852
|
-
static const int kHeaderSize = kLengthOffset + kPointerSize;
|
2853
|
-
|
2854
3132
|
static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
|
2855
3133
|
|
2856
3134
|
// Maximal memory consumption for a single ByteArray.
|
@@ -2874,11 +3152,10 @@ class ByteArray: public HeapObject {
|
|
2874
3152
|
// Out-of-range values passed to the setter are converted via a C
|
2875
3153
|
// cast, not clamping. Out-of-range indices cause exceptions to be
|
2876
3154
|
// raised rather than being silently ignored.
|
2877
|
-
class ExternalArray: public
|
3155
|
+
class ExternalArray: public FixedArrayBase {
|
2878
3156
|
public:
|
2879
|
-
|
2880
|
-
inline int
|
2881
|
-
inline void set_length(int value);
|
3157
|
+
|
3158
|
+
inline bool is_the_hole(int index) { return false; }
|
2882
3159
|
|
2883
3160
|
// [external_pointer]: The pointer to the external memory area backing this
|
2884
3161
|
// external array.
|
@@ -2891,9 +3168,8 @@ class ExternalArray: public HeapObject {
|
|
2891
3168
|
static const int kMaxLength = 0x3fffffff;
|
2892
3169
|
|
2893
3170
|
// ExternalArray headers are not quadword aligned.
|
2894
|
-
static const int kLengthOffset = HeapObject::kHeaderSize;
|
2895
3171
|
static const int kExternalPointerOffset =
|
2896
|
-
POINTER_SIZE_ALIGN(kLengthOffset +
|
3172
|
+
POINTER_SIZE_ALIGN(FixedArrayBase::kLengthOffset + kPointerSize);
|
2897
3173
|
static const int kHeaderSize = kExternalPointerOffset + kPointerSize;
|
2898
3174
|
static const int kAlignedSize = OBJECT_POINTER_ALIGN(kHeaderSize);
|
2899
3175
|
|
@@ -2915,7 +3191,8 @@ class ExternalPixelArray: public ExternalArray {
|
|
2915
3191
|
inline uint8_t* external_pixel_pointer();
|
2916
3192
|
|
2917
3193
|
// Setter and getter.
|
2918
|
-
inline uint8_t
|
3194
|
+
inline uint8_t get_scalar(int index);
|
3195
|
+
inline MaybeObject* get(int index);
|
2919
3196
|
inline void set(int index, uint8_t value);
|
2920
3197
|
|
2921
3198
|
// This accessor applies the correct conversion from Smi, HeapNumber and
|
@@ -2943,7 +3220,8 @@ class ExternalPixelArray: public ExternalArray {
|
|
2943
3220
|
class ExternalByteArray: public ExternalArray {
|
2944
3221
|
public:
|
2945
3222
|
// Setter and getter.
|
2946
|
-
inline int8_t
|
3223
|
+
inline int8_t get_scalar(int index);
|
3224
|
+
inline MaybeObject* get(int index);
|
2947
3225
|
inline void set(int index, int8_t value);
|
2948
3226
|
|
2949
3227
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -2971,7 +3249,8 @@ class ExternalByteArray: public ExternalArray {
|
|
2971
3249
|
class ExternalUnsignedByteArray: public ExternalArray {
|
2972
3250
|
public:
|
2973
3251
|
// Setter and getter.
|
2974
|
-
inline uint8_t
|
3252
|
+
inline uint8_t get_scalar(int index);
|
3253
|
+
inline MaybeObject* get(int index);
|
2975
3254
|
inline void set(int index, uint8_t value);
|
2976
3255
|
|
2977
3256
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -2999,7 +3278,8 @@ class ExternalUnsignedByteArray: public ExternalArray {
|
|
2999
3278
|
class ExternalShortArray: public ExternalArray {
|
3000
3279
|
public:
|
3001
3280
|
// Setter and getter.
|
3002
|
-
inline int16_t
|
3281
|
+
inline int16_t get_scalar(int index);
|
3282
|
+
inline MaybeObject* get(int index);
|
3003
3283
|
inline void set(int index, int16_t value);
|
3004
3284
|
|
3005
3285
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3027,7 +3307,8 @@ class ExternalShortArray: public ExternalArray {
|
|
3027
3307
|
class ExternalUnsignedShortArray: public ExternalArray {
|
3028
3308
|
public:
|
3029
3309
|
// Setter and getter.
|
3030
|
-
inline uint16_t
|
3310
|
+
inline uint16_t get_scalar(int index);
|
3311
|
+
inline MaybeObject* get(int index);
|
3031
3312
|
inline void set(int index, uint16_t value);
|
3032
3313
|
|
3033
3314
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3055,7 +3336,8 @@ class ExternalUnsignedShortArray: public ExternalArray {
|
|
3055
3336
|
class ExternalIntArray: public ExternalArray {
|
3056
3337
|
public:
|
3057
3338
|
// Setter and getter.
|
3058
|
-
inline int32_t
|
3339
|
+
inline int32_t get_scalar(int index);
|
3340
|
+
inline MaybeObject* get(int index);
|
3059
3341
|
inline void set(int index, int32_t value);
|
3060
3342
|
|
3061
3343
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3083,7 +3365,8 @@ class ExternalIntArray: public ExternalArray {
|
|
3083
3365
|
class ExternalUnsignedIntArray: public ExternalArray {
|
3084
3366
|
public:
|
3085
3367
|
// Setter and getter.
|
3086
|
-
inline uint32_t
|
3368
|
+
inline uint32_t get_scalar(int index);
|
3369
|
+
inline MaybeObject* get(int index);
|
3087
3370
|
inline void set(int index, uint32_t value);
|
3088
3371
|
|
3089
3372
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3111,7 +3394,8 @@ class ExternalUnsignedIntArray: public ExternalArray {
|
|
3111
3394
|
class ExternalFloatArray: public ExternalArray {
|
3112
3395
|
public:
|
3113
3396
|
// Setter and getter.
|
3114
|
-
inline float
|
3397
|
+
inline float get_scalar(int index);
|
3398
|
+
inline MaybeObject* get(int index);
|
3115
3399
|
inline void set(int index, float value);
|
3116
3400
|
|
3117
3401
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3139,7 +3423,8 @@ class ExternalFloatArray: public ExternalArray {
|
|
3139
3423
|
class ExternalDoubleArray: public ExternalArray {
|
3140
3424
|
public:
|
3141
3425
|
// Setter and getter.
|
3142
|
-
inline double
|
3426
|
+
inline double get_scalar(int index);
|
3427
|
+
inline MaybeObject* get(int index);
|
3143
3428
|
inline void set(int index, double value);
|
3144
3429
|
|
3145
3430
|
// This accessor applies the correct conversion from Smi, HeapNumber
|
@@ -3235,7 +3520,7 @@ class DeoptimizationInputData: public FixedArray {
|
|
3235
3520
|
// Casting.
|
3236
3521
|
static inline DeoptimizationInputData* cast(Object* obj);
|
3237
3522
|
|
3238
|
-
#ifdef
|
3523
|
+
#ifdef ENABLE_DISASSEMBLER
|
3239
3524
|
void DeoptimizationInputDataPrint(FILE* out);
|
3240
3525
|
#endif
|
3241
3526
|
|
@@ -3274,7 +3559,7 @@ class DeoptimizationOutputData: public FixedArray {
|
|
3274
3559
|
// Casting.
|
3275
3560
|
static inline DeoptimizationOutputData* cast(Object* obj);
|
3276
3561
|
|
3277
|
-
#
|
3562
|
+
#if defined(OBJECT_PRINT) || defined(ENABLE_DISASSEMBLER)
|
3278
3563
|
void DeoptimizationOutputDataPrint(FILE* out);
|
3279
3564
|
#endif
|
3280
3565
|
};
|
@@ -3309,13 +3594,14 @@ class Code: public HeapObject {
|
|
3309
3594
|
UNARY_OP_IC,
|
3310
3595
|
BINARY_OP_IC,
|
3311
3596
|
COMPARE_IC,
|
3597
|
+
TO_BOOLEAN_IC,
|
3312
3598
|
// No more than 16 kinds. The value currently encoded in four bits in
|
3313
3599
|
// Flags.
|
3314
3600
|
|
3315
3601
|
// Pseudo-kinds.
|
3316
3602
|
REGEXP = BUILTIN,
|
3317
3603
|
FIRST_IC_KIND = LOAD_IC,
|
3318
|
-
LAST_IC_KIND =
|
3604
|
+
LAST_IC_KIND = TO_BOOLEAN_IC
|
3319
3605
|
};
|
3320
3606
|
|
3321
3607
|
enum {
|
@@ -3381,13 +3667,10 @@ class Code: public HeapObject {
|
|
3381
3667
|
inline bool is_keyed_store_stub() { return kind() == KEYED_STORE_IC; }
|
3382
3668
|
inline bool is_call_stub() { return kind() == CALL_IC; }
|
3383
3669
|
inline bool is_keyed_call_stub() { return kind() == KEYED_CALL_IC; }
|
3384
|
-
inline bool is_unary_op_stub() {
|
3385
|
-
|
3386
|
-
}
|
3387
|
-
inline bool is_binary_op_stub() {
|
3388
|
-
return kind() == BINARY_OP_IC;
|
3389
|
-
}
|
3670
|
+
inline bool is_unary_op_stub() { return kind() == UNARY_OP_IC; }
|
3671
|
+
inline bool is_binary_op_stub() { return kind() == BINARY_OP_IC; }
|
3390
3672
|
inline bool is_compare_ic_stub() { return kind() == COMPARE_IC; }
|
3673
|
+
inline bool is_to_boolean_ic_stub() { return kind() == TO_BOOLEAN_IC; }
|
3391
3674
|
|
3392
3675
|
// [major_key]: For kind STUB or BINARY_OP_IC, the major key.
|
3393
3676
|
inline int major_key();
|
@@ -3429,27 +3712,24 @@ class Code: public HeapObject {
|
|
3429
3712
|
inline CheckType check_type();
|
3430
3713
|
inline void set_check_type(CheckType value);
|
3431
3714
|
|
3432
|
-
// [
|
3433
|
-
// KEYED_EXTERNAL_ARRAY_STORE_IC, identifies the type of external
|
3434
|
-
// array that the code stub is specialized for.
|
3435
|
-
inline ExternalArrayType external_array_type();
|
3436
|
-
inline void set_external_array_type(ExternalArrayType value);
|
3437
|
-
|
3438
|
-
// [type-recording unary op type]: For all UNARY_OP_IC.
|
3715
|
+
// [type-recording unary op type]: For kind UNARY_OP_IC.
|
3439
3716
|
inline byte unary_op_type();
|
3440
3717
|
inline void set_unary_op_type(byte value);
|
3441
3718
|
|
3442
|
-
// [type-recording binary op type]: For
|
3719
|
+
// [type-recording binary op type]: For kind BINARY_OP_IC.
|
3443
3720
|
inline byte binary_op_type();
|
3444
3721
|
inline void set_binary_op_type(byte value);
|
3445
3722
|
inline byte binary_op_result_type();
|
3446
3723
|
inline void set_binary_op_result_type(byte value);
|
3447
3724
|
|
3448
|
-
// [compare state]: For kind
|
3449
|
-
// stub is in.
|
3725
|
+
// [compare state]: For kind COMPARE_IC, tells what state the stub is in.
|
3450
3726
|
inline byte compare_state();
|
3451
3727
|
inline void set_compare_state(byte value);
|
3452
3728
|
|
3729
|
+
// [to_boolean_foo]: For kind TO_BOOLEAN_IC tells what state the stub is in.
|
3730
|
+
inline byte to_boolean_state();
|
3731
|
+
inline void set_to_boolean_state(byte value);
|
3732
|
+
|
3453
3733
|
// Get the safepoint entry for the given pc.
|
3454
3734
|
SafepointEntry GetSafepointEntry(Address pc);
|
3455
3735
|
|
@@ -3590,11 +3870,11 @@ class Code: public HeapObject {
|
|
3590
3870
|
static const int kOptimizableOffset = kKindSpecificFlagsOffset;
|
3591
3871
|
static const int kStackSlotsOffset = kKindSpecificFlagsOffset;
|
3592
3872
|
static const int kCheckTypeOffset = kKindSpecificFlagsOffset;
|
3593
|
-
static const int kExternalArrayTypeOffset = kKindSpecificFlagsOffset;
|
3594
3873
|
|
3595
|
-
static const int kCompareStateOffset = kStubMajorKeyOffset + 1;
|
3596
3874
|
static const int kUnaryOpTypeOffset = kStubMajorKeyOffset + 1;
|
3597
3875
|
static const int kBinaryOpTypeOffset = kStubMajorKeyOffset + 1;
|
3876
|
+
static const int kCompareStateOffset = kStubMajorKeyOffset + 1;
|
3877
|
+
static const int kToBooleanTypeOffset = kStubMajorKeyOffset + 1;
|
3598
3878
|
static const int kHasDeoptimizationSupportOffset = kOptimizableOffset + 1;
|
3599
3879
|
|
3600
3880
|
static const int kBinaryOpReturnTypeOffset = kBinaryOpTypeOffset + 1;
|
@@ -3741,31 +4021,37 @@ class Map: public HeapObject {
|
|
3741
4021
|
inline void set_is_extensible(bool value);
|
3742
4022
|
inline bool is_extensible();
|
3743
4023
|
|
3744
|
-
|
3745
|
-
|
3746
|
-
|
3747
|
-
|
3748
|
-
|
3749
|
-
|
3750
|
-
|
3751
|
-
|
4024
|
+
inline void set_elements_kind(JSObject::ElementsKind elements_kind) {
|
4025
|
+
ASSERT(elements_kind < JSObject::kElementsKindCount);
|
4026
|
+
ASSERT(JSObject::kElementsKindCount <= (1 << kElementsKindBitCount));
|
4027
|
+
set_bit_field2((bit_field2() & ~kElementsKindMask) |
|
4028
|
+
(elements_kind << kElementsKindShift));
|
4029
|
+
ASSERT(this->elements_kind() == elements_kind);
|
4030
|
+
}
|
4031
|
+
|
4032
|
+
inline JSObject::ElementsKind elements_kind() {
|
4033
|
+
return static_cast<JSObject::ElementsKind>(
|
4034
|
+
(bit_field2() & kElementsKindMask) >> kElementsKindShift);
|
3752
4035
|
}
|
3753
4036
|
|
4037
|
+
// Tells whether the instance has fast elements.
|
4038
|
+
// Equivalent to instance->GetElementsKind() == FAST_ELEMENTS.
|
3754
4039
|
inline bool has_fast_elements() {
|
3755
|
-
return (
|
4040
|
+
return elements_kind() == JSObject::FAST_ELEMENTS;
|
3756
4041
|
}
|
3757
4042
|
|
3758
|
-
|
3759
|
-
|
3760
|
-
if (value) {
|
3761
|
-
set_bit_field2(bit_field2() | (1 << kHasExternalArrayElements));
|
3762
|
-
} else {
|
3763
|
-
set_bit_field2(bit_field2() & ~(1 << kHasExternalArrayElements));
|
3764
|
-
}
|
4043
|
+
inline bool has_fast_double_elements() {
|
4044
|
+
return elements_kind() == JSObject::FAST_DOUBLE_ELEMENTS;
|
3765
4045
|
}
|
3766
4046
|
|
3767
4047
|
inline bool has_external_array_elements() {
|
3768
|
-
|
4048
|
+
JSObject::ElementsKind kind(elements_kind());
|
4049
|
+
return kind >= JSObject::FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
|
4050
|
+
kind <= JSObject::LAST_EXTERNAL_ARRAY_ELEMENTS_KIND;
|
4051
|
+
}
|
4052
|
+
|
4053
|
+
inline bool has_dictionary_elements() {
|
4054
|
+
return elements_kind() == JSObject::DICTIONARY_ELEMENTS;
|
3769
4055
|
}
|
3770
4056
|
|
3771
4057
|
// Tells whether the map is attached to SharedFunctionInfo
|
@@ -3818,6 +4104,26 @@ class Map: public HeapObject {
|
|
3818
4104
|
DECL_ACCESSORS(prototype_transitions, FixedArray)
|
3819
4105
|
inline FixedArray* unchecked_prototype_transitions();
|
3820
4106
|
|
4107
|
+
static const int kProtoTransitionHeaderSize = 1;
|
4108
|
+
static const int kProtoTransitionNumberOfEntriesOffset = 0;
|
4109
|
+
static const int kProtoTransitionElementsPerEntry = 2;
|
4110
|
+
static const int kProtoTransitionPrototypeOffset = 0;
|
4111
|
+
static const int kProtoTransitionMapOffset = 1;
|
4112
|
+
|
4113
|
+
inline int NumberOfProtoTransitions() {
|
4114
|
+
FixedArray* cache = unchecked_prototype_transitions();
|
4115
|
+
if (cache->length() == 0) return 0;
|
4116
|
+
return
|
4117
|
+
Smi::cast(cache->get(kProtoTransitionNumberOfEntriesOffset))->value();
|
4118
|
+
}
|
4119
|
+
|
4120
|
+
inline void SetNumberOfProtoTransitions(int value) {
|
4121
|
+
FixedArray* cache = unchecked_prototype_transitions();
|
4122
|
+
ASSERT(cache->length() != 0);
|
4123
|
+
cache->set_unchecked(kProtoTransitionNumberOfEntriesOffset,
|
4124
|
+
Smi::FromInt(value));
|
4125
|
+
}
|
4126
|
+
|
3821
4127
|
// Lookup in the map's instance descriptors and fill out the result
|
3822
4128
|
// with the given holder if the name is found. The holder may be
|
3823
4129
|
// NULL when this function is used from the compiler.
|
@@ -3834,18 +4140,23 @@ class Map: public HeapObject {
|
|
3834
4140
|
// instance descriptors.
|
3835
4141
|
MUST_USE_RESULT MaybeObject* CopyDropTransitions();
|
3836
4142
|
|
3837
|
-
// Returns this map if it has
|
4143
|
+
// Returns this map if it already has elements that are fast, otherwise
|
3838
4144
|
// returns a copy of the map, with all transitions dropped from the
|
3839
|
-
// descriptors and the
|
4145
|
+
// descriptors and the ElementsKind set to FAST_ELEMENTS.
|
3840
4146
|
MUST_USE_RESULT inline MaybeObject* GetFastElementsMap();
|
3841
4147
|
|
3842
|
-
// Returns this map if it has
|
3843
|
-
// otherwise returns a copy of the map, with all transitions dropped
|
3844
|
-
//
|
4148
|
+
// Returns this map if it already has fast elements that are doubles,
|
4149
|
+
// otherwise returns a copy of the map, with all transitions dropped from the
|
4150
|
+
// descriptors and the ElementsKind set to FAST_DOUBLE_ELEMENTS.
|
4151
|
+
MUST_USE_RESULT inline MaybeObject* GetFastDoubleElementsMap();
|
4152
|
+
|
4153
|
+
// Returns this map if already has dictionary elements, otherwise returns a
|
4154
|
+
// copy of the map, with all transitions dropped from the descriptors and the
|
4155
|
+
// ElementsKind set to DICTIONARY_ELEMENTS.
|
3845
4156
|
MUST_USE_RESULT inline MaybeObject* GetSlowElementsMap();
|
3846
4157
|
|
3847
4158
|
// Returns a new map with all transitions dropped from the descriptors and the
|
3848
|
-
//
|
4159
|
+
// ElementsKind set to one of the value corresponding to array_type.
|
3849
4160
|
MUST_USE_RESULT MaybeObject* GetExternalArrayElementsMap(
|
3850
4161
|
ExternalArrayType array_type,
|
3851
4162
|
bool safe_to_add_transition);
|
@@ -3894,6 +4205,21 @@ class Map: public HeapObject {
|
|
3894
4205
|
// following back pointers.
|
3895
4206
|
void ClearNonLiveTransitions(Heap* heap, Object* real_prototype);
|
3896
4207
|
|
4208
|
+
// Computes a hash value for this map, to be used in HashTables and such.
|
4209
|
+
int Hash();
|
4210
|
+
|
4211
|
+
// Compares this map to another to see if they describe equivalent objects.
|
4212
|
+
// If |mode| is set to CLEAR_INOBJECT_PROPERTIES, |other| is treated as if
|
4213
|
+
// it had exactly zero inobject properties.
|
4214
|
+
// The "shared" flags of both this map and |other| are ignored.
|
4215
|
+
bool EquivalentToForNormalization(Map* other, PropertyNormalizationMode mode);
|
4216
|
+
|
4217
|
+
// Returns true if this map and |other| describe equivalent objects.
|
4218
|
+
// The "shared" flags of both this map and |other| are ignored.
|
4219
|
+
bool EquivalentTo(Map* other) {
|
4220
|
+
return EquivalentToForNormalization(other, KEEP_INOBJECT_PROPERTIES);
|
4221
|
+
}
|
4222
|
+
|
3897
4223
|
// Dispatched behavior.
|
3898
4224
|
#ifdef OBJECT_PRINT
|
3899
4225
|
inline void MapPrint() {
|
@@ -3986,13 +4312,21 @@ class Map: public HeapObject {
|
|
3986
4312
|
// Bit positions for bit field 2
|
3987
4313
|
static const int kIsExtensible = 0;
|
3988
4314
|
static const int kFunctionWithPrototype = 1;
|
3989
|
-
static const int
|
3990
|
-
static const int
|
3991
|
-
|
3992
|
-
|
4315
|
+
static const int kStringWrapperSafeForDefaultValueOf = 2;
|
4316
|
+
static const int kAttachedToSharedFunctionInfo = 3;
|
4317
|
+
// No bits can be used after kElementsKindFirstBit, they are all reserved for
|
4318
|
+
// storing ElementKind. for anything other than storing the ElementKind.
|
4319
|
+
static const int kElementsKindShift = 4;
|
4320
|
+
static const int kElementsKindBitCount = 4;
|
4321
|
+
|
4322
|
+
// Derived values from bit field 2
|
4323
|
+
static const int kElementsKindMask = (-1 << kElementsKindShift) &
|
4324
|
+
((1 << (kElementsKindShift + kElementsKindBitCount)) - 1);
|
4325
|
+
static const int8_t kMaximumBitField2FastElementValue = static_cast<int8_t>(
|
4326
|
+
(JSObject::FAST_ELEMENTS + 1) << Map::kElementsKindShift) - 1;
|
3993
4327
|
|
3994
4328
|
// Bit positions for bit field 3
|
3995
|
-
static const int kIsShared =
|
4329
|
+
static const int kIsShared = 0;
|
3996
4330
|
|
3997
4331
|
// Layout of the default cache. It holds alternating name and code objects.
|
3998
4332
|
static const int kCodeCacheEntrySize = 2;
|
@@ -4128,6 +4462,7 @@ class Script: public Struct {
|
|
4128
4462
|
#define FUNCTIONS_WITH_ID_LIST(V) \
|
4129
4463
|
V(Array.prototype, push, ArrayPush) \
|
4130
4464
|
V(Array.prototype, pop, ArrayPop) \
|
4465
|
+
V(Function.prototype, apply, FunctionApply) \
|
4131
4466
|
V(String.prototype, charCodeAt, StringCharCodeAt) \
|
4132
4467
|
V(String.prototype, charAt, StringCharAt) \
|
4133
4468
|
V(String, fromCharCode, StringFromCharCode) \
|
@@ -4287,9 +4622,7 @@ class SharedFunctionInfo: public HeapObject {
|
|
4287
4622
|
// False if there are definitely no live objects created from this function.
|
4288
4623
|
// True if live objects _may_ exist (existence not guaranteed).
|
4289
4624
|
// May go back from true to false after GC.
|
4290
|
-
|
4291
|
-
|
4292
|
-
inline void set_live_objects_may_exist(bool value);
|
4625
|
+
DECL_BOOLEAN_ACCESSORS(live_objects_may_exist)
|
4293
4626
|
|
4294
4627
|
// [instance class name]: class name for instances.
|
4295
4628
|
DECL_ACCESSORS(instance_class_name, Object)
|
@@ -4348,12 +4681,10 @@ class SharedFunctionInfo: public HeapObject {
|
|
4348
4681
|
inline void set_end_position(int end_position);
|
4349
4682
|
|
4350
4683
|
// Is this function a function expression in the source code.
|
4351
|
-
|
4352
|
-
inline void set_is_expression(bool value);
|
4684
|
+
DECL_BOOLEAN_ACCESSORS(is_expression)
|
4353
4685
|
|
4354
4686
|
// Is this function a top-level function (scripts, evals).
|
4355
|
-
|
4356
|
-
inline void set_is_toplevel(bool value);
|
4687
|
+
DECL_BOOLEAN_ACCESSORS(is_toplevel)
|
4357
4688
|
|
4358
4689
|
// Bit field containing various information collected by the compiler to
|
4359
4690
|
// drive optimization.
|
@@ -4380,8 +4711,7 @@ class SharedFunctionInfo: public HeapObject {
|
|
4380
4711
|
// Indicates if this function can be lazy compiled.
|
4381
4712
|
// This is used to determine if we can safely flush code from a function
|
4382
4713
|
// when doing GC if we expect that the function will no longer be used.
|
4383
|
-
|
4384
|
-
inline void set_allows_lazy_compilation(bool flag);
|
4714
|
+
DECL_BOOLEAN_ACCESSORS(allows_lazy_compilation)
|
4385
4715
|
|
4386
4716
|
// Indicates how many full GCs this function has survived with assigned
|
4387
4717
|
// code object. Used to determine when it is relatively safe to flush
|
@@ -4395,19 +4725,36 @@ class SharedFunctionInfo: public HeapObject {
|
|
4395
4725
|
// shared function info. If a function is repeatedly optimized or if
|
4396
4726
|
// we cannot optimize the function we disable optimization to avoid
|
4397
4727
|
// spending time attempting to optimize it again.
|
4398
|
-
|
4399
|
-
inline void set_optimization_disabled(bool value);
|
4728
|
+
DECL_BOOLEAN_ACCESSORS(optimization_disabled)
|
4400
4729
|
|
4401
4730
|
// Indicates whether the function is a strict mode function.
|
4402
|
-
|
4403
|
-
|
4731
|
+
DECL_BOOLEAN_ACCESSORS(strict_mode)
|
4732
|
+
|
4733
|
+
// False if the function definitely does not allocate an arguments object.
|
4734
|
+
DECL_BOOLEAN_ACCESSORS(uses_arguments)
|
4735
|
+
|
4736
|
+
// True if the function has any duplicated parameter names.
|
4737
|
+
DECL_BOOLEAN_ACCESSORS(has_duplicate_parameters)
|
4404
4738
|
|
4405
|
-
// Indicates whether the function is a native
|
4739
|
+
// Indicates whether the function is a native function.
|
4406
4740
|
// These needs special threatment in .call and .apply since
|
4407
4741
|
// null passed as the receiver should not be translated to the
|
4408
4742
|
// global object.
|
4409
|
-
|
4410
|
-
|
4743
|
+
DECL_BOOLEAN_ACCESSORS(native)
|
4744
|
+
|
4745
|
+
// Indicates that the function was created by the Function function.
|
4746
|
+
// Though it's anonymous, toString should treat it as if it had the name
|
4747
|
+
// "anonymous". We don't set the name itself so that the system does not
|
4748
|
+
// see a binding for it.
|
4749
|
+
DECL_BOOLEAN_ACCESSORS(name_should_print_as_anonymous)
|
4750
|
+
|
4751
|
+
// Indicates whether the function is a bound function created using
|
4752
|
+
// the bind function.
|
4753
|
+
DECL_BOOLEAN_ACCESSORS(bound)
|
4754
|
+
|
4755
|
+
// Indicates that the function is anonymous (the name field can be set
|
4756
|
+
// through the API, which does not change this flag).
|
4757
|
+
DECL_BOOLEAN_ACCESSORS(is_anonymous)
|
4411
4758
|
|
4412
4759
|
// Indicates whether or not the code in the shared function support
|
4413
4760
|
// deoptimization.
|
@@ -4587,14 +4934,24 @@ class SharedFunctionInfo: public HeapObject {
|
|
4587
4934
|
static const int kStartPositionMask = ~((1 << kStartPositionShift) - 1);
|
4588
4935
|
|
4589
4936
|
// Bit positions in compiler_hints.
|
4590
|
-
static const int
|
4591
|
-
static const int
|
4592
|
-
|
4593
|
-
|
4594
|
-
|
4595
|
-
|
4596
|
-
|
4597
|
-
|
4937
|
+
static const int kCodeAgeSize = 3;
|
4938
|
+
static const int kCodeAgeMask = (1 << kCodeAgeSize) - 1;
|
4939
|
+
|
4940
|
+
enum CompilerHints {
|
4941
|
+
kHasOnlySimpleThisPropertyAssignments,
|
4942
|
+
kAllowLazyCompilation,
|
4943
|
+
kLiveObjectsMayExist,
|
4944
|
+
kCodeAgeShift,
|
4945
|
+
kOptimizationDisabled = kCodeAgeShift + kCodeAgeSize,
|
4946
|
+
kStrictModeFunction,
|
4947
|
+
kUsesArguments,
|
4948
|
+
kHasDuplicateParameters,
|
4949
|
+
kNative,
|
4950
|
+
kBoundFunction,
|
4951
|
+
kIsAnonymous,
|
4952
|
+
kNameShouldPrintAsAnonymous,
|
4953
|
+
kCompilerHintsCount // Pseudo entry
|
4954
|
+
};
|
4598
4955
|
|
4599
4956
|
private:
|
4600
4957
|
#if V8_HOST_ARCH_32_BIT
|
@@ -4607,28 +4964,31 @@ class SharedFunctionInfo: public HeapObject {
|
|
4607
4964
|
static const int kCompilerHintsSize = kIntSize;
|
4608
4965
|
#endif
|
4609
4966
|
|
4967
|
+
STATIC_ASSERT(SharedFunctionInfo::kCompilerHintsCount <=
|
4968
|
+
SharedFunctionInfo::kCompilerHintsSize * kBitsPerByte);
|
4969
|
+
|
4610
4970
|
public:
|
4611
4971
|
// Constants for optimizing codegen for strict mode function and
|
4612
|
-
//
|
4972
|
+
// native tests.
|
4613
4973
|
// Allows to use byte-widgh instructions.
|
4614
4974
|
static const int kStrictModeBitWithinByte =
|
4615
4975
|
(kStrictModeFunction + kCompilerHintsSmiTagSize) % kBitsPerByte;
|
4616
4976
|
|
4617
|
-
static const int
|
4618
|
-
(
|
4977
|
+
static const int kNativeBitWithinByte =
|
4978
|
+
(kNative + kCompilerHintsSmiTagSize) % kBitsPerByte;
|
4619
4979
|
|
4620
4980
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
4621
4981
|
static const int kStrictModeByteOffset = kCompilerHintsOffset +
|
4622
4982
|
(kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte;
|
4623
|
-
static const int
|
4624
|
-
(
|
4983
|
+
static const int kNativeByteOffset = kCompilerHintsOffset +
|
4984
|
+
(kNative + kCompilerHintsSmiTagSize) / kBitsPerByte;
|
4625
4985
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
4626
4986
|
static const int kStrictModeByteOffset = kCompilerHintsOffset +
|
4627
4987
|
(kCompilerHintsSize - 1) -
|
4628
4988
|
((kStrictModeFunction + kCompilerHintsSmiTagSize) / kBitsPerByte);
|
4629
|
-
static const int
|
4989
|
+
static const int kNativeByteOffset = kCompilerHintsOffset +
|
4630
4990
|
(kCompilerHintsSize - 1) -
|
4631
|
-
((
|
4991
|
+
((kNative + kCompilerHintsSmiTagSize) / kBitsPerByte);
|
4632
4992
|
#else
|
4633
4993
|
#error Unknown byte ordering
|
4634
4994
|
#endif
|
@@ -4685,9 +5045,6 @@ class JSFunction: public JSObject {
|
|
4685
5045
|
// recompilation.
|
4686
5046
|
inline bool IsMarkedForLazyRecompilation();
|
4687
5047
|
|
4688
|
-
// Compute a hash code for the source code of this function.
|
4689
|
-
uint32_t SourceHash();
|
4690
|
-
|
4691
5048
|
// Check whether or not this function is inlineable.
|
4692
5049
|
bool IsInlineable();
|
4693
5050
|
|
@@ -4787,6 +5144,7 @@ class JSFunction: public JSObject {
|
|
4787
5144
|
// Layout of the literals array.
|
4788
5145
|
static const int kLiteralsPrefixSize = 1;
|
4789
5146
|
static const int kLiteralGlobalContextIndex = 0;
|
5147
|
+
|
4790
5148
|
private:
|
4791
5149
|
DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunction);
|
4792
5150
|
};
|
@@ -4825,7 +5183,6 @@ class JSGlobalProxy : public JSObject {
|
|
4825
5183
|
static const int kSize = kContextOffset + kPointerSize;
|
4826
5184
|
|
4827
5185
|
private:
|
4828
|
-
|
4829
5186
|
DISALLOW_IMPLICIT_CONSTRUCTORS(JSGlobalProxy);
|
4830
5187
|
};
|
4831
5188
|
|
@@ -4881,7 +5238,6 @@ class GlobalObject: public JSObject {
|
|
4881
5238
|
// JavaScript global object.
|
4882
5239
|
class JSGlobalObject: public GlobalObject {
|
4883
5240
|
public:
|
4884
|
-
|
4885
5241
|
// Casting.
|
4886
5242
|
static inline JSGlobalObject* cast(Object* obj);
|
4887
5243
|
|
@@ -5053,8 +5409,10 @@ class JSMessageObject: public JSObject {
|
|
5053
5409
|
// If it is an atom regexp
|
5054
5410
|
// - a reference to a literal string to search for
|
5055
5411
|
// If it is an irregexp regexp:
|
5056
|
-
// - a reference to code for ASCII inputs (bytecode or compiled)
|
5057
|
-
//
|
5412
|
+
// - a reference to code for ASCII inputs (bytecode or compiled), or a smi
|
5413
|
+
// used for tracking the last usage (used for code flushing).
|
5414
|
+
// - a reference to code for UC16 inputs (bytecode or compiled), or a smi
|
5415
|
+
// used for tracking the last usage (used for code flushing)..
|
5058
5416
|
// - max number of registers used by irregexp implementations.
|
5059
5417
|
// - number of capture registers (output values) of the regexp.
|
5060
5418
|
class JSRegExp: public JSObject {
|
@@ -5087,6 +5445,12 @@ class JSRegExp: public JSObject {
|
|
5087
5445
|
inline Object* DataAt(int index);
|
5088
5446
|
// Set implementation data after the object has been prepared.
|
5089
5447
|
inline void SetDataAt(int index, Object* value);
|
5448
|
+
|
5449
|
+
// Used during GC when flushing code or setting age.
|
5450
|
+
inline Object* DataAtUnchecked(int index);
|
5451
|
+
inline void SetDataAtUnchecked(int index, Object* value, Heap* heap);
|
5452
|
+
inline Type TypeTagUnchecked();
|
5453
|
+
|
5090
5454
|
static int code_index(bool is_ascii) {
|
5091
5455
|
if (is_ascii) {
|
5092
5456
|
return kIrregexpASCIICodeIndex;
|
@@ -5095,6 +5459,14 @@ class JSRegExp: public JSObject {
|
|
5095
5459
|
}
|
5096
5460
|
}
|
5097
5461
|
|
5462
|
+
static int saved_code_index(bool is_ascii) {
|
5463
|
+
if (is_ascii) {
|
5464
|
+
return kIrregexpASCIICodeSavedIndex;
|
5465
|
+
} else {
|
5466
|
+
return kIrregexpUC16CodeSavedIndex;
|
5467
|
+
}
|
5468
|
+
}
|
5469
|
+
|
5098
5470
|
static inline JSRegExp* cast(Object* obj);
|
5099
5471
|
|
5100
5472
|
// Dispatched behavior.
|
@@ -5125,11 +5497,19 @@ class JSRegExp: public JSObject {
|
|
5125
5497
|
// fails, this fields hold an exception object that should be
|
5126
5498
|
// thrown if the regexp is used again.
|
5127
5499
|
static const int kIrregexpUC16CodeIndex = kDataIndex + 1;
|
5500
|
+
|
5501
|
+
// Saved instance of Irregexp compiled code or bytecode for ASCII that
|
5502
|
+
// is a potential candidate for flushing.
|
5503
|
+
static const int kIrregexpASCIICodeSavedIndex = kDataIndex + 2;
|
5504
|
+
// Saved instance of Irregexp compiled code or bytecode for UC16 that is
|
5505
|
+
// a potential candidate for flushing.
|
5506
|
+
static const int kIrregexpUC16CodeSavedIndex = kDataIndex + 3;
|
5507
|
+
|
5128
5508
|
// Maximal number of registers used by either ASCII or UC16.
|
5129
5509
|
// Only used to check that there is enough stack space
|
5130
|
-
static const int kIrregexpMaxRegisterCountIndex = kDataIndex +
|
5510
|
+
static const int kIrregexpMaxRegisterCountIndex = kDataIndex + 4;
|
5131
5511
|
// Number of captures in the compiled regexp.
|
5132
|
-
static const int kIrregexpCaptureCountIndex = kDataIndex +
|
5512
|
+
static const int kIrregexpCaptureCountIndex = kDataIndex + 5;
|
5133
5513
|
|
5134
5514
|
static const int kIrregexpDataSize = kIrregexpCaptureCountIndex + 1;
|
5135
5515
|
|
@@ -5150,6 +5530,18 @@ class JSRegExp: public JSObject {
|
|
5150
5530
|
static const int kMultilineFieldIndex = 3;
|
5151
5531
|
static const int kLastIndexFieldIndex = 4;
|
5152
5532
|
static const int kInObjectFieldCount = 5;
|
5533
|
+
|
5534
|
+
// The uninitialized value for a regexp code object.
|
5535
|
+
static const int kUninitializedValue = -1;
|
5536
|
+
|
5537
|
+
// The compilation error value for the regexp code object. The real error
|
5538
|
+
// object is in the saved code field.
|
5539
|
+
static const int kCompilationErrorValue = -2;
|
5540
|
+
|
5541
|
+
// When we store the sweep generation at which we moved the code from the
|
5542
|
+
// code index to the saved code index we mask it of to be in the [0:255]
|
5543
|
+
// range.
|
5544
|
+
static const int kCodeAgeMask = 0xff;
|
5153
5545
|
};
|
5154
5546
|
|
5155
5547
|
|
@@ -5295,6 +5687,49 @@ class CodeCacheHashTable: public HashTable<CodeCacheHashTableShape,
|
|
5295
5687
|
};
|
5296
5688
|
|
5297
5689
|
|
5690
|
+
class PolymorphicCodeCache: public Struct {
|
5691
|
+
public:
|
5692
|
+
DECL_ACCESSORS(cache, Object)
|
5693
|
+
|
5694
|
+
MUST_USE_RESULT MaybeObject* Update(MapList* maps,
|
5695
|
+
Code::Flags flags,
|
5696
|
+
Code* code);
|
5697
|
+
Object* Lookup(MapList* maps, Code::Flags flags);
|
5698
|
+
|
5699
|
+
static inline PolymorphicCodeCache* cast(Object* obj);
|
5700
|
+
|
5701
|
+
#ifdef OBJECT_PRINT
|
5702
|
+
inline void PolymorphicCodeCachePrint() {
|
5703
|
+
PolymorphicCodeCachePrint(stdout);
|
5704
|
+
}
|
5705
|
+
void PolymorphicCodeCachePrint(FILE* out);
|
5706
|
+
#endif
|
5707
|
+
#ifdef DEBUG
|
5708
|
+
void PolymorphicCodeCacheVerify();
|
5709
|
+
#endif
|
5710
|
+
|
5711
|
+
static const int kCacheOffset = HeapObject::kHeaderSize;
|
5712
|
+
static const int kSize = kCacheOffset + kPointerSize;
|
5713
|
+
|
5714
|
+
private:
|
5715
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCache);
|
5716
|
+
};
|
5717
|
+
|
5718
|
+
|
5719
|
+
class PolymorphicCodeCacheHashTable
|
5720
|
+
: public HashTable<CodeCacheHashTableShape, HashTableKey*> {
|
5721
|
+
public:
|
5722
|
+
Object* Lookup(MapList* maps, int code_kind);
|
5723
|
+
MUST_USE_RESULT MaybeObject* Put(MapList* maps, int code_kind, Code* code);
|
5724
|
+
|
5725
|
+
static inline PolymorphicCodeCacheHashTable* cast(Object* obj);
|
5726
|
+
|
5727
|
+
static const int kInitialSize = 64;
|
5728
|
+
private:
|
5729
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(PolymorphicCodeCacheHashTable);
|
5730
|
+
};
|
5731
|
+
|
5732
|
+
|
5298
5733
|
enum AllowNullsFlag {ALLOW_NULLS, DISALLOW_NULLS};
|
5299
5734
|
enum RobustnessFlag {ROBUST_STRING_TRAVERSAL, FAST_STRING_TRAVERSAL};
|
5300
5735
|
|
@@ -5333,7 +5768,6 @@ class StringHasher {
|
|
5333
5768
|
static uint32_t MakeArrayIndexHash(uint32_t value, int length);
|
5334
5769
|
|
5335
5770
|
private:
|
5336
|
-
|
5337
5771
|
uint32_t array_index() {
|
5338
5772
|
ASSERT(is_array_index());
|
5339
5773
|
return array_index_;
|
@@ -5375,12 +5809,15 @@ class StringShape BASE_EMBEDDED {
|
|
5375
5809
|
inline bool IsSequential();
|
5376
5810
|
inline bool IsExternal();
|
5377
5811
|
inline bool IsCons();
|
5812
|
+
inline bool IsSliced();
|
5813
|
+
inline bool IsIndirect();
|
5378
5814
|
inline bool IsExternalAscii();
|
5379
5815
|
inline bool IsExternalTwoByte();
|
5380
5816
|
inline bool IsSequentialAscii();
|
5381
5817
|
inline bool IsSequentialTwoByte();
|
5382
5818
|
inline bool IsSymbol();
|
5383
5819
|
inline StringRepresentationTag representation_tag();
|
5820
|
+
inline uint32_t encoding_tag();
|
5384
5821
|
inline uint32_t full_representation_tag();
|
5385
5822
|
inline uint32_t size_tag();
|
5386
5823
|
#ifdef DEBUG
|
@@ -5390,6 +5827,7 @@ class StringShape BASE_EMBEDDED {
|
|
5390
5827
|
#else
|
5391
5828
|
inline void invalidate() { }
|
5392
5829
|
#endif
|
5830
|
+
|
5393
5831
|
private:
|
5394
5832
|
uint32_t type_;
|
5395
5833
|
#ifdef DEBUG
|
@@ -5411,6 +5849,51 @@ class StringShape BASE_EMBEDDED {
|
|
5411
5849
|
// All string values have a length field.
|
5412
5850
|
class String: public HeapObject {
|
5413
5851
|
public:
|
5852
|
+
// Representation of the flat content of a String.
|
5853
|
+
// A non-flat string doesn't have flat content.
|
5854
|
+
// A flat string has content that's encoded as a sequence of either
|
5855
|
+
// ASCII chars or two-byte UC16.
|
5856
|
+
// Returned by String::GetFlatContent().
|
5857
|
+
class FlatContent {
|
5858
|
+
public:
|
5859
|
+
// Returns true if the string is flat and this structure contains content.
|
5860
|
+
bool IsFlat() { return state_ != NON_FLAT; }
|
5861
|
+
// Returns true if the structure contains ASCII content.
|
5862
|
+
bool IsAscii() { return state_ == ASCII; }
|
5863
|
+
// Returns true if the structure contains two-byte content.
|
5864
|
+
bool IsTwoByte() { return state_ == TWO_BYTE; }
|
5865
|
+
|
5866
|
+
// Return the ASCII content of the string. Only use if IsAscii() returns
|
5867
|
+
// true.
|
5868
|
+
Vector<const char> ToAsciiVector() {
|
5869
|
+
ASSERT_EQ(ASCII, state_);
|
5870
|
+
return Vector<const char>::cast(buffer_);
|
5871
|
+
}
|
5872
|
+
// Return the two-byte content of the string. Only use if IsTwoByte()
|
5873
|
+
// returns true.
|
5874
|
+
Vector<const uc16> ToUC16Vector() {
|
5875
|
+
ASSERT_EQ(TWO_BYTE, state_);
|
5876
|
+
return Vector<const uc16>::cast(buffer_);
|
5877
|
+
}
|
5878
|
+
|
5879
|
+
private:
|
5880
|
+
enum State { NON_FLAT, ASCII, TWO_BYTE };
|
5881
|
+
|
5882
|
+
// Constructors only used by String::GetFlatContent().
|
5883
|
+
explicit FlatContent(Vector<const char> chars)
|
5884
|
+
: buffer_(Vector<const byte>::cast(chars)),
|
5885
|
+
state_(ASCII) { }
|
5886
|
+
explicit FlatContent(Vector<const uc16> chars)
|
5887
|
+
: buffer_(Vector<const byte>::cast(chars)),
|
5888
|
+
state_(TWO_BYTE) { }
|
5889
|
+
FlatContent() : buffer_(), state_(NON_FLAT) { }
|
5890
|
+
|
5891
|
+
Vector<const byte> buffer_;
|
5892
|
+
State state_;
|
5893
|
+
|
5894
|
+
friend class String;
|
5895
|
+
};
|
5896
|
+
|
5414
5897
|
// Get and set the length of the string.
|
5415
5898
|
inline int length();
|
5416
5899
|
inline void set_length(int value);
|
@@ -5419,14 +5902,19 @@ class String: public HeapObject {
|
|
5419
5902
|
inline uint32_t hash_field();
|
5420
5903
|
inline void set_hash_field(uint32_t value);
|
5421
5904
|
|
5905
|
+
// Returns whether this string has only ASCII chars, i.e. all of them can
|
5906
|
+
// be ASCII encoded. This might be the case even if the string is
|
5907
|
+
// two-byte. Such strings may appear when the embedder prefers
|
5908
|
+
// two-byte external representations even for ASCII data.
|
5422
5909
|
inline bool IsAsciiRepresentation();
|
5423
5910
|
inline bool IsTwoByteRepresentation();
|
5424
5911
|
|
5425
|
-
//
|
5426
|
-
//
|
5427
|
-
//
|
5428
|
-
|
5429
|
-
|
5912
|
+
// Cons and slices have an encoding flag that may not represent the actual
|
5913
|
+
// encoding of the underlying string. This is taken into account here.
|
5914
|
+
// Requires: this->IsFlat()
|
5915
|
+
inline bool IsAsciiRepresentationUnderneath();
|
5916
|
+
inline bool IsTwoByteRepresentationUnderneath();
|
5917
|
+
|
5430
5918
|
// NOTE: this should be considered only a hint. False negatives are
|
5431
5919
|
// possible.
|
5432
5920
|
inline bool HasOnlyAsciiChars();
|
@@ -5459,8 +5947,16 @@ class String: public HeapObject {
|
|
5459
5947
|
// string.
|
5460
5948
|
inline String* TryFlattenGetString(PretenureFlag pretenure = NOT_TENURED);
|
5461
5949
|
|
5462
|
-
|
5463
|
-
|
5950
|
+
// Tries to return the content of a flat string as a structure holding either
|
5951
|
+
// a flat vector of char or of uc16.
|
5952
|
+
// If the string isn't flat, and therefore doesn't have flat content, the
|
5953
|
+
// returned structure will report so, and can't provide a vector of either
|
5954
|
+
// kind.
|
5955
|
+
FlatContent GetFlatContent();
|
5956
|
+
|
5957
|
+
// Returns the parent of a sliced string or first part of a flat cons string.
|
5958
|
+
// Requires: StringShape(this).IsIndirect() && this->IsFlat()
|
5959
|
+
inline String* GetUnderlying();
|
5464
5960
|
|
5465
5961
|
// Mark the string as an undetectable object. It only applies to
|
5466
5962
|
// ascii and two byte string types.
|
@@ -5541,6 +6037,8 @@ class String: public HeapObject {
|
|
5541
6037
|
StringPrint(stdout);
|
5542
6038
|
}
|
5543
6039
|
void StringPrint(FILE* out);
|
6040
|
+
|
6041
|
+
char* ToAsciiArray();
|
5544
6042
|
#endif
|
5545
6043
|
#ifdef DEBUG
|
5546
6044
|
void StringVerify();
|
@@ -5727,7 +6225,6 @@ class String: public HeapObject {
|
|
5727
6225
|
// The SeqString abstract class captures sequential string values.
|
5728
6226
|
class SeqString: public String {
|
5729
6227
|
public:
|
5730
|
-
|
5731
6228
|
// Casting.
|
5732
6229
|
static inline SeqString* cast(Object* obj);
|
5733
6230
|
|
@@ -5889,11 +6386,69 @@ class ConsString: public String {
|
|
5889
6386
|
typedef FixedBodyDescriptor<kFirstOffset, kSecondOffset + kPointerSize, kSize>
|
5890
6387
|
BodyDescriptor;
|
5891
6388
|
|
6389
|
+
#ifdef DEBUG
|
6390
|
+
void ConsStringVerify();
|
6391
|
+
#endif
|
6392
|
+
|
5892
6393
|
private:
|
5893
6394
|
DISALLOW_IMPLICIT_CONSTRUCTORS(ConsString);
|
5894
6395
|
};
|
5895
6396
|
|
5896
6397
|
|
6398
|
+
// The Sliced String class describes strings that are substrings of another
|
6399
|
+
// sequential string. The motivation is to save time and memory when creating
|
6400
|
+
// a substring. A Sliced String is described as a pointer to the parent,
|
6401
|
+
// the offset from the start of the parent string and the length. Using
|
6402
|
+
// a Sliced String therefore requires unpacking of the parent string and
|
6403
|
+
// adding the offset to the start address. A substring of a Sliced String
|
6404
|
+
// are not nested since the double indirection is simplified when creating
|
6405
|
+
// such a substring.
|
6406
|
+
// Currently missing features are:
|
6407
|
+
// - handling externalized parent strings
|
6408
|
+
// - external strings as parent
|
6409
|
+
// - truncating sliced string to enable otherwise unneeded parent to be GC'ed.
|
6410
|
+
class SlicedString: public String {
|
6411
|
+
public:
|
6412
|
+
|
6413
|
+
inline String* parent();
|
6414
|
+
inline void set_parent(String* parent);
|
6415
|
+
inline int offset();
|
6416
|
+
inline void set_offset(int offset);
|
6417
|
+
|
6418
|
+
// Dispatched behavior.
|
6419
|
+
uint16_t SlicedStringGet(int index);
|
6420
|
+
|
6421
|
+
// Casting.
|
6422
|
+
static inline SlicedString* cast(Object* obj);
|
6423
|
+
|
6424
|
+
// Layout description.
|
6425
|
+
static const int kParentOffset = POINTER_SIZE_ALIGN(String::kSize);
|
6426
|
+
static const int kOffsetOffset = kParentOffset + kPointerSize;
|
6427
|
+
static const int kSize = kOffsetOffset + kPointerSize;
|
6428
|
+
|
6429
|
+
// Support for StringInputBuffer
|
6430
|
+
inline const unibrow::byte* SlicedStringReadBlock(ReadBlockBuffer* buffer,
|
6431
|
+
unsigned* offset_ptr,
|
6432
|
+
unsigned chars);
|
6433
|
+
inline void SlicedStringReadBlockIntoBuffer(ReadBlockBuffer* buffer,
|
6434
|
+
unsigned* offset_ptr,
|
6435
|
+
unsigned chars);
|
6436
|
+
// Minimum length for a sliced string.
|
6437
|
+
static const int kMinLength = 13;
|
6438
|
+
|
6439
|
+
typedef FixedBodyDescriptor<kParentOffset,
|
6440
|
+
kOffsetOffset + kPointerSize, kSize>
|
6441
|
+
BodyDescriptor;
|
6442
|
+
|
6443
|
+
#ifdef DEBUG
|
6444
|
+
void SlicedStringVerify();
|
6445
|
+
#endif
|
6446
|
+
|
6447
|
+
private:
|
6448
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(SlicedString);
|
6449
|
+
};
|
6450
|
+
|
6451
|
+
|
5897
6452
|
// The ExternalString class describes string values that are backed by
|
5898
6453
|
// a string resource that lies outside the V8 heap. ExternalStrings
|
5899
6454
|
// consist of the length field common to all strings, a pointer to the
|
@@ -6162,14 +6717,37 @@ class JSGlobalPropertyCell: public HeapObject {
|
|
6162
6717
|
|
6163
6718
|
|
6164
6719
|
// The JSProxy describes EcmaScript Harmony proxies
|
6165
|
-
class JSProxy: public
|
6720
|
+
class JSProxy: public JSReceiver {
|
6166
6721
|
public:
|
6167
6722
|
// [handler]: The handler property.
|
6168
6723
|
DECL_ACCESSORS(handler, Object)
|
6169
6724
|
|
6725
|
+
// [padding]: The padding slot (unused, see below).
|
6726
|
+
DECL_ACCESSORS(padding, Object)
|
6727
|
+
|
6170
6728
|
// Casting.
|
6171
6729
|
static inline JSProxy* cast(Object* obj);
|
6172
6730
|
|
6731
|
+
bool HasPropertyWithHandler(String* name);
|
6732
|
+
|
6733
|
+
MUST_USE_RESULT MaybeObject* SetPropertyWithHandler(
|
6734
|
+
String* name,
|
6735
|
+
Object* value,
|
6736
|
+
PropertyAttributes attributes,
|
6737
|
+
StrictModeFlag strict_mode);
|
6738
|
+
|
6739
|
+
MUST_USE_RESULT MaybeObject* DeletePropertyWithHandler(
|
6740
|
+
String* name,
|
6741
|
+
DeleteMode mode);
|
6742
|
+
|
6743
|
+
MUST_USE_RESULT PropertyAttributes GetPropertyAttributeWithHandler(
|
6744
|
+
JSReceiver* receiver,
|
6745
|
+
String* name,
|
6746
|
+
bool* has_exception);
|
6747
|
+
|
6748
|
+
// Turn this into an (empty) JSObject.
|
6749
|
+
void Fix();
|
6750
|
+
|
6173
6751
|
// Dispatched behavior.
|
6174
6752
|
#ifdef OBJECT_PRINT
|
6175
6753
|
inline void JSProxyPrint() {
|
@@ -6181,9 +6759,14 @@ class JSProxy: public HeapObject {
|
|
6181
6759
|
void JSProxyVerify();
|
6182
6760
|
#endif
|
6183
6761
|
|
6184
|
-
// Layout description.
|
6762
|
+
// Layout description. We add padding so that a proxy has the same
|
6763
|
+
// size as a virgin JSObject. This is essential for becoming a JSObject
|
6764
|
+
// upon freeze.
|
6185
6765
|
static const int kHandlerOffset = HeapObject::kHeaderSize;
|
6186
|
-
static const int
|
6766
|
+
static const int kPaddingOffset = kHandlerOffset + kPointerSize;
|
6767
|
+
static const int kSize = kPaddingOffset + kPointerSize;
|
6768
|
+
|
6769
|
+
STATIC_CHECK(kSize == JSObject::kHeaderSize);
|
6187
6770
|
|
6188
6771
|
typedef FixedBodyDescriptor<kHandlerOffset,
|
6189
6772
|
kHandlerOffset + kPointerSize,
|
@@ -6194,6 +6777,50 @@ class JSProxy: public HeapObject {
|
|
6194
6777
|
};
|
6195
6778
|
|
6196
6779
|
|
6780
|
+
// TODO(rossberg): Only a stub for now.
|
6781
|
+
class JSFunctionProxy: public JSProxy {
|
6782
|
+
public:
|
6783
|
+
// Casting.
|
6784
|
+
static inline JSFunctionProxy* cast(Object* obj);
|
6785
|
+
|
6786
|
+
private:
|
6787
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(JSFunctionProxy);
|
6788
|
+
};
|
6789
|
+
|
6790
|
+
|
6791
|
+
// The JSWeakMap describes EcmaScript Harmony weak maps
|
6792
|
+
class JSWeakMap: public JSObject {
|
6793
|
+
public:
|
6794
|
+
// [table]: the backing hash table mapping keys to values.
|
6795
|
+
DECL_ACCESSORS(table, ObjectHashTable)
|
6796
|
+
|
6797
|
+
// [next]: linked list of encountered weak maps during GC.
|
6798
|
+
DECL_ACCESSORS(next, Object)
|
6799
|
+
|
6800
|
+
// Unchecked accessors to be used during GC.
|
6801
|
+
inline ObjectHashTable* unchecked_table();
|
6802
|
+
|
6803
|
+
// Casting.
|
6804
|
+
static inline JSWeakMap* cast(Object* obj);
|
6805
|
+
|
6806
|
+
#ifdef OBJECT_PRINT
|
6807
|
+
inline void JSWeakMapPrint() {
|
6808
|
+
JSWeakMapPrint(stdout);
|
6809
|
+
}
|
6810
|
+
void JSWeakMapPrint(FILE* out);
|
6811
|
+
#endif
|
6812
|
+
#ifdef DEBUG
|
6813
|
+
void JSWeakMapVerify();
|
6814
|
+
#endif
|
6815
|
+
|
6816
|
+
static const int kTableOffset = JSObject::kHeaderSize;
|
6817
|
+
static const int kNextOffset = kTableOffset + kPointerSize;
|
6818
|
+
static const int kSize = kNextOffset + kPointerSize;
|
6819
|
+
|
6820
|
+
private:
|
6821
|
+
DISALLOW_IMPLICIT_CONSTRUCTORS(JSWeakMap);
|
6822
|
+
};
|
6823
|
+
|
6197
6824
|
|
6198
6825
|
// Foreign describes objects pointing from JavaScript to C structures.
|
6199
6826
|
// Since they cannot contain references to JS HeapObjects they can be
|
@@ -6501,6 +7128,7 @@ class FunctionTemplateInfo: public TemplateInfo {
|
|
6501
7128
|
// If the bit is set, object instances created by this function
|
6502
7129
|
// requires access check.
|
6503
7130
|
DECL_BOOLEAN_ACCESSORS(needs_access_check)
|
7131
|
+
DECL_BOOLEAN_ACCESSORS(read_only_prototype)
|
6504
7132
|
|
6505
7133
|
static inline FunctionTemplateInfo* cast(Object* obj);
|
6506
7134
|
|
@@ -6540,6 +7168,7 @@ class FunctionTemplateInfo: public TemplateInfo {
|
|
6540
7168
|
static const int kHiddenPrototypeBit = 0;
|
6541
7169
|
static const int kUndetectableBit = 1;
|
6542
7170
|
static const int kNeedsAccessCheckBit = 2;
|
7171
|
+
static const int kReadOnlyPrototypeBit = 3;
|
6543
7172
|
|
6544
7173
|
DISALLOW_IMPLICIT_CONSTRUCTORS(FunctionTemplateInfo);
|
6545
7174
|
};
|