libv8 3.3.10.4 → 3.5.10.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
data/lib/libv8/v8/src/ic.cc
CHANGED
|
@@ -88,7 +88,8 @@ void IC::TraceIC(const char* type,
|
|
|
88
88
|
// function and the original code.
|
|
89
89
|
JSFunction* function = JSFunction::cast(frame->function());
|
|
90
90
|
function->PrintName();
|
|
91
|
-
int code_offset =
|
|
91
|
+
int code_offset =
|
|
92
|
+
static_cast<int>(address() - js_code->instruction_start());
|
|
92
93
|
PrintF("+%d", code_offset);
|
|
93
94
|
} else {
|
|
94
95
|
PrintF("<unknown>");
|
|
@@ -309,6 +310,7 @@ void IC::Clear(Address address) {
|
|
|
309
310
|
case Code::UNARY_OP_IC:
|
|
310
311
|
case Code::BINARY_OP_IC:
|
|
311
312
|
case Code::COMPARE_IC:
|
|
313
|
+
case Code::TO_BOOLEAN_IC:
|
|
312
314
|
// Clearing these is tricky and does not
|
|
313
315
|
// make any performance difference.
|
|
314
316
|
return;
|
|
@@ -578,13 +580,7 @@ bool CallICBase::TryUpdateExtraICState(LookupResult* lookup,
|
|
|
578
580
|
// out of bounds, update the state to record this fact.
|
|
579
581
|
if (StringStubState::decode(*extra_ic_state) == DEFAULT_STRING_STUB &&
|
|
580
582
|
argc >= 1 && args[1]->IsNumber()) {
|
|
581
|
-
double index;
|
|
582
|
-
if (args[1]->IsSmi()) {
|
|
583
|
-
index = Smi::cast(args[1])->value();
|
|
584
|
-
} else {
|
|
585
|
-
ASSERT(args[1]->IsHeapNumber());
|
|
586
|
-
index = DoubleToInteger(HeapNumber::cast(args[1])->value());
|
|
587
|
-
}
|
|
583
|
+
double index = DoubleToInteger(args.number_at(1));
|
|
588
584
|
if (index < 0 || index >= string->length()) {
|
|
589
585
|
*extra_ic_state =
|
|
590
586
|
StringStubState::update(*extra_ic_state,
|
|
@@ -799,18 +795,35 @@ MaybeObject* KeyedCallIC::LoadFunction(State state,
|
|
|
799
795
|
return TypeError("non_object_property_call", object, key);
|
|
800
796
|
}
|
|
801
797
|
|
|
802
|
-
if (FLAG_use_ic && state != MEGAMORPHIC &&
|
|
798
|
+
if (FLAG_use_ic && state != MEGAMORPHIC && object->IsHeapObject()) {
|
|
803
799
|
int argc = target()->arguments_count();
|
|
804
800
|
InLoopFlag in_loop = target()->ic_in_loop();
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
801
|
+
Heap* heap = Handle<HeapObject>::cast(object)->GetHeap();
|
|
802
|
+
Map* map = heap->non_strict_arguments_elements_map();
|
|
803
|
+
if (object->IsJSObject() &&
|
|
804
|
+
Handle<JSObject>::cast(object)->elements()->map() == map) {
|
|
805
|
+
MaybeObject* maybe_code = isolate()->stub_cache()->ComputeCallArguments(
|
|
806
|
+
argc, in_loop, Code::KEYED_CALL_IC);
|
|
807
|
+
Object* code;
|
|
808
|
+
if (maybe_code->ToObject(&code)) {
|
|
809
|
+
set_target(Code::cast(code));
|
|
810
810
|
#ifdef DEBUG
|
|
811
|
-
|
|
812
|
-
|
|
811
|
+
TraceIC(
|
|
812
|
+
"KeyedCallIC", key, state, target(), in_loop ? " (in-loop)" : "");
|
|
813
813
|
#endif
|
|
814
|
+
}
|
|
815
|
+
} else if (FLAG_use_ic && state != MEGAMORPHIC &&
|
|
816
|
+
!object->IsAccessCheckNeeded()) {
|
|
817
|
+
MaybeObject* maybe_code = isolate()->stub_cache()->ComputeCallMegamorphic(
|
|
818
|
+
argc, in_loop, Code::KEYED_CALL_IC, Code::kNoExtraICState);
|
|
819
|
+
Object* code;
|
|
820
|
+
if (maybe_code->ToObject(&code)) {
|
|
821
|
+
set_target(Code::cast(code));
|
|
822
|
+
#ifdef DEBUG
|
|
823
|
+
TraceIC(
|
|
824
|
+
"KeyedCallIC", key, state, target(), in_loop ? " (in-loop)" : "");
|
|
825
|
+
#endif
|
|
826
|
+
}
|
|
814
827
|
}
|
|
815
828
|
}
|
|
816
829
|
|
|
@@ -831,14 +844,6 @@ MaybeObject* KeyedCallIC::LoadFunction(State state,
|
|
|
831
844
|
}
|
|
832
845
|
|
|
833
846
|
|
|
834
|
-
#ifdef DEBUG
|
|
835
|
-
#define TRACE_IC_NAMED(msg, name) \
|
|
836
|
-
if (FLAG_trace_ic) PrintF(msg, *(name)->ToCString())
|
|
837
|
-
#else
|
|
838
|
-
#define TRACE_IC_NAMED(msg, name)
|
|
839
|
-
#endif
|
|
840
|
-
|
|
841
|
-
|
|
842
847
|
MaybeObject* LoadIC::Load(State state,
|
|
843
848
|
Handle<Object> object,
|
|
844
849
|
Handle<String> name) {
|
|
@@ -849,37 +854,40 @@ MaybeObject* LoadIC::Load(State state,
|
|
|
849
854
|
}
|
|
850
855
|
|
|
851
856
|
if (FLAG_use_ic) {
|
|
852
|
-
Code* non_monomorphic_stub =
|
|
853
|
-
(state == UNINITIALIZED) ? pre_monomorphic_stub() : megamorphic_stub();
|
|
854
|
-
|
|
855
857
|
// Use specialized code for getting the length of strings and
|
|
856
858
|
// string wrapper objects. The length property of string wrapper
|
|
857
859
|
// objects is read-only and therefore always returns the length of
|
|
858
860
|
// the underlying string value. See ECMA-262 15.5.5.1.
|
|
859
861
|
if ((object->IsString() || object->IsStringWrapper()) &&
|
|
860
862
|
name->Equals(isolate()->heap()->length_symbol())) {
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
if (
|
|
864
|
-
|
|
865
|
-
if (state == PREMONOMORPHIC) {
|
|
863
|
+
AssertNoAllocation no_allocation;
|
|
864
|
+
Code* stub = NULL;
|
|
865
|
+
if (state == UNINITIALIZED) {
|
|
866
|
+
stub = pre_monomorphic_stub();
|
|
867
|
+
} else if (state == PREMONOMORPHIC) {
|
|
866
868
|
if (object->IsString()) {
|
|
867
|
-
|
|
868
|
-
Builtins::kLoadIC_StringLength)
|
|
869
|
+
stub = isolate()->builtins()->builtin(
|
|
870
|
+
Builtins::kLoadIC_StringLength);
|
|
869
871
|
} else {
|
|
870
|
-
|
|
871
|
-
Builtins::kLoadIC_StringWrapperLength)
|
|
872
|
+
stub = isolate()->builtins()->builtin(
|
|
873
|
+
Builtins::kLoadIC_StringWrapperLength);
|
|
872
874
|
}
|
|
873
875
|
} else if (state == MONOMORPHIC && object->IsStringWrapper()) {
|
|
874
|
-
|
|
875
|
-
Builtins::kLoadIC_StringWrapperLength)
|
|
876
|
-
} else {
|
|
877
|
-
|
|
876
|
+
stub = isolate()->builtins()->builtin(
|
|
877
|
+
Builtins::kLoadIC_StringWrapperLength);
|
|
878
|
+
} else if (state != MEGAMORPHIC) {
|
|
879
|
+
stub = megamorphic_stub();
|
|
880
|
+
}
|
|
881
|
+
if (stub != NULL) {
|
|
882
|
+
set_target(stub);
|
|
883
|
+
#ifdef DEBUG
|
|
884
|
+
if (FLAG_trace_ic) PrintF("[LoadIC : +#length /string]\n");
|
|
885
|
+
#endif
|
|
878
886
|
}
|
|
879
887
|
// Get the string if we have a string wrapper object.
|
|
880
888
|
if (object->IsJSValue()) {
|
|
881
|
-
|
|
882
|
-
|
|
889
|
+
return Smi::FromInt(
|
|
890
|
+
String::cast(Handle<JSValue>::cast(object)->value())->length());
|
|
883
891
|
}
|
|
884
892
|
return Smi::FromInt(String::cast(*object)->length());
|
|
885
893
|
}
|
|
@@ -887,14 +895,21 @@ MaybeObject* LoadIC::Load(State state,
|
|
|
887
895
|
// Use specialized code for getting the length of arrays.
|
|
888
896
|
if (object->IsJSArray() &&
|
|
889
897
|
name->Equals(isolate()->heap()->length_symbol())) {
|
|
898
|
+
AssertNoAllocation no_allocation;
|
|
899
|
+
Code* stub = NULL;
|
|
900
|
+
if (state == UNINITIALIZED) {
|
|
901
|
+
stub = pre_monomorphic_stub();
|
|
902
|
+
} else if (state == PREMONOMORPHIC) {
|
|
903
|
+
stub = isolate()->builtins()->builtin(
|
|
904
|
+
Builtins::kLoadIC_ArrayLength);
|
|
905
|
+
} else if (state != MEGAMORPHIC) {
|
|
906
|
+
stub = megamorphic_stub();
|
|
907
|
+
}
|
|
908
|
+
if (stub != NULL) {
|
|
909
|
+
set_target(stub);
|
|
890
910
|
#ifdef DEBUG
|
|
891
|
-
|
|
911
|
+
if (FLAG_trace_ic) PrintF("[LoadIC : +#length /array]\n");
|
|
892
912
|
#endif
|
|
893
|
-
if (state == PREMONOMORPHIC) {
|
|
894
|
-
set_target(isolate()->builtins()->builtin(
|
|
895
|
-
Builtins::kLoadIC_ArrayLength));
|
|
896
|
-
} else {
|
|
897
|
-
set_target(non_monomorphic_stub);
|
|
898
913
|
}
|
|
899
914
|
return JSArray::cast(*object)->length();
|
|
900
915
|
}
|
|
@@ -903,14 +918,22 @@ MaybeObject* LoadIC::Load(State state,
|
|
|
903
918
|
if (object->IsJSFunction() &&
|
|
904
919
|
name->Equals(isolate()->heap()->prototype_symbol()) &&
|
|
905
920
|
JSFunction::cast(*object)->should_have_prototype()) {
|
|
921
|
+
{ AssertNoAllocation no_allocation;
|
|
922
|
+
Code* stub = NULL;
|
|
923
|
+
if (state == UNINITIALIZED) {
|
|
924
|
+
stub = pre_monomorphic_stub();
|
|
925
|
+
} else if (state == PREMONOMORPHIC) {
|
|
926
|
+
stub = isolate()->builtins()->builtin(
|
|
927
|
+
Builtins::kLoadIC_FunctionPrototype);
|
|
928
|
+
} else if (state != MEGAMORPHIC) {
|
|
929
|
+
stub = megamorphic_stub();
|
|
930
|
+
}
|
|
931
|
+
if (stub != NULL) {
|
|
932
|
+
set_target(stub);
|
|
906
933
|
#ifdef DEBUG
|
|
907
|
-
|
|
934
|
+
if (FLAG_trace_ic) PrintF("[LoadIC : +#prototype /function]\n");
|
|
908
935
|
#endif
|
|
909
|
-
|
|
910
|
-
set_target(isolate()->builtins()->builtin(
|
|
911
|
-
Builtins::kLoadIC_FunctionPrototype));
|
|
912
|
-
} else {
|
|
913
|
-
set_target(non_monomorphic_stub);
|
|
936
|
+
}
|
|
914
937
|
}
|
|
915
938
|
return Accessors::FunctionGetPrototype(*object, 0);
|
|
916
939
|
}
|
|
@@ -927,7 +950,7 @@ MaybeObject* LoadIC::Load(State state,
|
|
|
927
950
|
|
|
928
951
|
// If we did not find a property, check if we need to throw an exception.
|
|
929
952
|
if (!lookup.IsProperty()) {
|
|
930
|
-
if (
|
|
953
|
+
if (IsContextual(object)) {
|
|
931
954
|
return ReferenceError("not_defined", name);
|
|
932
955
|
}
|
|
933
956
|
LOG(isolate(), SuspectReadEvent(*name, *object));
|
|
@@ -1068,25 +1091,10 @@ void LoadIC::UpdateCaches(LookupResult* lookup,
|
|
|
1068
1091
|
}
|
|
1069
1092
|
|
|
1070
1093
|
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
ASSERT(ic_state == MEGAMORPHIC);
|
|
1076
|
-
return isolate()->heap()->KeyedLoadSpecializedPolymorphic_symbol();
|
|
1077
|
-
}
|
|
1078
|
-
}
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
MaybeObject* KeyedLoadIC::GetFastElementStubWithoutMapCheck(
|
|
1082
|
-
bool is_js_array) {
|
|
1083
|
-
return KeyedLoadFastElementStub().TryGetCode();
|
|
1084
|
-
}
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
MaybeObject* KeyedLoadIC::GetExternalArrayStubWithoutMapCheck(
|
|
1088
|
-
ExternalArrayType array_type) {
|
|
1089
|
-
return KeyedLoadExternalArrayStub(array_type).TryGetCode();
|
|
1094
|
+
MaybeObject* KeyedLoadIC::GetElementStubWithoutMapCheck(
|
|
1095
|
+
bool is_js_array,
|
|
1096
|
+
JSObject::ElementsKind elements_kind) {
|
|
1097
|
+
return KeyedLoadElementStub(elements_kind).TryGetCode();
|
|
1090
1098
|
}
|
|
1091
1099
|
|
|
1092
1100
|
|
|
@@ -1201,10 +1209,8 @@ MaybeObject* KeyedLoadIC::Load(State state,
|
|
|
1201
1209
|
LookupForRead(*object, *name, &lookup);
|
|
1202
1210
|
|
|
1203
1211
|
// If we did not find a property, check if we need to throw an exception.
|
|
1204
|
-
if (!lookup.IsProperty()) {
|
|
1205
|
-
|
|
1206
|
-
return ReferenceError("not_defined", name);
|
|
1207
|
-
}
|
|
1212
|
+
if (!lookup.IsProperty() && IsContextual(object)) {
|
|
1213
|
+
return ReferenceError("not_defined", name);
|
|
1208
1214
|
}
|
|
1209
1215
|
|
|
1210
1216
|
if (FLAG_use_ic) {
|
|
@@ -1243,9 +1249,13 @@ MaybeObject* KeyedLoadIC::Load(State state,
|
|
|
1243
1249
|
}
|
|
1244
1250
|
} else if (object->IsJSObject()) {
|
|
1245
1251
|
JSObject* receiver = JSObject::cast(*object);
|
|
1246
|
-
|
|
1252
|
+
Heap* heap = Handle<JSObject>::cast(object)->GetHeap();
|
|
1253
|
+
Map* elements_map = Handle<JSObject>::cast(object)->elements()->map();
|
|
1254
|
+
if (elements_map == heap->non_strict_arguments_elements_map()) {
|
|
1255
|
+
stub = non_strict_arguments_stub();
|
|
1256
|
+
} else if (receiver->HasIndexedInterceptor()) {
|
|
1247
1257
|
stub = indexed_interceptor_stub();
|
|
1248
|
-
} else if (key->IsSmi()) {
|
|
1258
|
+
} else if (key->IsSmi() && (target() != non_strict_arguments_stub())) {
|
|
1249
1259
|
MaybeObject* maybe_stub = ComputeStub(receiver,
|
|
1250
1260
|
false,
|
|
1251
1261
|
kNonStrictMode,
|
|
@@ -1355,15 +1365,16 @@ static bool StoreICableLookup(LookupResult* lookup) {
|
|
|
1355
1365
|
}
|
|
1356
1366
|
|
|
1357
1367
|
|
|
1358
|
-
static bool LookupForWrite(
|
|
1368
|
+
static bool LookupForWrite(JSReceiver* receiver,
|
|
1359
1369
|
String* name,
|
|
1360
1370
|
LookupResult* lookup) {
|
|
1361
|
-
|
|
1371
|
+
receiver->LocalLookup(name, lookup);
|
|
1362
1372
|
if (!StoreICableLookup(lookup)) {
|
|
1363
1373
|
return false;
|
|
1364
1374
|
}
|
|
1365
1375
|
|
|
1366
1376
|
if (lookup->type() == INTERCEPTOR) {
|
|
1377
|
+
JSObject* object = JSObject::cast(receiver);
|
|
1367
1378
|
if (object->GetNamedInterceptor()->setter()->IsUndefined()) {
|
|
1368
1379
|
object->LocalLookupRealNamedProperty(name, lookup);
|
|
1369
1380
|
return StoreICableLookup(lookup);
|
|
@@ -1385,7 +1396,7 @@ MaybeObject* StoreIC::Store(State state,
|
|
|
1385
1396
|
return TypeError("non_object_property_store", object, name);
|
|
1386
1397
|
}
|
|
1387
1398
|
|
|
1388
|
-
if (!object->
|
|
1399
|
+
if (!object->IsJSReceiver()) {
|
|
1389
1400
|
// The length property of string values is read-only. Throw in strict mode.
|
|
1390
1401
|
if (strict_mode == kStrictMode && object->IsString() &&
|
|
1391
1402
|
name->Equals(isolate()->heap()->length_symbol())) {
|
|
@@ -1395,6 +1406,12 @@ MaybeObject* StoreIC::Store(State state,
|
|
|
1395
1406
|
return *value;
|
|
1396
1407
|
}
|
|
1397
1408
|
|
|
1409
|
+
// Handle proxies.
|
|
1410
|
+
if (object->IsJSProxy()) {
|
|
1411
|
+
return JSReceiver::cast(*object)->
|
|
1412
|
+
SetProperty(*name, *value, NONE, strict_mode);
|
|
1413
|
+
}
|
|
1414
|
+
|
|
1398
1415
|
Handle<JSObject> receiver = Handle<JSObject>::cast(object);
|
|
1399
1416
|
|
|
1400
1417
|
// Check if the given name is an array index.
|
|
@@ -1409,7 +1426,7 @@ MaybeObject* StoreIC::Store(State state,
|
|
|
1409
1426
|
// Use specialized code for setting the length of arrays.
|
|
1410
1427
|
if (receiver->IsJSArray()
|
|
1411
1428
|
&& name->Equals(isolate()->heap()->length_symbol())
|
|
1412
|
-
&& receiver->AllowsSetElementsLength()) {
|
|
1429
|
+
&& JSArray::cast(*receiver)->AllowsSetElementsLength()) {
|
|
1413
1430
|
#ifdef DEBUG
|
|
1414
1431
|
if (FLAG_trace_ic) PrintF("[StoreIC : +#length /array]\n");
|
|
1415
1432
|
#endif
|
|
@@ -1596,18 +1613,14 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
|
|
|
1596
1613
|
StrictModeFlag strict_mode,
|
|
1597
1614
|
Code* generic_stub) {
|
|
1598
1615
|
State ic_state = target()->ic_state();
|
|
1599
|
-
Code* monomorphic_stub;
|
|
1600
|
-
// Always compute the MONOMORPHIC stub, even if the MEGAMORPHIC stub ends up
|
|
1601
|
-
// being used. This is necessary because the megamorphic stub needs to have
|
|
1602
|
-
// access to more information than what is stored in the receiver map in some
|
|
1603
|
-
// cases (external arrays need the array type from the MONOMORPHIC stub).
|
|
1604
|
-
MaybeObject* maybe_stub = ComputeMonomorphicStub(receiver,
|
|
1605
|
-
is_store,
|
|
1606
|
-
strict_mode,
|
|
1607
|
-
generic_stub);
|
|
1608
|
-
if (!maybe_stub->To(&monomorphic_stub)) return maybe_stub;
|
|
1609
|
-
|
|
1610
1616
|
if (ic_state == UNINITIALIZED || ic_state == PREMONOMORPHIC) {
|
|
1617
|
+
Code* monomorphic_stub;
|
|
1618
|
+
MaybeObject* maybe_stub = ComputeMonomorphicStub(receiver,
|
|
1619
|
+
is_store,
|
|
1620
|
+
strict_mode,
|
|
1621
|
+
generic_stub);
|
|
1622
|
+
if (!maybe_stub->To(&monomorphic_stub)) return maybe_stub;
|
|
1623
|
+
|
|
1611
1624
|
return monomorphic_stub;
|
|
1612
1625
|
}
|
|
1613
1626
|
ASSERT(target() != generic_stub);
|
|
@@ -1629,79 +1642,40 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
|
|
|
1629
1642
|
return generic_stub;
|
|
1630
1643
|
}
|
|
1631
1644
|
|
|
1632
|
-
//
|
|
1633
|
-
// cache, but that can put receiver types together from unrelated call sites
|
|
1634
|
-
// into the same stub--they always handle the union of all receiver maps seen
|
|
1635
|
-
// at all call sites involving the receiver map. This is only an
|
|
1636
|
-
// approximation: ideally, there would be a global cache that mapped sets of
|
|
1637
|
-
// receiver maps to MEGAMORPHIC stubs. The complexity of the MEGAMORPHIC stub
|
|
1638
|
-
// computation also leads to direct manipulation of the stub cache from the IC
|
|
1639
|
-
// code, which the global cache solution would avoid.
|
|
1640
|
-
Code::Kind kind = this->kind();
|
|
1641
|
-
Code::Flags flags = Code::ComputeFlags(kind,
|
|
1642
|
-
NOT_IN_LOOP,
|
|
1643
|
-
MEGAMORPHIC,
|
|
1644
|
-
strict_mode);
|
|
1645
|
-
String* megamorphic_name = GetStubNameForCache(MEGAMORPHIC);
|
|
1646
|
-
Object* maybe_cached_stub = receiver->map()->FindInCodeCache(megamorphic_name,
|
|
1647
|
-
flags);
|
|
1648
|
-
|
|
1649
|
-
// Create a set of all receiver maps that have been seen at the IC call site
|
|
1650
|
-
// and those seen by the MEGAMORPHIC cached stub, if that's the stub that's
|
|
1651
|
-
// been selected.
|
|
1652
|
-
MapList receiver_maps;
|
|
1653
|
-
if (!maybe_cached_stub->IsUndefined()) {
|
|
1654
|
-
GetReceiverMapsForStub(Code::cast(maybe_cached_stub), &receiver_maps);
|
|
1655
|
-
}
|
|
1656
|
-
bool added_map = false;
|
|
1657
|
-
for (int i = 0; i < target_receiver_maps.length(); ++i) {
|
|
1658
|
-
if (AddOneReceiverMapIfMissing(&receiver_maps,
|
|
1659
|
-
target_receiver_maps.at(i))) {
|
|
1660
|
-
added_map = true;
|
|
1661
|
-
}
|
|
1662
|
-
}
|
|
1663
|
-
ASSERT(receiver_maps.length() > 0);
|
|
1664
|
-
|
|
1665
|
-
// If the maximum number of receiver maps has been exceeded, use the Generic
|
|
1645
|
+
// If the maximum number of receiver maps has been exceeded, use the generic
|
|
1666
1646
|
// version of the IC.
|
|
1667
|
-
if (
|
|
1647
|
+
if (target_receiver_maps.length() > kMaxKeyedPolymorphism) {
|
|
1668
1648
|
return generic_stub;
|
|
1669
1649
|
}
|
|
1670
1650
|
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1651
|
+
PolymorphicCodeCache* cache = isolate()->heap()->polymorphic_code_cache();
|
|
1652
|
+
Code::Flags flags = Code::ComputeFlags(this->kind(),
|
|
1653
|
+
NOT_IN_LOOP,
|
|
1654
|
+
MEGAMORPHIC,
|
|
1655
|
+
strict_mode);
|
|
1656
|
+
Object* maybe_cached_stub = cache->Lookup(&target_receiver_maps, flags);
|
|
1657
|
+
// If there is a cached stub, use it.
|
|
1658
|
+
if (!maybe_cached_stub->IsUndefined()) {
|
|
1675
1659
|
ASSERT(maybe_cached_stub->IsCode());
|
|
1676
1660
|
return Code::cast(maybe_cached_stub);
|
|
1677
1661
|
}
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
for (int current = 0; current < receiver_maps.length(); ++current) {
|
|
1683
|
-
Map* receiver_map(receiver_maps.at(current));
|
|
1662
|
+
// Collect MONOMORPHIC stubs for all target_receiver_maps.
|
|
1663
|
+
CodeList handler_ics(target_receiver_maps.length());
|
|
1664
|
+
for (int i = 0; i < target_receiver_maps.length(); ++i) {
|
|
1665
|
+
Map* receiver_map(target_receiver_maps.at(i));
|
|
1684
1666
|
MaybeObject* maybe_cached_stub = ComputeMonomorphicStubWithoutMapCheck(
|
|
1685
|
-
receiver_map,
|
|
1686
|
-
strict_mode,
|
|
1687
|
-
generic_stub);
|
|
1667
|
+
receiver_map, strict_mode);
|
|
1688
1668
|
Code* cached_stub;
|
|
1689
|
-
if (!maybe_cached_stub->To(&cached_stub))
|
|
1690
|
-
return maybe_cached_stub;
|
|
1691
|
-
}
|
|
1669
|
+
if (!maybe_cached_stub->To(&cached_stub)) return maybe_cached_stub;
|
|
1692
1670
|
handler_ics.Add(cached_stub);
|
|
1693
1671
|
}
|
|
1694
|
-
|
|
1695
|
-
Code* stub;
|
|
1696
1672
|
// Build the MEGAMORPHIC stub.
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1673
|
+
Code* stub;
|
|
1674
|
+
MaybeObject* maybe_stub = ConstructMegamorphicStub(&target_receiver_maps,
|
|
1675
|
+
&handler_ics,
|
|
1676
|
+
strict_mode);
|
|
1700
1677
|
if (!maybe_stub->To(&stub)) return maybe_stub;
|
|
1701
|
-
|
|
1702
|
-
MaybeObject* maybe_update = receiver->UpdateMapCodeCache(
|
|
1703
|
-
megamorphic_name,
|
|
1704
|
-
stub);
|
|
1678
|
+
MaybeObject* maybe_update = cache->Update(&target_receiver_maps, flags, stub);
|
|
1705
1679
|
if (maybe_update->IsFailure()) return maybe_update;
|
|
1706
1680
|
return stub;
|
|
1707
1681
|
}
|
|
@@ -1709,33 +1683,18 @@ MaybeObject* KeyedIC::ComputeStub(JSObject* receiver,
|
|
|
1709
1683
|
|
|
1710
1684
|
MaybeObject* KeyedIC::ComputeMonomorphicStubWithoutMapCheck(
|
|
1711
1685
|
Map* receiver_map,
|
|
1712
|
-
StrictModeFlag strict_mode
|
|
1713
|
-
Code* generic_stub) {
|
|
1686
|
+
StrictModeFlag strict_mode) {
|
|
1714
1687
|
if ((receiver_map->instance_type() & kNotStringTag) == 0) {
|
|
1715
1688
|
ASSERT(string_stub() != NULL);
|
|
1716
1689
|
return string_stub();
|
|
1717
|
-
} else if (receiver_map->has_external_array_elements()) {
|
|
1718
|
-
// Determine the array type from the default MONOMORPHIC already generated
|
|
1719
|
-
// stub. There is no other way to determine the type of the external array
|
|
1720
|
-
// directly from the receiver type.
|
|
1721
|
-
Code::Kind kind = this->kind();
|
|
1722
|
-
Code::Flags flags = Code::ComputeMonomorphicFlags(kind,
|
|
1723
|
-
NORMAL,
|
|
1724
|
-
strict_mode);
|
|
1725
|
-
String* monomorphic_name = GetStubNameForCache(MONOMORPHIC);
|
|
1726
|
-
Object* maybe_default_stub = receiver_map->FindInCodeCache(monomorphic_name,
|
|
1727
|
-
flags);
|
|
1728
|
-
if (maybe_default_stub->IsUndefined()) {
|
|
1729
|
-
return generic_stub;
|
|
1730
|
-
}
|
|
1731
|
-
Code* default_stub = Code::cast(maybe_default_stub);
|
|
1732
|
-
return GetExternalArrayStubWithoutMapCheck(
|
|
1733
|
-
default_stub->external_array_type());
|
|
1734
|
-
} else if (receiver_map->has_fast_elements()) {
|
|
1735
|
-
bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
|
1736
|
-
return GetFastElementStubWithoutMapCheck(is_js_array);
|
|
1737
1690
|
} else {
|
|
1738
|
-
|
|
1691
|
+
ASSERT(receiver_map->has_dictionary_elements() ||
|
|
1692
|
+
receiver_map->has_fast_elements() ||
|
|
1693
|
+
receiver_map->has_fast_double_elements() ||
|
|
1694
|
+
receiver_map->has_external_array_elements());
|
|
1695
|
+
bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
|
|
1696
|
+
return GetElementStubWithoutMapCheck(is_js_array,
|
|
1697
|
+
receiver_map->elements_kind());
|
|
1739
1698
|
}
|
|
1740
1699
|
}
|
|
1741
1700
|
|
|
@@ -1745,14 +1704,12 @@ MaybeObject* KeyedIC::ComputeMonomorphicStub(JSObject* receiver,
|
|
|
1745
1704
|
StrictModeFlag strict_mode,
|
|
1746
1705
|
Code* generic_stub) {
|
|
1747
1706
|
Code* result = NULL;
|
|
1748
|
-
if (receiver->
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
if (!maybe_stub->To(&result)) return maybe_stub;
|
|
1753
|
-
} else if (receiver->map()->has_fast_elements()) {
|
|
1707
|
+
if (receiver->HasFastElements() ||
|
|
1708
|
+
receiver->HasExternalArrayElements() ||
|
|
1709
|
+
receiver->HasFastDoubleElements() ||
|
|
1710
|
+
receiver->HasDictionaryElements()) {
|
|
1754
1711
|
MaybeObject* maybe_stub =
|
|
1755
|
-
isolate()->stub_cache()->
|
|
1712
|
+
isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement(
|
|
1756
1713
|
receiver, is_store, strict_mode);
|
|
1757
1714
|
if (!maybe_stub->To(&result)) return maybe_stub;
|
|
1758
1715
|
} else {
|
|
@@ -1762,25 +1719,10 @@ MaybeObject* KeyedIC::ComputeMonomorphicStub(JSObject* receiver,
|
|
|
1762
1719
|
}
|
|
1763
1720
|
|
|
1764
1721
|
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
1769
|
-
ASSERT(ic_state == MEGAMORPHIC);
|
|
1770
|
-
return isolate()->heap()->KeyedStoreSpecializedPolymorphic_symbol();
|
|
1771
|
-
}
|
|
1772
|
-
}
|
|
1773
|
-
|
|
1774
|
-
|
|
1775
|
-
MaybeObject* KeyedStoreIC::GetFastElementStubWithoutMapCheck(
|
|
1776
|
-
bool is_js_array) {
|
|
1777
|
-
return KeyedStoreFastElementStub(is_js_array).TryGetCode();
|
|
1778
|
-
}
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
MaybeObject* KeyedStoreIC::GetExternalArrayStubWithoutMapCheck(
|
|
1782
|
-
ExternalArrayType array_type) {
|
|
1783
|
-
return KeyedStoreExternalArrayStub(array_type).TryGetCode();
|
|
1722
|
+
MaybeObject* KeyedStoreIC::GetElementStubWithoutMapCheck(
|
|
1723
|
+
bool is_js_array,
|
|
1724
|
+
JSObject::ElementsKind elements_kind) {
|
|
1725
|
+
return KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode();
|
|
1784
1726
|
}
|
|
1785
1727
|
|
|
1786
1728
|
|
|
@@ -1851,15 +1793,22 @@ MaybeObject* KeyedStoreIC::Store(State state,
|
|
|
1851
1793
|
Code* stub = (strict_mode == kStrictMode)
|
|
1852
1794
|
? generic_stub_strict()
|
|
1853
1795
|
: generic_stub();
|
|
1854
|
-
if (
|
|
1855
|
-
|
|
1856
|
-
|
|
1857
|
-
|
|
1858
|
-
|
|
1859
|
-
|
|
1860
|
-
|
|
1861
|
-
|
|
1862
|
-
|
|
1796
|
+
if (object->IsJSObject()) {
|
|
1797
|
+
JSObject* receiver = JSObject::cast(*object);
|
|
1798
|
+
Heap* heap = Handle<JSObject>::cast(object)->GetHeap();
|
|
1799
|
+
Map* elements_map = Handle<JSObject>::cast(object)->elements()->map();
|
|
1800
|
+
if (elements_map == heap->non_strict_arguments_elements_map()) {
|
|
1801
|
+
stub = non_strict_arguments_stub();
|
|
1802
|
+
} else if (!force_generic) {
|
|
1803
|
+
if (key->IsSmi() && (target() != non_strict_arguments_stub())) {
|
|
1804
|
+
HandleScope scope(isolate());
|
|
1805
|
+
MaybeObject* maybe_stub = ComputeStub(receiver,
|
|
1806
|
+
true,
|
|
1807
|
+
strict_mode,
|
|
1808
|
+
stub);
|
|
1809
|
+
stub = maybe_stub->IsFailure() ?
|
|
1810
|
+
NULL : Code::cast(maybe_stub->ToObjectUnchecked());
|
|
1811
|
+
}
|
|
1863
1812
|
}
|
|
1864
1813
|
}
|
|
1865
1814
|
if (stub != NULL) set_target(stub);
|
|
@@ -2325,25 +2274,21 @@ BinaryOpIC::TypeInfo BinaryOpIC::GetTypeInfo(Handle<Object> left,
|
|
|
2325
2274
|
}
|
|
2326
2275
|
|
|
2327
2276
|
|
|
2328
|
-
// defined in code-stubs-<arch>.cc
|
|
2329
|
-
// Only needed to remove dependency of ic.cc on code-stubs-<arch>.h.
|
|
2330
|
-
Handle<Code> GetUnaryOpStub(int key, UnaryOpIC::TypeInfo type_info);
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
2277
|
RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) {
|
|
2334
2278
|
ASSERT(args.length() == 4);
|
|
2335
2279
|
|
|
2336
2280
|
HandleScope scope(isolate);
|
|
2337
2281
|
Handle<Object> operand = args.at<Object>(0);
|
|
2338
|
-
|
|
2339
|
-
|
|
2282
|
+
Token::Value op = static_cast<Token::Value>(args.smi_at(1));
|
|
2283
|
+
UnaryOverwriteMode mode = static_cast<UnaryOverwriteMode>(args.smi_at(2));
|
|
2340
2284
|
UnaryOpIC::TypeInfo previous_type =
|
|
2341
|
-
static_cast<UnaryOpIC::TypeInfo>(
|
|
2285
|
+
static_cast<UnaryOpIC::TypeInfo>(args.smi_at(3));
|
|
2342
2286
|
|
|
2343
2287
|
UnaryOpIC::TypeInfo type = UnaryOpIC::GetTypeInfo(operand);
|
|
2344
2288
|
type = UnaryOpIC::ComputeNewType(type, previous_type);
|
|
2345
2289
|
|
|
2346
|
-
|
|
2290
|
+
UnaryOpStub stub(op, mode, type);
|
|
2291
|
+
Handle<Code> code = stub.GetCode();
|
|
2347
2292
|
if (!code.is_null()) {
|
|
2348
2293
|
if (FLAG_trace_ic) {
|
|
2349
2294
|
PrintF("[UnaryOpIC (%s->%s)#%s]\n",
|
|
@@ -2380,23 +2325,16 @@ RUNTIME_FUNCTION(MaybeObject*, UnaryOp_Patch) {
|
|
|
2380
2325
|
return *result;
|
|
2381
2326
|
}
|
|
2382
2327
|
|
|
2383
|
-
// defined in code-stubs-<arch>.cc
|
|
2384
|
-
// Only needed to remove dependency of ic.cc on code-stubs-<arch>.h.
|
|
2385
|
-
Handle<Code> GetBinaryOpStub(int key,
|
|
2386
|
-
BinaryOpIC::TypeInfo type_info,
|
|
2387
|
-
BinaryOpIC::TypeInfo result_type);
|
|
2388
|
-
|
|
2389
|
-
|
|
2390
2328
|
RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
|
|
2391
2329
|
ASSERT(args.length() == 5);
|
|
2392
2330
|
|
|
2393
2331
|
HandleScope scope(isolate);
|
|
2394
2332
|
Handle<Object> left = args.at<Object>(0);
|
|
2395
2333
|
Handle<Object> right = args.at<Object>(1);
|
|
2396
|
-
int key =
|
|
2397
|
-
Token::Value op = static_cast<Token::Value>(
|
|
2334
|
+
int key = args.smi_at(2);
|
|
2335
|
+
Token::Value op = static_cast<Token::Value>(args.smi_at(3));
|
|
2398
2336
|
BinaryOpIC::TypeInfo previous_type =
|
|
2399
|
-
static_cast<BinaryOpIC::TypeInfo>(
|
|
2337
|
+
static_cast<BinaryOpIC::TypeInfo>(args.smi_at(4));
|
|
2400
2338
|
|
|
2401
2339
|
BinaryOpIC::TypeInfo type = BinaryOpIC::GetTypeInfo(left, right);
|
|
2402
2340
|
type = BinaryOpIC::JoinTypes(type, previous_type);
|
|
@@ -2425,7 +2363,8 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) {
|
|
|
2425
2363
|
result_type = BinaryOpIC::HEAP_NUMBER;
|
|
2426
2364
|
}
|
|
2427
2365
|
|
|
2428
|
-
|
|
2366
|
+
BinaryOpStub stub(key, type, result_type);
|
|
2367
|
+
Handle<Code> code = stub.GetCode();
|
|
2429
2368
|
if (!code.is_null()) {
|
|
2430
2369
|
if (FLAG_trace_ic) {
|
|
2431
2370
|
PrintF("[BinaryOpIC (%s->(%s->%s))#%s]\n",
|
|
@@ -2555,12 +2494,37 @@ CompareIC::State CompareIC::TargetState(State state,
|
|
|
2555
2494
|
RUNTIME_FUNCTION(Code*, CompareIC_Miss) {
|
|
2556
2495
|
NoHandleAllocation na;
|
|
2557
2496
|
ASSERT(args.length() == 3);
|
|
2558
|
-
CompareIC ic(isolate, static_cast<Token::Value>(
|
|
2497
|
+
CompareIC ic(isolate, static_cast<Token::Value>(args.smi_at(2)));
|
|
2559
2498
|
ic.UpdateCaches(args.at<Object>(0), args.at<Object>(1));
|
|
2560
2499
|
return ic.target();
|
|
2561
2500
|
}
|
|
2562
2501
|
|
|
2563
2502
|
|
|
2503
|
+
RUNTIME_FUNCTION(MaybeObject*, ToBoolean_Patch) {
|
|
2504
|
+
ASSERT(args.length() == 3);
|
|
2505
|
+
|
|
2506
|
+
HandleScope scope(isolate);
|
|
2507
|
+
Handle<Object> object = args.at<Object>(0);
|
|
2508
|
+
Register tos = Register::from_code(args.smi_at(1));
|
|
2509
|
+
ToBooleanStub::Types old_types(args.smi_at(2));
|
|
2510
|
+
|
|
2511
|
+
ToBooleanStub::Types new_types(old_types);
|
|
2512
|
+
bool to_boolean_value = new_types.Record(object);
|
|
2513
|
+
old_types.TraceTransition(new_types);
|
|
2514
|
+
|
|
2515
|
+
ToBooleanStub stub(tos, new_types);
|
|
2516
|
+
Handle<Code> code = stub.GetCode();
|
|
2517
|
+
ToBooleanIC ic(isolate);
|
|
2518
|
+
ic.patch(*code);
|
|
2519
|
+
return Smi::FromInt(to_boolean_value ? 1 : 0);
|
|
2520
|
+
}
|
|
2521
|
+
|
|
2522
|
+
|
|
2523
|
+
void ToBooleanIC::patch(Code* code) {
|
|
2524
|
+
set_target(code);
|
|
2525
|
+
}
|
|
2526
|
+
|
|
2527
|
+
|
|
2564
2528
|
static const Address IC_utilities[] = {
|
|
2565
2529
|
#define ADDR(name) FUNCTION_ADDR(name),
|
|
2566
2530
|
IC_UTIL_LIST(ADDR)
|