libv8 3.3.10.4 → 3.5.10.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
|
@@ -97,14 +97,17 @@ const char* V8NameConverter::NameInCode(byte* addr) const {
|
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
|
|
100
|
-
static void DumpBuffer(FILE* f,
|
|
100
|
+
static void DumpBuffer(FILE* f, StringBuilder* out) {
|
|
101
101
|
if (f == NULL) {
|
|
102
|
-
PrintF("%s",
|
|
102
|
+
PrintF("%s\n", out->Finalize());
|
|
103
103
|
} else {
|
|
104
|
-
fprintf(f, "%s",
|
|
104
|
+
fprintf(f, "%s\n", out->Finalize());
|
|
105
105
|
}
|
|
106
|
+
out->Reset();
|
|
106
107
|
}
|
|
107
108
|
|
|
109
|
+
|
|
110
|
+
|
|
108
111
|
static const int kOutBufferSize = 2048 + String::kMaxShortPrintLength;
|
|
109
112
|
static const int kRelocInfoPosition = 57;
|
|
110
113
|
|
|
@@ -119,6 +122,7 @@ static int DecodeIt(FILE* f,
|
|
|
119
122
|
|
|
120
123
|
v8::internal::EmbeddedVector<char, 128> decode_buffer;
|
|
121
124
|
v8::internal::EmbeddedVector<char, kOutBufferSize> out_buffer;
|
|
125
|
+
StringBuilder out(out_buffer.start(), out_buffer.length());
|
|
122
126
|
byte* pc = begin;
|
|
123
127
|
disasm::Disassembler d(converter);
|
|
124
128
|
RelocIterator* it = NULL;
|
|
@@ -181,17 +185,12 @@ static int DecodeIt(FILE* f,
|
|
|
181
185
|
}
|
|
182
186
|
}
|
|
183
187
|
|
|
184
|
-
StringBuilder out(out_buffer.start(), out_buffer.length());
|
|
185
|
-
|
|
186
188
|
// Comments.
|
|
187
189
|
for (int i = 0; i < comments.length(); i++) {
|
|
188
|
-
out.AddFormatted(" %s
|
|
190
|
+
out.AddFormatted(" %s", comments[i]);
|
|
191
|
+
DumpBuffer(f, &out);
|
|
189
192
|
}
|
|
190
193
|
|
|
191
|
-
// Write out comments, resets outp so that we can format the next line.
|
|
192
|
-
DumpBuffer(f, out.Finalize());
|
|
193
|
-
out.Reset();
|
|
194
|
-
|
|
195
194
|
// Instruction address and instruction offset.
|
|
196
195
|
out.AddFormatted("%p %4d ", prev_pc, prev_pc - begin);
|
|
197
196
|
|
|
@@ -209,7 +208,7 @@ static int DecodeIt(FILE* f,
|
|
|
209
208
|
out.AddPadding(' ', kRelocInfoPosition - out.position());
|
|
210
209
|
} else {
|
|
211
210
|
// Additional reloc infos are printed on separate lines.
|
|
212
|
-
out
|
|
211
|
+
DumpBuffer(f, &out);
|
|
213
212
|
out.AddPadding(' ', kRelocInfoPosition);
|
|
214
213
|
}
|
|
215
214
|
|
|
@@ -299,9 +298,18 @@ static int DecodeIt(FILE* f,
|
|
|
299
298
|
out.AddFormatted(" ;; %s", RelocInfo::RelocModeName(rmode));
|
|
300
299
|
}
|
|
301
300
|
}
|
|
302
|
-
out
|
|
303
|
-
|
|
304
|
-
|
|
301
|
+
DumpBuffer(f, &out);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Emit comments following the last instruction (if any).
|
|
305
|
+
if (it != NULL) {
|
|
306
|
+
for ( ; !it->done(); it->next()) {
|
|
307
|
+
if (RelocInfo::IsComment(it->rinfo()->rmode())) {
|
|
308
|
+
out.AddFormatted(" %s",
|
|
309
|
+
reinterpret_cast<const char*>(it->rinfo()->data()));
|
|
310
|
+
DumpBuffer(f, &out);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
305
313
|
}
|
|
306
314
|
|
|
307
315
|
delete it;
|
data/lib/libv8/v8/src/diy-fp.cc
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
|
3
3
|
// modification, are permitted provided that the following conditions are
|
|
4
4
|
// met:
|
|
@@ -25,8 +25,9 @@
|
|
|
25
25
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
26
26
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
27
|
|
|
28
|
-
#include "
|
|
29
|
-
|
|
28
|
+
#include "../include/v8stdint.h"
|
|
29
|
+
#include "globals.h"
|
|
30
|
+
#include "checks.h"
|
|
30
31
|
#include "diy-fp.h"
|
|
31
32
|
|
|
32
33
|
namespace v8 {
|
data/lib/libv8/v8/src/diy-fp.h
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
|
3
3
|
// modification, are permitted provided that the following conditions are
|
|
4
4
|
// met:
|
|
@@ -80,7 +80,7 @@ class DiyFp {
|
|
|
80
80
|
|
|
81
81
|
// This method is mainly called for normalizing boundaries. In general
|
|
82
82
|
// boundaries need to be shifted by 10 bits. We thus optimize for this case.
|
|
83
|
-
const uint64_t k10MSBits =
|
|
83
|
+
const uint64_t k10MSBits = static_cast<uint64_t>(0x3FF) << 54;
|
|
84
84
|
while ((f & k10MSBits) == 0) {
|
|
85
85
|
f <<= 10;
|
|
86
86
|
e -= 10;
|
|
@@ -106,7 +106,7 @@ class DiyFp {
|
|
|
106
106
|
void set_e(int new_value) { e_ = new_value; }
|
|
107
107
|
|
|
108
108
|
private:
|
|
109
|
-
static const uint64_t kUint64MSB =
|
|
109
|
+
static const uint64_t kUint64MSB = static_cast<uint64_t>(1) << 63;
|
|
110
110
|
|
|
111
111
|
uint64_t f_;
|
|
112
112
|
int e_;
|
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
|
3
|
+
// modification, are permitted provided that the following conditions are
|
|
4
|
+
// met:
|
|
5
|
+
//
|
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
|
9
|
+
// copyright notice, this list of conditions and the following
|
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
|
11
|
+
// with the distribution.
|
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
|
13
|
+
// contributors may be used to endorse or promote products derived
|
|
14
|
+
// from this software without specific prior written permission.
|
|
15
|
+
//
|
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
27
|
+
|
|
28
|
+
#include "v8.h"
|
|
29
|
+
|
|
30
|
+
#include "objects.h"
|
|
31
|
+
#include "elements.h"
|
|
32
|
+
#include "utils.h"
|
|
33
|
+
|
|
34
|
+
namespace v8 {
|
|
35
|
+
namespace internal {
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
ElementsAccessor** ElementsAccessor::elements_accessors_;
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
bool HasKey(FixedArray* array, Object* key) {
|
|
42
|
+
int len0 = array->length();
|
|
43
|
+
for (int i = 0; i < len0; i++) {
|
|
44
|
+
Object* element = array->get(i);
|
|
45
|
+
if (element->IsSmi() && element == key) return true;
|
|
46
|
+
if (element->IsString() &&
|
|
47
|
+
key->IsString() && String::cast(element)->Equals(String::cast(key))) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
// Base class for element handler implementations. Contains the
|
|
56
|
+
// the common logic for objects with different ElementsKinds.
|
|
57
|
+
// Subclasses must specialize method for which the element
|
|
58
|
+
// implementation differs from the base class implementation.
|
|
59
|
+
//
|
|
60
|
+
// This class is intended to be used in the following way:
|
|
61
|
+
//
|
|
62
|
+
// class SomeElementsAccessor :
|
|
63
|
+
// public ElementsAccessorBase<SomeElementsAccessor,
|
|
64
|
+
// BackingStoreClass> {
|
|
65
|
+
// ...
|
|
66
|
+
// }
|
|
67
|
+
//
|
|
68
|
+
// This is an example of the Curiously Recurring Template Pattern (see
|
|
69
|
+
// http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). We use
|
|
70
|
+
// CRTP to guarantee aggressive compile time optimizations (i.e. inlining and
|
|
71
|
+
// specialization of SomeElementsAccessor methods).
|
|
72
|
+
template <typename ElementsAccessorSubclass, typename BackingStoreClass>
|
|
73
|
+
class ElementsAccessorBase : public ElementsAccessor {
|
|
74
|
+
protected:
|
|
75
|
+
ElementsAccessorBase() { }
|
|
76
|
+
virtual MaybeObject* Get(FixedArrayBase* backing_store,
|
|
77
|
+
uint32_t key,
|
|
78
|
+
JSObject* obj,
|
|
79
|
+
Object* receiver) {
|
|
80
|
+
return ElementsAccessorSubclass::Get(
|
|
81
|
+
BackingStoreClass::cast(backing_store), key, obj, receiver);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
static MaybeObject* Get(BackingStoreClass* backing_store,
|
|
85
|
+
uint32_t key,
|
|
86
|
+
JSObject* obj,
|
|
87
|
+
Object* receiver) {
|
|
88
|
+
if (key < ElementsAccessorSubclass::GetCapacity(backing_store)) {
|
|
89
|
+
return backing_store->get(key);
|
|
90
|
+
}
|
|
91
|
+
return backing_store->GetHeap()->the_hole_value();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
95
|
+
uint32_t key,
|
|
96
|
+
JSReceiver::DeleteMode mode) = 0;
|
|
97
|
+
|
|
98
|
+
virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from,
|
|
99
|
+
FixedArray* to,
|
|
100
|
+
JSObject* holder,
|
|
101
|
+
Object* receiver) {
|
|
102
|
+
int len0 = to->length();
|
|
103
|
+
#ifdef DEBUG
|
|
104
|
+
if (FLAG_enable_slow_asserts) {
|
|
105
|
+
for (int i = 0; i < len0; i++) {
|
|
106
|
+
ASSERT(!to->get(i)->IsTheHole());
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
#endif
|
|
110
|
+
BackingStoreClass* backing_store = BackingStoreClass::cast(from);
|
|
111
|
+
uint32_t len1 = ElementsAccessorSubclass::GetCapacity(backing_store);
|
|
112
|
+
|
|
113
|
+
// Optimize if 'other' is empty.
|
|
114
|
+
// We cannot optimize if 'this' is empty, as other may have holes.
|
|
115
|
+
if (len1 == 0) return to;
|
|
116
|
+
|
|
117
|
+
// Compute how many elements are not in other.
|
|
118
|
+
int extra = 0;
|
|
119
|
+
for (uint32_t y = 0; y < len1; y++) {
|
|
120
|
+
if (ElementsAccessorSubclass::HasElementAtIndex(backing_store,
|
|
121
|
+
y,
|
|
122
|
+
holder,
|
|
123
|
+
receiver)) {
|
|
124
|
+
uint32_t key =
|
|
125
|
+
ElementsAccessorSubclass::GetKeyForIndex(backing_store, y);
|
|
126
|
+
MaybeObject* maybe_value =
|
|
127
|
+
ElementsAccessorSubclass::Get(backing_store, key, holder, receiver);
|
|
128
|
+
Object* value;
|
|
129
|
+
if (!maybe_value->ToObject(&value)) return maybe_value;
|
|
130
|
+
ASSERT(!value->IsTheHole());
|
|
131
|
+
if (!HasKey(to, value)) {
|
|
132
|
+
extra++;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (extra == 0) return to;
|
|
138
|
+
|
|
139
|
+
// Allocate the result
|
|
140
|
+
FixedArray* result;
|
|
141
|
+
MaybeObject* maybe_obj =
|
|
142
|
+
backing_store->GetHeap()->AllocateFixedArray(len0 + extra);
|
|
143
|
+
if (!maybe_obj->To<FixedArray>(&result)) return maybe_obj;
|
|
144
|
+
|
|
145
|
+
// Fill in the content
|
|
146
|
+
{
|
|
147
|
+
AssertNoAllocation no_gc;
|
|
148
|
+
WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
|
|
149
|
+
for (int i = 0; i < len0; i++) {
|
|
150
|
+
Object* e = to->get(i);
|
|
151
|
+
ASSERT(e->IsString() || e->IsNumber());
|
|
152
|
+
result->set(i, e, mode);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
// Fill in the extra values.
|
|
156
|
+
int index = 0;
|
|
157
|
+
for (uint32_t y = 0; y < len1; y++) {
|
|
158
|
+
if (ElementsAccessorSubclass::HasElementAtIndex(backing_store,
|
|
159
|
+
y,
|
|
160
|
+
holder,
|
|
161
|
+
receiver)) {
|
|
162
|
+
uint32_t key =
|
|
163
|
+
ElementsAccessorSubclass::GetKeyForIndex(backing_store, y);
|
|
164
|
+
MaybeObject* maybe_value =
|
|
165
|
+
ElementsAccessorSubclass::Get(backing_store, key, holder, receiver);
|
|
166
|
+
Object* value;
|
|
167
|
+
if (!maybe_value->ToObject(&value)) return maybe_value;
|
|
168
|
+
if (!value->IsTheHole() && !HasKey(to, value)) {
|
|
169
|
+
result->set(len0 + index, value);
|
|
170
|
+
index++;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
ASSERT(extra == index);
|
|
175
|
+
return result;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
protected:
|
|
179
|
+
static uint32_t GetCapacity(BackingStoreClass* backing_store) {
|
|
180
|
+
return backing_store->length();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
virtual uint32_t GetCapacity(FixedArrayBase* backing_store) {
|
|
184
|
+
return ElementsAccessorSubclass::GetCapacity(
|
|
185
|
+
BackingStoreClass::cast(backing_store));
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
static bool HasElementAtIndex(BackingStoreClass* backing_store,
|
|
189
|
+
uint32_t index,
|
|
190
|
+
JSObject* holder,
|
|
191
|
+
Object* receiver) {
|
|
192
|
+
uint32_t key =
|
|
193
|
+
ElementsAccessorSubclass::GetKeyForIndex(backing_store, index);
|
|
194
|
+
MaybeObject* element = ElementsAccessorSubclass::Get(backing_store,
|
|
195
|
+
key,
|
|
196
|
+
holder,
|
|
197
|
+
receiver);
|
|
198
|
+
return !element->IsTheHole();
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
virtual bool HasElementAtIndex(FixedArrayBase* backing_store,
|
|
202
|
+
uint32_t index,
|
|
203
|
+
JSObject* holder,
|
|
204
|
+
Object* receiver) {
|
|
205
|
+
return ElementsAccessorSubclass::HasElementAtIndex(
|
|
206
|
+
BackingStoreClass::cast(backing_store), index, holder, receiver);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
static uint32_t GetKeyForIndex(BackingStoreClass* backing_store,
|
|
210
|
+
uint32_t index) {
|
|
211
|
+
return index;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
|
|
215
|
+
uint32_t index) {
|
|
216
|
+
return ElementsAccessorSubclass::GetKeyForIndex(
|
|
217
|
+
BackingStoreClass::cast(backing_store), index);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
private:
|
|
221
|
+
DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase);
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
class FastElementsAccessor
|
|
226
|
+
: public ElementsAccessorBase<FastElementsAccessor, FixedArray> {
|
|
227
|
+
public:
|
|
228
|
+
static MaybeObject* DeleteCommon(JSObject* obj,
|
|
229
|
+
uint32_t key) {
|
|
230
|
+
ASSERT(obj->HasFastElements() || obj->HasFastArgumentsElements());
|
|
231
|
+
Heap* heap = obj->GetHeap();
|
|
232
|
+
FixedArray* backing_store = FixedArray::cast(obj->elements());
|
|
233
|
+
if (backing_store->map() == heap->non_strict_arguments_elements_map()) {
|
|
234
|
+
backing_store = FixedArray::cast(backing_store->get(1));
|
|
235
|
+
} else {
|
|
236
|
+
Object* writable;
|
|
237
|
+
MaybeObject* maybe = obj->EnsureWritableFastElements();
|
|
238
|
+
if (!maybe->ToObject(&writable)) return maybe;
|
|
239
|
+
backing_store = FixedArray::cast(writable);
|
|
240
|
+
}
|
|
241
|
+
uint32_t length = static_cast<uint32_t>(
|
|
242
|
+
obj->IsJSArray()
|
|
243
|
+
? Smi::cast(JSArray::cast(obj)->length())->value()
|
|
244
|
+
: backing_store->length());
|
|
245
|
+
if (key < length) {
|
|
246
|
+
backing_store->set_the_hole(key);
|
|
247
|
+
// If an old space backing store is larger than a certain size and
|
|
248
|
+
// has too few used values, normalize it.
|
|
249
|
+
// To avoid doing the check on every delete we require at least
|
|
250
|
+
// one adjacent hole to the value being deleted.
|
|
251
|
+
Object* hole = heap->the_hole_value();
|
|
252
|
+
const int kMinLengthForSparsenessCheck = 64;
|
|
253
|
+
if (backing_store->length() >= kMinLengthForSparsenessCheck &&
|
|
254
|
+
!heap->InNewSpace(backing_store) &&
|
|
255
|
+
((key > 0 && backing_store->get(key - 1) == hole) ||
|
|
256
|
+
(key + 1 < length && backing_store->get(key + 1) == hole))) {
|
|
257
|
+
int num_used = 0;
|
|
258
|
+
for (int i = 0; i < backing_store->length(); ++i) {
|
|
259
|
+
if (backing_store->get(i) != hole) ++num_used;
|
|
260
|
+
// Bail out early if more than 1/4 is used.
|
|
261
|
+
if (4 * num_used > backing_store->length()) break;
|
|
262
|
+
}
|
|
263
|
+
if (4 * num_used <= backing_store->length()) {
|
|
264
|
+
MaybeObject* result = obj->NormalizeElements();
|
|
265
|
+
if (result->IsFailure()) return result;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return heap->true_value();
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
protected:
|
|
273
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
274
|
+
uint32_t key,
|
|
275
|
+
JSReceiver::DeleteMode mode) {
|
|
276
|
+
return DeleteCommon(obj, key);
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
class FastDoubleElementsAccessor
|
|
282
|
+
: public ElementsAccessorBase<FastDoubleElementsAccessor,
|
|
283
|
+
FixedDoubleArray> {
|
|
284
|
+
protected:
|
|
285
|
+
friend class ElementsAccessorBase<FastDoubleElementsAccessor,
|
|
286
|
+
FixedDoubleArray>;
|
|
287
|
+
|
|
288
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
289
|
+
uint32_t key,
|
|
290
|
+
JSReceiver::DeleteMode mode) {
|
|
291
|
+
int length = obj->IsJSArray()
|
|
292
|
+
? Smi::cast(JSArray::cast(obj)->length())->value()
|
|
293
|
+
: FixedDoubleArray::cast(obj->elements())->length();
|
|
294
|
+
if (key < static_cast<uint32_t>(length)) {
|
|
295
|
+
FixedDoubleArray::cast(obj->elements())->set_the_hole(key);
|
|
296
|
+
}
|
|
297
|
+
return obj->GetHeap()->true_value();
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
static bool HasElementAtIndex(FixedDoubleArray* backing_store,
|
|
301
|
+
uint32_t index,
|
|
302
|
+
JSObject* holder,
|
|
303
|
+
Object* receiver) {
|
|
304
|
+
return !backing_store->is_the_hole(index);
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
// Super class for all external element arrays.
|
|
310
|
+
template<typename ExternalElementsAccessorSubclass,
|
|
311
|
+
typename ExternalArray>
|
|
312
|
+
class ExternalElementsAccessor
|
|
313
|
+
: public ElementsAccessorBase<ExternalElementsAccessorSubclass,
|
|
314
|
+
ExternalArray> {
|
|
315
|
+
protected:
|
|
316
|
+
friend class ElementsAccessorBase<ExternalElementsAccessorSubclass,
|
|
317
|
+
ExternalArray>;
|
|
318
|
+
|
|
319
|
+
static MaybeObject* Get(ExternalArray* backing_store,
|
|
320
|
+
uint32_t key,
|
|
321
|
+
JSObject* obj,
|
|
322
|
+
Object* receiver) {
|
|
323
|
+
if (key < ExternalElementsAccessorSubclass::GetCapacity(backing_store)) {
|
|
324
|
+
return backing_store->get(key);
|
|
325
|
+
} else {
|
|
326
|
+
return backing_store->GetHeap()->undefined_value();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
331
|
+
uint32_t key,
|
|
332
|
+
JSReceiver::DeleteMode mode) {
|
|
333
|
+
// External arrays always ignore deletes.
|
|
334
|
+
return obj->GetHeap()->true_value();
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
class ExternalByteElementsAccessor
|
|
340
|
+
: public ExternalElementsAccessor<ExternalByteElementsAccessor,
|
|
341
|
+
ExternalByteArray> {
|
|
342
|
+
};
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
class ExternalUnsignedByteElementsAccessor
|
|
346
|
+
: public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor,
|
|
347
|
+
ExternalUnsignedByteArray> {
|
|
348
|
+
};
|
|
349
|
+
|
|
350
|
+
|
|
351
|
+
class ExternalShortElementsAccessor
|
|
352
|
+
: public ExternalElementsAccessor<ExternalShortElementsAccessor,
|
|
353
|
+
ExternalShortArray> {
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
class ExternalUnsignedShortElementsAccessor
|
|
358
|
+
: public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor,
|
|
359
|
+
ExternalUnsignedShortArray> {
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
class ExternalIntElementsAccessor
|
|
364
|
+
: public ExternalElementsAccessor<ExternalIntElementsAccessor,
|
|
365
|
+
ExternalIntArray> {
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
class ExternalUnsignedIntElementsAccessor
|
|
370
|
+
: public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor,
|
|
371
|
+
ExternalUnsignedIntArray> {
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class ExternalFloatElementsAccessor
|
|
376
|
+
: public ExternalElementsAccessor<ExternalFloatElementsAccessor,
|
|
377
|
+
ExternalFloatArray> {
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
class ExternalDoubleElementsAccessor
|
|
382
|
+
: public ExternalElementsAccessor<ExternalDoubleElementsAccessor,
|
|
383
|
+
ExternalDoubleArray> {
|
|
384
|
+
};
|
|
385
|
+
|
|
386
|
+
|
|
387
|
+
class PixelElementsAccessor
|
|
388
|
+
: public ExternalElementsAccessor<PixelElementsAccessor,
|
|
389
|
+
ExternalPixelArray> {
|
|
390
|
+
};
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
class DictionaryElementsAccessor
|
|
394
|
+
: public ElementsAccessorBase<DictionaryElementsAccessor,
|
|
395
|
+
NumberDictionary> {
|
|
396
|
+
public:
|
|
397
|
+
static MaybeObject* DeleteCommon(JSObject* obj,
|
|
398
|
+
uint32_t key,
|
|
399
|
+
JSReceiver::DeleteMode mode) {
|
|
400
|
+
Isolate* isolate = obj->GetIsolate();
|
|
401
|
+
Heap* heap = isolate->heap();
|
|
402
|
+
FixedArray* backing_store = FixedArray::cast(obj->elements());
|
|
403
|
+
bool is_arguments =
|
|
404
|
+
(obj->GetElementsKind() == JSObject::NON_STRICT_ARGUMENTS_ELEMENTS);
|
|
405
|
+
if (is_arguments) {
|
|
406
|
+
backing_store = FixedArray::cast(backing_store->get(1));
|
|
407
|
+
}
|
|
408
|
+
NumberDictionary* dictionary = NumberDictionary::cast(backing_store);
|
|
409
|
+
int entry = dictionary->FindEntry(key);
|
|
410
|
+
if (entry != NumberDictionary::kNotFound) {
|
|
411
|
+
Object* result = dictionary->DeleteProperty(entry, mode);
|
|
412
|
+
if (result == heap->true_value()) {
|
|
413
|
+
MaybeObject* maybe_elements = dictionary->Shrink(key);
|
|
414
|
+
FixedArray* new_elements = NULL;
|
|
415
|
+
if (!maybe_elements->To(&new_elements)) {
|
|
416
|
+
return maybe_elements;
|
|
417
|
+
}
|
|
418
|
+
if (is_arguments) {
|
|
419
|
+
FixedArray::cast(obj->elements())->set(1, new_elements);
|
|
420
|
+
} else {
|
|
421
|
+
obj->set_elements(new_elements);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
if (mode == JSObject::STRICT_DELETION &&
|
|
425
|
+
result == heap->false_value()) {
|
|
426
|
+
// In strict mode, attempting to delete a non-configurable property
|
|
427
|
+
// throws an exception.
|
|
428
|
+
HandleScope scope(isolate);
|
|
429
|
+
Handle<Object> holder(obj);
|
|
430
|
+
Handle<Object> name = isolate->factory()->NewNumberFromUint(key);
|
|
431
|
+
Handle<Object> args[2] = { name, holder };
|
|
432
|
+
Handle<Object> error =
|
|
433
|
+
isolate->factory()->NewTypeError("strict_delete_property",
|
|
434
|
+
HandleVector(args, 2));
|
|
435
|
+
return isolate->Throw(*error);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
return heap->true_value();
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
protected:
|
|
442
|
+
friend class ElementsAccessorBase<DictionaryElementsAccessor,
|
|
443
|
+
NumberDictionary>;
|
|
444
|
+
|
|
445
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
446
|
+
uint32_t key,
|
|
447
|
+
JSReceiver::DeleteMode mode) {
|
|
448
|
+
return DeleteCommon(obj, key, mode);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
static MaybeObject* Get(NumberDictionary* backing_store,
|
|
452
|
+
uint32_t key,
|
|
453
|
+
JSObject* obj,
|
|
454
|
+
Object* receiver) {
|
|
455
|
+
int entry = backing_store->FindEntry(key);
|
|
456
|
+
if (entry != NumberDictionary::kNotFound) {
|
|
457
|
+
Object* element = backing_store->ValueAt(entry);
|
|
458
|
+
PropertyDetails details = backing_store->DetailsAt(entry);
|
|
459
|
+
if (details.type() == CALLBACKS) {
|
|
460
|
+
return obj->GetElementWithCallback(receiver,
|
|
461
|
+
element,
|
|
462
|
+
key,
|
|
463
|
+
obj);
|
|
464
|
+
} else {
|
|
465
|
+
return element;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return obj->GetHeap()->the_hole_value();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
static uint32_t GetKeyForIndex(NumberDictionary* dict,
|
|
472
|
+
uint32_t index) {
|
|
473
|
+
Object* key = dict->KeyAt(index);
|
|
474
|
+
return Smi::cast(key)->value();
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
class NonStrictArgumentsElementsAccessor
|
|
480
|
+
: public ElementsAccessorBase<NonStrictArgumentsElementsAccessor,
|
|
481
|
+
FixedArray> {
|
|
482
|
+
protected:
|
|
483
|
+
friend class ElementsAccessorBase<NonStrictArgumentsElementsAccessor,
|
|
484
|
+
FixedArray>;
|
|
485
|
+
|
|
486
|
+
static MaybeObject* Get(FixedArray* parameter_map,
|
|
487
|
+
uint32_t key,
|
|
488
|
+
JSObject* obj,
|
|
489
|
+
Object* receiver) {
|
|
490
|
+
Object* probe = GetParameterMapArg(parameter_map, key);
|
|
491
|
+
if (!probe->IsTheHole()) {
|
|
492
|
+
Context* context = Context::cast(parameter_map->get(0));
|
|
493
|
+
int context_index = Smi::cast(probe)->value();
|
|
494
|
+
ASSERT(!context->get(context_index)->IsTheHole());
|
|
495
|
+
return context->get(context_index);
|
|
496
|
+
} else {
|
|
497
|
+
// Object is not mapped, defer to the arguments.
|
|
498
|
+
FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
|
499
|
+
return ElementsAccessor::ForArray(arguments)->Get(arguments,
|
|
500
|
+
key,
|
|
501
|
+
obj,
|
|
502
|
+
receiver);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
virtual MaybeObject* Delete(JSObject* obj,
|
|
507
|
+
uint32_t key
|
|
508
|
+
,
|
|
509
|
+
JSReceiver::DeleteMode mode) {
|
|
510
|
+
FixedArray* parameter_map = FixedArray::cast(obj->elements());
|
|
511
|
+
Object* probe = GetParameterMapArg(parameter_map, key);
|
|
512
|
+
if (!probe->IsTheHole()) {
|
|
513
|
+
// TODO(kmillikin): We could check if this was the last aliased
|
|
514
|
+
// parameter, and revert to normal elements in that case. That
|
|
515
|
+
// would enable GC of the context.
|
|
516
|
+
parameter_map->set_the_hole(key + 2);
|
|
517
|
+
} else {
|
|
518
|
+
FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
|
|
519
|
+
if (arguments->IsDictionary()) {
|
|
520
|
+
return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
|
|
521
|
+
} else {
|
|
522
|
+
return FastElementsAccessor::DeleteCommon(obj, key);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
return obj->GetHeap()->true_value();
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
static uint32_t GetCapacity(FixedArray* parameter_map) {
|
|
529
|
+
FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
|
|
530
|
+
return Max(static_cast<uint32_t>(parameter_map->length() - 2),
|
|
531
|
+
ForArray(arguments)->GetCapacity(arguments));
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
static uint32_t GetKeyForIndex(FixedArray* dict,
|
|
535
|
+
uint32_t index) {
|
|
536
|
+
return index;
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
static bool HasElementAtIndex(FixedArray* parameter_map,
|
|
540
|
+
uint32_t index,
|
|
541
|
+
JSObject* holder,
|
|
542
|
+
Object* receiver) {
|
|
543
|
+
Object* probe = GetParameterMapArg(parameter_map, index);
|
|
544
|
+
if (!probe->IsTheHole()) {
|
|
545
|
+
return true;
|
|
546
|
+
} else {
|
|
547
|
+
FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
|
|
548
|
+
ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
|
|
549
|
+
return !accessor->Get(arguments, index, holder, receiver)->IsTheHole();
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
private:
|
|
554
|
+
static Object* GetParameterMapArg(FixedArray* parameter_map,
|
|
555
|
+
uint32_t key) {
|
|
556
|
+
uint32_t length = parameter_map->length();
|
|
557
|
+
return key < (length - 2 )
|
|
558
|
+
? parameter_map->get(key + 2)
|
|
559
|
+
: parameter_map->GetHeap()->the_hole_value();
|
|
560
|
+
}
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
|
|
564
|
+
ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) {
|
|
565
|
+
switch (array->map()->instance_type()) {
|
|
566
|
+
case FIXED_ARRAY_TYPE:
|
|
567
|
+
if (array->IsDictionary()) {
|
|
568
|
+
return elements_accessors_[JSObject::DICTIONARY_ELEMENTS];
|
|
569
|
+
} else {
|
|
570
|
+
return elements_accessors_[JSObject::FAST_ELEMENTS];
|
|
571
|
+
}
|
|
572
|
+
case EXTERNAL_BYTE_ARRAY_TYPE:
|
|
573
|
+
return elements_accessors_[JSObject::EXTERNAL_BYTE_ELEMENTS];
|
|
574
|
+
case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
|
|
575
|
+
return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS];
|
|
576
|
+
case EXTERNAL_SHORT_ARRAY_TYPE:
|
|
577
|
+
return elements_accessors_[JSObject::EXTERNAL_SHORT_ELEMENTS];
|
|
578
|
+
case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
|
|
579
|
+
return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS];
|
|
580
|
+
case EXTERNAL_INT_ARRAY_TYPE:
|
|
581
|
+
return elements_accessors_[JSObject::EXTERNAL_INT_ELEMENTS];
|
|
582
|
+
case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
|
|
583
|
+
return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS];
|
|
584
|
+
case EXTERNAL_FLOAT_ARRAY_TYPE:
|
|
585
|
+
return elements_accessors_[JSObject::EXTERNAL_FLOAT_ELEMENTS];
|
|
586
|
+
case EXTERNAL_DOUBLE_ARRAY_TYPE:
|
|
587
|
+
return elements_accessors_[JSObject::EXTERNAL_DOUBLE_ELEMENTS];
|
|
588
|
+
case EXTERNAL_PIXEL_ARRAY_TYPE:
|
|
589
|
+
return elements_accessors_[JSObject::EXTERNAL_PIXEL_ELEMENTS];
|
|
590
|
+
default:
|
|
591
|
+
UNREACHABLE();
|
|
592
|
+
return NULL;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
|
|
597
|
+
void ElementsAccessor::InitializeOncePerProcess() {
|
|
598
|
+
static struct ConcreteElementsAccessors {
|
|
599
|
+
FastElementsAccessor fast_elements_handler;
|
|
600
|
+
FastDoubleElementsAccessor fast_double_elements_handler;
|
|
601
|
+
DictionaryElementsAccessor dictionary_elements_handler;
|
|
602
|
+
NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler;
|
|
603
|
+
ExternalByteElementsAccessor byte_elements_handler;
|
|
604
|
+
ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler;
|
|
605
|
+
ExternalShortElementsAccessor short_elements_handler;
|
|
606
|
+
ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler;
|
|
607
|
+
ExternalIntElementsAccessor int_elements_handler;
|
|
608
|
+
ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler;
|
|
609
|
+
ExternalFloatElementsAccessor float_elements_handler;
|
|
610
|
+
ExternalDoubleElementsAccessor double_elements_handler;
|
|
611
|
+
PixelElementsAccessor pixel_elements_handler;
|
|
612
|
+
} element_accessors;
|
|
613
|
+
|
|
614
|
+
static ElementsAccessor* accessor_array[] = {
|
|
615
|
+
&element_accessors.fast_elements_handler,
|
|
616
|
+
&element_accessors.fast_double_elements_handler,
|
|
617
|
+
&element_accessors.dictionary_elements_handler,
|
|
618
|
+
&element_accessors.non_strict_arguments_elements_handler,
|
|
619
|
+
&element_accessors.byte_elements_handler,
|
|
620
|
+
&element_accessors.unsigned_byte_elements_handler,
|
|
621
|
+
&element_accessors.short_elements_handler,
|
|
622
|
+
&element_accessors.unsigned_short_elements_handler,
|
|
623
|
+
&element_accessors.int_elements_handler,
|
|
624
|
+
&element_accessors.unsigned_int_elements_handler,
|
|
625
|
+
&element_accessors.float_elements_handler,
|
|
626
|
+
&element_accessors.double_elements_handler,
|
|
627
|
+
&element_accessors.pixel_elements_handler
|
|
628
|
+
};
|
|
629
|
+
|
|
630
|
+
elements_accessors_ = accessor_array;
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
|
|
634
|
+
} } // namespace v8::internal
|