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
|
@@ -138,7 +138,7 @@ static void AllocateEmptyJSArray(MacroAssembler* masm,
|
|
|
138
138
|
__ str(scratch1, FieldMemOperand(result, JSArray::kElementsOffset));
|
|
139
139
|
|
|
140
140
|
// Clear the heap tag on the elements array.
|
|
141
|
-
|
|
141
|
+
STATIC_ASSERT(kSmiTag == 0);
|
|
142
142
|
__ sub(scratch1, scratch1, Operand(kHeapObjectTag));
|
|
143
143
|
|
|
144
144
|
// Initialize the FixedArray and fill it with holes. FixedArray length is
|
|
@@ -207,7 +207,7 @@ static void AllocateJSArray(MacroAssembler* masm,
|
|
|
207
207
|
// Allocate the JSArray object together with space for a FixedArray with the
|
|
208
208
|
// requested number of elements.
|
|
209
209
|
__ bind(¬_empty);
|
|
210
|
-
|
|
210
|
+
STATIC_ASSERT(kSmiTagSize == 1 && kSmiTag == 0);
|
|
211
211
|
__ mov(elements_array_end,
|
|
212
212
|
Operand((JSArray::kSize + FixedArray::kHeaderSize) / kPointerSize));
|
|
213
213
|
__ add(elements_array_end,
|
|
@@ -243,7 +243,7 @@ static void AllocateJSArray(MacroAssembler* masm,
|
|
|
243
243
|
FieldMemOperand(result, JSArray::kElementsOffset));
|
|
244
244
|
|
|
245
245
|
// Clear the heap tag on the elements array.
|
|
246
|
-
|
|
246
|
+
STATIC_ASSERT(kSmiTag == 0);
|
|
247
247
|
__ sub(elements_array_storage,
|
|
248
248
|
elements_array_storage,
|
|
249
249
|
Operand(kHeapObjectTag));
|
|
@@ -255,7 +255,7 @@ static void AllocateJSArray(MacroAssembler* masm,
|
|
|
255
255
|
__ LoadRoot(scratch1, Heap::kFixedArrayMapRootIndex);
|
|
256
256
|
ASSERT_EQ(0 * kPointerSize, FixedArray::kMapOffset);
|
|
257
257
|
__ str(scratch1, MemOperand(elements_array_storage, kPointerSize, PostIndex));
|
|
258
|
-
|
|
258
|
+
STATIC_ASSERT(kSmiTag == 0);
|
|
259
259
|
__ tst(array_size, array_size);
|
|
260
260
|
// Length of the FixedArray is the number of pre-allocated elements if
|
|
261
261
|
// the actual JSArray has length 0 and the size of the JSArray for non-empty
|
|
@@ -272,7 +272,7 @@ static void AllocateJSArray(MacroAssembler* masm,
|
|
|
272
272
|
// result: JSObject
|
|
273
273
|
// elements_array_storage: elements array element storage
|
|
274
274
|
// array_size: smi-tagged size of elements array
|
|
275
|
-
|
|
275
|
+
STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2);
|
|
276
276
|
__ add(elements_array_end,
|
|
277
277
|
elements_array_storage,
|
|
278
278
|
Operand(array_size, LSL, kPointerSizeLog2 - kSmiTagSize));
|
|
@@ -337,14 +337,14 @@ static void ArrayNativeCode(MacroAssembler* masm,
|
|
|
337
337
|
__ bind(&argc_one_or_more);
|
|
338
338
|
__ cmp(r0, Operand(1));
|
|
339
339
|
__ b(ne, &argc_two_or_more);
|
|
340
|
-
|
|
340
|
+
STATIC_ASSERT(kSmiTag == 0);
|
|
341
341
|
__ ldr(r2, MemOperand(sp)); // Get the argument from the stack.
|
|
342
342
|
__ and_(r3, r2, Operand(kIntptrSignBit | kSmiTagMask), SetCC);
|
|
343
343
|
__ b(ne, call_generic_code);
|
|
344
344
|
|
|
345
345
|
// Handle construction of an empty array of a certain size. Bail out if size
|
|
346
346
|
// is too large to actually allocate an elements array.
|
|
347
|
-
|
|
347
|
+
STATIC_ASSERT(kSmiTag == 0);
|
|
348
348
|
__ cmp(r2, Operand(JSObject::kInitialMaxFastElementArray << kSmiTagSize));
|
|
349
349
|
__ b(ge, call_generic_code);
|
|
350
350
|
|
|
@@ -571,7 +571,7 @@ void Builtins::Generate_StringConstructCode(MacroAssembler* masm) {
|
|
|
571
571
|
// Is it a String?
|
|
572
572
|
__ ldr(r2, FieldMemOperand(r0, HeapObject::kMapOffset));
|
|
573
573
|
__ ldrb(r3, FieldMemOperand(r2, Map::kInstanceTypeOffset));
|
|
574
|
-
|
|
574
|
+
STATIC_ASSERT(kNotStringTag != 0);
|
|
575
575
|
__ tst(r3, Operand(kIsNotStringMask));
|
|
576
576
|
__ b(ne, &convert_argument);
|
|
577
577
|
__ mov(argument, r0);
|
|
@@ -619,8 +619,7 @@ void Builtins::Generate_JSConstructCall(MacroAssembler* masm) {
|
|
|
619
619
|
|
|
620
620
|
Label non_function_call;
|
|
621
621
|
// Check that the function is not a smi.
|
|
622
|
-
__
|
|
623
|
-
__ b(eq, &non_function_call);
|
|
622
|
+
__ JumpIfSmi(r1, &non_function_call);
|
|
624
623
|
// Check that the function is a JSFunction.
|
|
625
624
|
__ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE);
|
|
626
625
|
__ b(ne, &non_function_call);
|
|
@@ -675,8 +674,7 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
|
|
675
674
|
// Load the initial map and verify that it is in fact a map.
|
|
676
675
|
// r1: constructor function
|
|
677
676
|
__ ldr(r2, FieldMemOperand(r1, JSFunction::kPrototypeOrInitialMapOffset));
|
|
678
|
-
__
|
|
679
|
-
__ b(eq, &rt_call);
|
|
677
|
+
__ JumpIfSmi(r2, &rt_call);
|
|
680
678
|
__ CompareObjectType(r2, r3, r4, MAP_TYPE);
|
|
681
679
|
__ b(ne, &rt_call);
|
|
682
680
|
|
|
@@ -915,10 +913,11 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
|
|
915
913
|
masm->isolate()->builtins()->HandleApiCallConstruct();
|
|
916
914
|
ParameterCount expected(0);
|
|
917
915
|
__ InvokeCode(code, expected, expected,
|
|
918
|
-
RelocInfo::CODE_TARGET, CALL_FUNCTION);
|
|
916
|
+
RelocInfo::CODE_TARGET, CALL_FUNCTION, CALL_AS_METHOD);
|
|
919
917
|
} else {
|
|
920
918
|
ParameterCount actual(r0);
|
|
921
|
-
__ InvokeFunction(r1, actual, CALL_FUNCTION
|
|
919
|
+
__ InvokeFunction(r1, actual, CALL_FUNCTION,
|
|
920
|
+
NullCallWrapper(), CALL_AS_METHOD);
|
|
922
921
|
}
|
|
923
922
|
|
|
924
923
|
// Pop the function from the stack.
|
|
@@ -945,12 +944,11 @@ static void Generate_JSConstructStubHelper(MacroAssembler* masm,
|
|
|
945
944
|
// sp[0]: receiver (newly allocated object)
|
|
946
945
|
// sp[1]: constructor function
|
|
947
946
|
// sp[2]: number of arguments (smi-tagged)
|
|
948
|
-
__
|
|
949
|
-
__ b(eq, &use_receiver);
|
|
947
|
+
__ JumpIfSmi(r0, &use_receiver);
|
|
950
948
|
|
|
951
949
|
// If the type of the result (stored in its map) is less than
|
|
952
|
-
//
|
|
953
|
-
__ CompareObjectType(r0, r3, r3,
|
|
950
|
+
// FIRST_SPEC_OBJECT_TYPE, it is not an object in the ECMA sense.
|
|
951
|
+
__ CompareObjectType(r0, r3, r3, FIRST_SPEC_OBJECT_TYPE);
|
|
954
952
|
__ b(ge, &exit);
|
|
955
953
|
|
|
956
954
|
// Throw away the result of the constructor invocation and use the
|
|
@@ -1046,11 +1044,11 @@ static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
|
|
|
1046
1044
|
// Invoke the code and pass argc as r0.
|
|
1047
1045
|
__ mov(r0, Operand(r3));
|
|
1048
1046
|
if (is_construct) {
|
|
1049
|
-
__ Call(masm->isolate()->builtins()->JSConstructCall()
|
|
1050
|
-
RelocInfo::CODE_TARGET);
|
|
1047
|
+
__ Call(masm->isolate()->builtins()->JSConstructCall());
|
|
1051
1048
|
} else {
|
|
1052
1049
|
ParameterCount actual(r0);
|
|
1053
|
-
__ InvokeFunction(r1, actual, CALL_FUNCTION
|
|
1050
|
+
__ InvokeFunction(r1, actual, CALL_FUNCTION,
|
|
1051
|
+
NullCallWrapper(), CALL_AS_METHOD);
|
|
1054
1052
|
}
|
|
1055
1053
|
|
|
1056
1054
|
// Exit the JS frame and remove the parameters (except function), and return.
|
|
@@ -1234,8 +1232,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
|
|
1234
1232
|
// r0: actual number of arguments
|
|
1235
1233
|
Label non_function;
|
|
1236
1234
|
__ ldr(r1, MemOperand(sp, r0, LSL, kPointerSizeLog2));
|
|
1237
|
-
__
|
|
1238
|
-
__ b(eq, &non_function);
|
|
1235
|
+
__ JumpIfSmi(r1, &non_function);
|
|
1239
1236
|
__ CompareObjectType(r1, r2, r2, JS_FUNCTION_TYPE);
|
|
1240
1237
|
__ b(ne, &non_function);
|
|
1241
1238
|
|
|
@@ -1255,8 +1252,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
|
|
1255
1252
|
__ b(ne, &shift_arguments);
|
|
1256
1253
|
|
|
1257
1254
|
// Do not transform the receiver for native (Compilerhints already in r3).
|
|
1258
|
-
__ tst(r3, Operand(1 << (SharedFunctionInfo::
|
|
1259
|
-
kSmiTagSize)));
|
|
1255
|
+
__ tst(r3, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize)));
|
|
1260
1256
|
__ b(ne, &shift_arguments);
|
|
1261
1257
|
|
|
1262
1258
|
// Compute the receiver in non-strict mode.
|
|
@@ -1265,8 +1261,7 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
|
|
1265
1261
|
// r0: actual number of arguments
|
|
1266
1262
|
// r1: function
|
|
1267
1263
|
// r2: first argument
|
|
1268
|
-
__
|
|
1269
|
-
__ b(eq, &convert_to_object);
|
|
1264
|
+
__ JumpIfSmi(r2, &convert_to_object);
|
|
1270
1265
|
|
|
1271
1266
|
__ LoadRoot(r3, Heap::kUndefinedValueRootIndex);
|
|
1272
1267
|
__ cmp(r2, r3);
|
|
@@ -1275,9 +1270,8 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
|
|
1275
1270
|
__ cmp(r2, r3);
|
|
1276
1271
|
__ b(eq, &use_global_receiver);
|
|
1277
1272
|
|
|
1278
|
-
STATIC_ASSERT(
|
|
1279
|
-
|
|
1280
|
-
__ CompareObjectType(r2, r3, r3, FIRST_JS_OBJECT_TYPE);
|
|
1273
|
+
STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
|
1274
|
+
__ CompareObjectType(r2, r3, r3, FIRST_SPEC_OBJECT_TYPE);
|
|
1281
1275
|
__ b(ge, &shift_arguments);
|
|
1282
1276
|
|
|
1283
1277
|
__ bind(&convert_to_object);
|
|
@@ -1379,7 +1373,8 @@ void Builtins::Generate_FunctionCall(MacroAssembler* masm) {
|
|
|
1379
1373
|
ne);
|
|
1380
1374
|
|
|
1381
1375
|
ParameterCount expected(0);
|
|
1382
|
-
__ InvokeCode(r3, expected, expected, JUMP_FUNCTION
|
|
1376
|
+
__ InvokeCode(r3, expected, expected, JUMP_FUNCTION,
|
|
1377
|
+
NullCallWrapper(), CALL_AS_METHOD);
|
|
1383
1378
|
}
|
|
1384
1379
|
|
|
1385
1380
|
|
|
@@ -1440,13 +1435,11 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
|
|
1440
1435
|
__ b(ne, &push_receiver);
|
|
1441
1436
|
|
|
1442
1437
|
// Do not transform the receiver for strict mode functions.
|
|
1443
|
-
__ tst(r2, Operand(1 << (SharedFunctionInfo::
|
|
1444
|
-
kSmiTagSize)));
|
|
1438
|
+
__ tst(r2, Operand(1 << (SharedFunctionInfo::kNative + kSmiTagSize)));
|
|
1445
1439
|
__ b(ne, &push_receiver);
|
|
1446
1440
|
|
|
1447
1441
|
// Compute the receiver in non-strict mode.
|
|
1448
|
-
__
|
|
1449
|
-
__ b(eq, &call_to_object);
|
|
1442
|
+
__ JumpIfSmi(r0, &call_to_object);
|
|
1450
1443
|
__ LoadRoot(r1, Heap::kNullValueRootIndex);
|
|
1451
1444
|
__ cmp(r0, r1);
|
|
1452
1445
|
__ b(eq, &use_global_receiver);
|
|
@@ -1456,9 +1449,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
|
|
1456
1449
|
|
|
1457
1450
|
// Check if the receiver is already a JavaScript object.
|
|
1458
1451
|
// r0: receiver
|
|
1459
|
-
STATIC_ASSERT(
|
|
1460
|
-
|
|
1461
|
-
__ CompareObjectType(r0, r1, r1, FIRST_JS_OBJECT_TYPE);
|
|
1452
|
+
STATIC_ASSERT(LAST_SPEC_OBJECT_TYPE == LAST_TYPE);
|
|
1453
|
+
__ CompareObjectType(r0, r1, r1, FIRST_SPEC_OBJECT_TYPE);
|
|
1462
1454
|
__ b(ge, &push_receiver);
|
|
1463
1455
|
|
|
1464
1456
|
// Convert the receiver to a regular object.
|
|
@@ -1515,7 +1507,8 @@ void Builtins::Generate_FunctionApply(MacroAssembler* masm) {
|
|
|
1515
1507
|
ParameterCount actual(r0);
|
|
1516
1508
|
__ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
|
1517
1509
|
__ ldr(r1, MemOperand(fp, kFunctionOffset));
|
|
1518
|
-
__ InvokeFunction(r1, actual, CALL_FUNCTION
|
|
1510
|
+
__ InvokeFunction(r1, actual, CALL_FUNCTION,
|
|
1511
|
+
NullCallWrapper(), CALL_AS_METHOD);
|
|
1519
1512
|
|
|
1520
1513
|
// Tear down the internal frame and remove function, receiver and args.
|
|
1521
1514
|
__ LeaveInternalFrame();
|
|
@@ -69,8 +69,7 @@ static void EmitCheckForHeapNumber(MacroAssembler* masm, Register operand,
|
|
|
69
69
|
void ToNumberStub::Generate(MacroAssembler* masm) {
|
|
70
70
|
// The ToNumber stub takes one argument in eax.
|
|
71
71
|
Label check_heap_number, call_builtin;
|
|
72
|
-
__
|
|
73
|
-
__ b(ne, &check_heap_number);
|
|
72
|
+
__ JumpIfNotSmi(r0, &check_heap_number);
|
|
74
73
|
__ Ret();
|
|
75
74
|
|
|
76
75
|
__ bind(&check_heap_number);
|
|
@@ -158,7 +157,7 @@ void FastNewContextStub::Generate(MacroAssembler* masm) {
|
|
|
158
157
|
__ ldr(r3, MemOperand(sp, 0));
|
|
159
158
|
|
|
160
159
|
// Setup the object header.
|
|
161
|
-
__ LoadRoot(r2, Heap::
|
|
160
|
+
__ LoadRoot(r2, Heap::kFunctionContextMapRootIndex);
|
|
162
161
|
__ str(r2, FieldMemOperand(r0, HeapObject::kMapOffset));
|
|
163
162
|
__ mov(r2, Operand(Smi::FromInt(length)));
|
|
164
163
|
__ str(r2, FieldMemOperand(r0, FixedArray::kLengthOffset));
|
|
@@ -166,11 +165,10 @@ void FastNewContextStub::Generate(MacroAssembler* masm) {
|
|
|
166
165
|
// Setup the fixed slots.
|
|
167
166
|
__ mov(r1, Operand(Smi::FromInt(0)));
|
|
168
167
|
__ str(r3, MemOperand(r0, Context::SlotOffset(Context::CLOSURE_INDEX)));
|
|
169
|
-
__ str(
|
|
170
|
-
__ str(r1, MemOperand(r0, Context::SlotOffset(Context::PREVIOUS_INDEX)));
|
|
168
|
+
__ str(cp, MemOperand(r0, Context::SlotOffset(Context::PREVIOUS_INDEX)));
|
|
171
169
|
__ str(r1, MemOperand(r0, Context::SlotOffset(Context::EXTENSION_INDEX)));
|
|
172
170
|
|
|
173
|
-
// Copy the global object from the
|
|
171
|
+
// Copy the global object from the previous context.
|
|
174
172
|
__ ldr(r1, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
|
175
173
|
__ str(r1, MemOperand(r0, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
|
176
174
|
|
|
@@ -187,7 +185,7 @@ void FastNewContextStub::Generate(MacroAssembler* masm) {
|
|
|
187
185
|
|
|
188
186
|
// Need to collect. Call into runtime system.
|
|
189
187
|
__ bind(&gc);
|
|
190
|
-
__ TailCallRuntime(Runtime::
|
|
188
|
+
__ TailCallRuntime(Runtime::kNewFunctionContext, 1, 1);
|
|
191
189
|
}
|
|
192
190
|
|
|
193
191
|
|
|
@@ -306,12 +304,6 @@ class ConvertToDoubleStub : public CodeStub {
|
|
|
306
304
|
}
|
|
307
305
|
|
|
308
306
|
void Generate(MacroAssembler* masm);
|
|
309
|
-
|
|
310
|
-
const char* GetName() { return "ConvertToDoubleStub"; }
|
|
311
|
-
|
|
312
|
-
#ifdef DEBUG
|
|
313
|
-
void Print() { PrintF("ConvertToDoubleStub\n"); }
|
|
314
|
-
#endif
|
|
315
307
|
};
|
|
316
308
|
|
|
317
309
|
|
|
@@ -394,11 +386,11 @@ void FloatingPointHelper::LoadSmis(MacroAssembler* masm,
|
|
|
394
386
|
__ mov(scratch1, Operand(r0));
|
|
395
387
|
ConvertToDoubleStub stub1(r3, r2, scratch1, scratch2);
|
|
396
388
|
__ push(lr);
|
|
397
|
-
__ Call(stub1.GetCode()
|
|
389
|
+
__ Call(stub1.GetCode());
|
|
398
390
|
// Write Smi from r1 to r1 and r0 in double format.
|
|
399
391
|
__ mov(scratch1, Operand(r1));
|
|
400
392
|
ConvertToDoubleStub stub2(r1, r0, scratch1, scratch2);
|
|
401
|
-
__ Call(stub2.GetCode()
|
|
393
|
+
__ Call(stub2.GetCode());
|
|
402
394
|
__ pop(lr);
|
|
403
395
|
}
|
|
404
396
|
}
|
|
@@ -475,7 +467,7 @@ void FloatingPointHelper::LoadNumber(MacroAssembler* masm,
|
|
|
475
467
|
__ mov(scratch1, Operand(object));
|
|
476
468
|
ConvertToDoubleStub stub(dst2, dst1, scratch1, scratch2);
|
|
477
469
|
__ push(lr);
|
|
478
|
-
__ Call(stub.GetCode()
|
|
470
|
+
__ Call(stub.GetCode());
|
|
479
471
|
__ pop(lr);
|
|
480
472
|
}
|
|
481
473
|
|
|
@@ -557,7 +549,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|
|
557
549
|
// | s | exp | mantissa |
|
|
558
550
|
|
|
559
551
|
// Check for zero.
|
|
560
|
-
__ cmp(int_scratch, Operand(
|
|
552
|
+
__ cmp(int_scratch, Operand::Zero());
|
|
561
553
|
__ mov(dst2, int_scratch);
|
|
562
554
|
__ mov(dst1, int_scratch);
|
|
563
555
|
__ b(eq, &done);
|
|
@@ -565,7 +557,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|
|
565
557
|
// Preload the sign of the value.
|
|
566
558
|
__ and_(dst2, int_scratch, Operand(HeapNumber::kSignMask), SetCC);
|
|
567
559
|
// Get the absolute value of the object (as an unsigned integer).
|
|
568
|
-
__ rsb(int_scratch, int_scratch, Operand(
|
|
560
|
+
__ rsb(int_scratch, int_scratch, Operand::Zero(), SetCC, mi);
|
|
569
561
|
|
|
570
562
|
// Get mantisssa[51:20].
|
|
571
563
|
|
|
@@ -597,7 +589,7 @@ void FloatingPointHelper::ConvertIntToDouble(MacroAssembler* masm,
|
|
|
597
589
|
__ mov(scratch2, Operand(int_scratch, LSL, scratch2));
|
|
598
590
|
__ orr(dst2, dst2, scratch2);
|
|
599
591
|
// Set dst1 to 0.
|
|
600
|
-
__ mov(dst1, Operand(
|
|
592
|
+
__ mov(dst1, Operand::Zero());
|
|
601
593
|
}
|
|
602
594
|
__ bind(&done);
|
|
603
595
|
}
|
|
@@ -665,7 +657,7 @@ void FloatingPointHelper::LoadNumberAsInt32Double(MacroAssembler* masm,
|
|
|
665
657
|
// Check for 0 and -0.
|
|
666
658
|
__ bic(scratch1, dst1, Operand(HeapNumber::kSignMask));
|
|
667
659
|
__ orr(scratch1, scratch1, Operand(dst2));
|
|
668
|
-
__ cmp(scratch1, Operand(
|
|
660
|
+
__ cmp(scratch1, Operand::Zero());
|
|
669
661
|
__ b(eq, &done);
|
|
670
662
|
|
|
671
663
|
// Check that the value can be exactly represented by a 32-bit integer.
|
|
@@ -738,7 +730,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm,
|
|
|
738
730
|
// Check for 0 and -0.
|
|
739
731
|
__ bic(dst, scratch1, Operand(HeapNumber::kSignMask));
|
|
740
732
|
__ orr(dst, scratch2, Operand(dst));
|
|
741
|
-
__ cmp(dst, Operand(
|
|
733
|
+
__ cmp(dst, Operand::Zero());
|
|
742
734
|
__ b(eq, &done);
|
|
743
735
|
|
|
744
736
|
DoubleIs32BitInteger(masm, scratch1, scratch2, dst, scratch3, not_int32);
|
|
@@ -755,7 +747,7 @@ void FloatingPointHelper::LoadNumberAsInt32(MacroAssembler* masm,
|
|
|
755
747
|
// Set the sign.
|
|
756
748
|
__ ldr(scratch1, FieldMemOperand(object, HeapNumber::kExponentOffset));
|
|
757
749
|
__ tst(scratch1, Operand(HeapNumber::kSignMask));
|
|
758
|
-
__ rsb(dst, dst, Operand(
|
|
750
|
+
__ rsb(dst, dst, Operand::Zero(), LeaveCC, mi);
|
|
759
751
|
}
|
|
760
752
|
|
|
761
753
|
__ bind(&done);
|
|
@@ -931,14 +923,14 @@ static void EmitIdenticalObjectComparison(MacroAssembler* masm,
|
|
|
931
923
|
// They are both equal and they are not both Smis so both of them are not
|
|
932
924
|
// Smis. If it's not a heap number, then return equal.
|
|
933
925
|
if (cond == lt || cond == gt) {
|
|
934
|
-
__ CompareObjectType(r0, r4, r4,
|
|
926
|
+
__ CompareObjectType(r0, r4, r4, FIRST_SPEC_OBJECT_TYPE);
|
|
935
927
|
__ b(ge, slow);
|
|
936
928
|
} else {
|
|
937
929
|
__ CompareObjectType(r0, r4, r4, HEAP_NUMBER_TYPE);
|
|
938
930
|
__ b(eq, &heap_number);
|
|
939
931
|
// Comparing JS objects with <=, >= is complicated.
|
|
940
932
|
if (cond != eq) {
|
|
941
|
-
__ cmp(r4, Operand(
|
|
933
|
+
__ cmp(r4, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
942
934
|
__ b(ge, slow);
|
|
943
935
|
// Normally here we fall through to return_equal, but undefined is
|
|
944
936
|
// special: (undefined == undefined) == true, but
|
|
@@ -1029,8 +1021,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm,
|
|
|
1029
1021
|
(lhs.is(r1) && rhs.is(r0)));
|
|
1030
1022
|
|
|
1031
1023
|
Label rhs_is_smi;
|
|
1032
|
-
__
|
|
1033
|
-
__ b(eq, &rhs_is_smi);
|
|
1024
|
+
__ JumpIfSmi(rhs, &rhs_is_smi);
|
|
1034
1025
|
|
|
1035
1026
|
// Lhs is a Smi. Check whether the rhs is a heap number.
|
|
1036
1027
|
__ CompareObjectType(rhs, r4, r4, HEAP_NUMBER_TYPE);
|
|
@@ -1061,7 +1052,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm,
|
|
|
1061
1052
|
// Convert lhs to a double in r2, r3.
|
|
1062
1053
|
__ mov(r7, Operand(lhs));
|
|
1063
1054
|
ConvertToDoubleStub stub1(r3, r2, r7, r6);
|
|
1064
|
-
__ Call(stub1.GetCode()
|
|
1055
|
+
__ Call(stub1.GetCode());
|
|
1065
1056
|
// Load rhs to a double in r0, r1.
|
|
1066
1057
|
__ Ldrd(r0, r1, FieldMemOperand(rhs, HeapNumber::kValueOffset));
|
|
1067
1058
|
__ pop(lr);
|
|
@@ -1103,7 +1094,7 @@ static void EmitSmiNonsmiComparison(MacroAssembler* masm,
|
|
|
1103
1094
|
// Convert rhs to a double in r0, r1.
|
|
1104
1095
|
__ mov(r7, Operand(rhs));
|
|
1105
1096
|
ConvertToDoubleStub stub2(r1, r0, r7, r6);
|
|
1106
|
-
__ Call(stub2.GetCode()
|
|
1097
|
+
__ Call(stub2.GetCode());
|
|
1107
1098
|
__ pop(lr);
|
|
1108
1099
|
}
|
|
1109
1100
|
// Fall through to both_loaded_as_doubles.
|
|
@@ -1220,14 +1211,14 @@ static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm,
|
|
|
1220
1211
|
ASSERT((lhs.is(r0) && rhs.is(r1)) ||
|
|
1221
1212
|
(lhs.is(r1) && rhs.is(r0)));
|
|
1222
1213
|
|
|
1223
|
-
// If either operand is a
|
|
1214
|
+
// If either operand is a JS object or an oddball value, then they are
|
|
1224
1215
|
// not equal since their pointers are different.
|
|
1225
1216
|
// There is no test for undetectability in strict equality.
|
|
1226
|
-
STATIC_ASSERT(LAST_TYPE ==
|
|
1217
|
+
STATIC_ASSERT(LAST_TYPE == LAST_CALLABLE_SPEC_OBJECT_TYPE);
|
|
1227
1218
|
Label first_non_object;
|
|
1228
1219
|
// Get the type of the first operand into r2 and compare it with
|
|
1229
|
-
//
|
|
1230
|
-
__ CompareObjectType(rhs, r2, r2,
|
|
1220
|
+
// FIRST_SPEC_OBJECT_TYPE.
|
|
1221
|
+
__ CompareObjectType(rhs, r2, r2, FIRST_SPEC_OBJECT_TYPE);
|
|
1231
1222
|
__ b(lt, &first_non_object);
|
|
1232
1223
|
|
|
1233
1224
|
// Return non-zero (r0 is not zero)
|
|
@@ -1240,7 +1231,7 @@ static void EmitStrictTwoHeapObjectCompare(MacroAssembler* masm,
|
|
|
1240
1231
|
__ cmp(r2, Operand(ODDBALL_TYPE));
|
|
1241
1232
|
__ b(eq, &return_not_equal);
|
|
1242
1233
|
|
|
1243
|
-
__ CompareObjectType(lhs, r3, r3,
|
|
1234
|
+
__ CompareObjectType(lhs, r3, r3, FIRST_SPEC_OBJECT_TYPE);
|
|
1244
1235
|
__ b(ge, &return_not_equal);
|
|
1245
1236
|
|
|
1246
1237
|
// Check for oddballs: true, false, null, undefined.
|
|
@@ -1317,9 +1308,9 @@ static void EmitCheckForSymbolsOrObjects(MacroAssembler* masm,
|
|
|
1317
1308
|
__ Ret();
|
|
1318
1309
|
|
|
1319
1310
|
__ bind(&object_test);
|
|
1320
|
-
__ cmp(r2, Operand(
|
|
1311
|
+
__ cmp(r2, Operand(FIRST_SPEC_OBJECT_TYPE));
|
|
1321
1312
|
__ b(lt, not_both_strings);
|
|
1322
|
-
__ CompareObjectType(lhs, r2, r3,
|
|
1313
|
+
__ CompareObjectType(lhs, r2, r3, FIRST_SPEC_OBJECT_TYPE);
|
|
1323
1314
|
__ b(lt, not_both_strings);
|
|
1324
1315
|
// If both objects are undetectable, they are equal. Otherwise, they
|
|
1325
1316
|
// are not equal, since they are different objects and an object is not
|
|
@@ -1458,8 +1449,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
|
|
1458
1449
|
if (include_smi_compare_) {
|
|
1459
1450
|
Label not_two_smis, smi_done;
|
|
1460
1451
|
__ orr(r2, r1, r0);
|
|
1461
|
-
__
|
|
1462
|
-
__ b(ne, ¬_two_smis);
|
|
1452
|
+
__ JumpIfNotSmi(r2, ¬_two_smis);
|
|
1463
1453
|
__ mov(r1, Operand(r1, ASR, 1));
|
|
1464
1454
|
__ sub(r0, r1, Operand(r0, ASR, 1));
|
|
1465
1455
|
__ Ret();
|
|
@@ -1482,8 +1472,7 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
|
|
1482
1472
|
STATIC_ASSERT(kSmiTag == 0);
|
|
1483
1473
|
ASSERT_EQ(0, Smi::FromInt(0));
|
|
1484
1474
|
__ and_(r2, lhs_, Operand(rhs_));
|
|
1485
|
-
__
|
|
1486
|
-
__ b(ne, ¬_smis);
|
|
1475
|
+
__ JumpIfNotSmi(r2, ¬_smis);
|
|
1487
1476
|
// One operand is a smi. EmitSmiNonsmiComparison generates code that can:
|
|
1488
1477
|
// 1) Return the answer.
|
|
1489
1478
|
// 2) Go to slow.
|
|
@@ -1614,124 +1603,127 @@ void CompareStub::Generate(MacroAssembler* masm) {
|
|
|
1614
1603
|
}
|
|
1615
1604
|
|
|
1616
1605
|
|
|
1617
|
-
//
|
|
1618
|
-
//
|
|
1606
|
+
// The stub expects its argument in the tos_ register and returns its result in
|
|
1607
|
+
// it, too: zero for false, and a non-zero value for true.
|
|
1619
1608
|
void ToBooleanStub::Generate(MacroAssembler* masm) {
|
|
1620
1609
|
// This stub uses VFP3 instructions.
|
|
1621
1610
|
CpuFeatures::Scope scope(VFP3);
|
|
1622
1611
|
|
|
1623
|
-
Label
|
|
1624
|
-
|
|
1625
|
-
Register scratch = r9.is(tos_) ? r7 : r9;
|
|
1612
|
+
Label patch;
|
|
1613
|
+
const Register map = r9.is(tos_) ? r7 : r9;
|
|
1626
1614
|
|
|
1627
|
-
// undefined -> false
|
|
1628
|
-
|
|
1629
|
-
__ cmp(tos_, ip);
|
|
1630
|
-
__ b(eq, &false_result);
|
|
1631
|
-
|
|
1632
|
-
// Boolean -> its value
|
|
1633
|
-
__ LoadRoot(ip, Heap::kFalseValueRootIndex);
|
|
1634
|
-
__ cmp(tos_, ip);
|
|
1635
|
-
__ b(eq, &false_result);
|
|
1636
|
-
__ LoadRoot(ip, Heap::kTrueValueRootIndex);
|
|
1637
|
-
__ cmp(tos_, ip);
|
|
1638
|
-
// "tos_" is a register and contains a non-zero value. Hence we implicitly
|
|
1639
|
-
// return true if the equal condition is satisfied.
|
|
1640
|
-
__ Ret(eq);
|
|
1615
|
+
// undefined -> false.
|
|
1616
|
+
CheckOddball(masm, UNDEFINED, Heap::kUndefinedValueRootIndex, false);
|
|
1641
1617
|
|
|
1642
|
-
//
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
__ tst(tos_, Operand(kSmiTagMask));
|
|
1646
|
-
// "tos_" is a register and contains a non-zero value. Hence we implicitly
|
|
1647
|
-
// return true if the not equal condition is satisfied.
|
|
1648
|
-
__ Ret(eq);
|
|
1618
|
+
// Boolean -> its value.
|
|
1619
|
+
CheckOddball(masm, BOOLEAN, Heap::kFalseValueRootIndex, false);
|
|
1620
|
+
CheckOddball(masm, BOOLEAN, Heap::kTrueValueRootIndex, true);
|
|
1649
1621
|
|
|
1650
|
-
// 'null' -> false
|
|
1651
|
-
|
|
1652
|
-
__ cmp(tos_, ip);
|
|
1653
|
-
__ b(eq, &false_result);
|
|
1654
|
-
|
|
1655
|
-
// HeapNumber => false iff +0, -0, or NaN.
|
|
1656
|
-
__ ldr(scratch, FieldMemOperand(tos_, HeapObject::kMapOffset));
|
|
1657
|
-
__ LoadRoot(ip, Heap::kHeapNumberMapRootIndex);
|
|
1658
|
-
__ cmp(scratch, ip);
|
|
1659
|
-
__ b(¬_heap_number, ne);
|
|
1660
|
-
__ vldr(d1, FieldMemOperand(tos_, HeapNumber::kValueOffset));
|
|
1661
|
-
__ VFPCompareAndSetFlags(d1, 0.0);
|
|
1662
|
-
// "tos_" is a register, and contains a non zero value by default.
|
|
1663
|
-
// Hence we only need to overwrite "tos_" with zero to return false for
|
|
1664
|
-
// FP_ZERO or FP_NAN cases. Otherwise, by default it returns true.
|
|
1665
|
-
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, eq); // for FP_ZERO
|
|
1666
|
-
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, vs); // for FP_NAN
|
|
1667
|
-
__ Ret();
|
|
1622
|
+
// 'null' -> false.
|
|
1623
|
+
CheckOddball(masm, NULL_TYPE, Heap::kNullValueRootIndex, false);
|
|
1668
1624
|
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
// JavaScript object => true.
|
|
1680
|
-
__ ldr(scratch, FieldMemOperand(tos_, HeapObject::kMapOffset));
|
|
1681
|
-
__ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset));
|
|
1682
|
-
__ cmp(scratch, Operand(FIRST_JS_OBJECT_TYPE));
|
|
1683
|
-
// "tos_" is a register and contains a non-zero value.
|
|
1684
|
-
// Hence we implicitly return true if the greater than
|
|
1685
|
-
// condition is satisfied.
|
|
1686
|
-
__ Ret(gt);
|
|
1687
|
-
|
|
1688
|
-
// Check for string
|
|
1689
|
-
__ ldr(scratch, FieldMemOperand(tos_, HeapObject::kMapOffset));
|
|
1690
|
-
__ ldrb(scratch, FieldMemOperand(scratch, Map::kInstanceTypeOffset));
|
|
1691
|
-
__ cmp(scratch, Operand(FIRST_NONSTRING_TYPE));
|
|
1692
|
-
// "tos_" is a register and contains a non-zero value.
|
|
1693
|
-
// Hence we implicitly return true if the greater than
|
|
1694
|
-
// condition is satisfied.
|
|
1695
|
-
__ Ret(gt);
|
|
1696
|
-
|
|
1697
|
-
// String value => false iff empty, i.e., length is zero
|
|
1698
|
-
__ ldr(tos_, FieldMemOperand(tos_, String::kLengthOffset));
|
|
1699
|
-
// If length is zero, "tos_" contains zero ==> false.
|
|
1700
|
-
// If length is not zero, "tos_" contains a non-zero value ==> true.
|
|
1701
|
-
__ Ret();
|
|
1625
|
+
if (types_.Contains(SMI)) {
|
|
1626
|
+
// Smis: 0 -> false, all other -> true
|
|
1627
|
+
__ tst(tos_, Operand(kSmiTagMask));
|
|
1628
|
+
// tos_ contains the correct return value already
|
|
1629
|
+
__ Ret(eq);
|
|
1630
|
+
} else if (types_.NeedsMap()) {
|
|
1631
|
+
// If we need a map later and have a Smi -> patch.
|
|
1632
|
+
__ JumpIfSmi(tos_, &patch);
|
|
1633
|
+
}
|
|
1702
1634
|
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
|
|
1706
|
-
|
|
1635
|
+
if (types_.NeedsMap()) {
|
|
1636
|
+
__ ldr(map, FieldMemOperand(tos_, HeapObject::kMapOffset));
|
|
1637
|
+
|
|
1638
|
+
if (types_.CanBeUndetectable()) {
|
|
1639
|
+
__ ldrb(ip, FieldMemOperand(map, Map::kBitFieldOffset));
|
|
1640
|
+
__ tst(ip, Operand(1 << Map::kIsUndetectable));
|
|
1641
|
+
// Undetectable -> false.
|
|
1642
|
+
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, ne);
|
|
1643
|
+
__ Ret(ne);
|
|
1644
|
+
}
|
|
1645
|
+
}
|
|
1646
|
+
|
|
1647
|
+
if (types_.Contains(SPEC_OBJECT)) {
|
|
1648
|
+
// Spec object -> true.
|
|
1649
|
+
__ CompareInstanceType(map, ip, FIRST_SPEC_OBJECT_TYPE);
|
|
1650
|
+
// tos_ contains the correct non-zero return value already.
|
|
1651
|
+
__ Ret(ge);
|
|
1652
|
+
}
|
|
1653
|
+
|
|
1654
|
+
if (types_.Contains(STRING)) {
|
|
1655
|
+
// String value -> false iff empty.
|
|
1656
|
+
__ CompareInstanceType(map, ip, FIRST_NONSTRING_TYPE);
|
|
1657
|
+
__ ldr(tos_, FieldMemOperand(tos_, String::kLengthOffset), lt);
|
|
1658
|
+
__ Ret(lt); // the string length is OK as the return value
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
if (types_.Contains(HEAP_NUMBER)) {
|
|
1662
|
+
// Heap number -> false iff +0, -0, or NaN.
|
|
1663
|
+
Label not_heap_number;
|
|
1664
|
+
__ CompareRoot(map, Heap::kHeapNumberMapRootIndex);
|
|
1665
|
+
__ b(ne, ¬_heap_number);
|
|
1666
|
+
__ vldr(d1, FieldMemOperand(tos_, HeapNumber::kValueOffset));
|
|
1667
|
+
__ VFPCompareAndSetFlags(d1, 0.0);
|
|
1668
|
+
// "tos_" is a register, and contains a non zero value by default.
|
|
1669
|
+
// Hence we only need to overwrite "tos_" with zero to return false for
|
|
1670
|
+
// FP_ZERO or FP_NAN cases. Otherwise, by default it returns true.
|
|
1671
|
+
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, eq); // for FP_ZERO
|
|
1672
|
+
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, vs); // for FP_NAN
|
|
1673
|
+
__ Ret();
|
|
1674
|
+
__ bind(¬_heap_number);
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
__ bind(&patch);
|
|
1678
|
+
GenerateTypeTransition(masm);
|
|
1707
1679
|
}
|
|
1708
1680
|
|
|
1709
1681
|
|
|
1710
|
-
|
|
1711
|
-
|
|
1712
|
-
|
|
1682
|
+
void ToBooleanStub::CheckOddball(MacroAssembler* masm,
|
|
1683
|
+
Type type,
|
|
1684
|
+
Heap::RootListIndex value,
|
|
1685
|
+
bool result) {
|
|
1686
|
+
if (types_.Contains(type)) {
|
|
1687
|
+
// If we see an expected oddball, return its ToBoolean value tos_.
|
|
1688
|
+
__ LoadRoot(ip, value);
|
|
1689
|
+
__ cmp(tos_, ip);
|
|
1690
|
+
// The value of a root is never NULL, so we can avoid loading a non-null
|
|
1691
|
+
// value into tos_ when we want to return 'true'.
|
|
1692
|
+
if (!result) {
|
|
1693
|
+
__ mov(tos_, Operand(0, RelocInfo::NONE), LeaveCC, eq);
|
|
1694
|
+
}
|
|
1695
|
+
__ Ret(eq);
|
|
1696
|
+
}
|
|
1713
1697
|
}
|
|
1714
1698
|
|
|
1715
1699
|
|
|
1716
|
-
|
|
1717
|
-
if (
|
|
1718
|
-
|
|
1719
|
-
|
|
1720
|
-
|
|
1721
|
-
|
|
1700
|
+
void ToBooleanStub::GenerateTypeTransition(MacroAssembler* masm) {
|
|
1701
|
+
if (!tos_.is(r3)) {
|
|
1702
|
+
__ mov(r3, Operand(tos_));
|
|
1703
|
+
}
|
|
1704
|
+
__ mov(r2, Operand(Smi::FromInt(tos_.code())));
|
|
1705
|
+
__ mov(r1, Operand(Smi::FromInt(types_.ToByte())));
|
|
1706
|
+
__ Push(r3, r2, r1);
|
|
1707
|
+
// Patch the caller to an appropriate specialized stub and return the
|
|
1708
|
+
// operation result to the caller of the stub.
|
|
1709
|
+
__ TailCallExternalReference(
|
|
1710
|
+
ExternalReference(IC_Utility(IC::kToBoolean_Patch), masm->isolate()),
|
|
1711
|
+
3,
|
|
1712
|
+
1);
|
|
1713
|
+
}
|
|
1714
|
+
|
|
1715
|
+
|
|
1716
|
+
void UnaryOpStub::PrintName(StringStream* stream) {
|
|
1722
1717
|
const char* op_name = Token::Name(op_);
|
|
1723
1718
|
const char* overwrite_name = NULL; // Make g++ happy.
|
|
1724
1719
|
switch (mode_) {
|
|
1725
1720
|
case UNARY_NO_OVERWRITE: overwrite_name = "Alloc"; break;
|
|
1726
1721
|
case UNARY_OVERWRITE: overwrite_name = "Overwrite"; break;
|
|
1727
1722
|
}
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
overwrite_name,
|
|
1733
|
-
UnaryOpIC::GetName(operand_type_));
|
|
1734
|
-
return name_;
|
|
1723
|
+
stream->Add("UnaryOpStub_%s_%s_%s",
|
|
1724
|
+
op_name,
|
|
1725
|
+
overwrite_name,
|
|
1726
|
+
UnaryOpIC::GetName(operand_type_));
|
|
1735
1727
|
}
|
|
1736
1728
|
|
|
1737
1729
|
|
|
@@ -1755,22 +1747,14 @@ void UnaryOpStub::Generate(MacroAssembler* masm) {
|
|
|
1755
1747
|
|
|
1756
1748
|
|
|
1757
1749
|
void UnaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
|
1758
|
-
|
|
1759
|
-
__ mov(
|
|
1760
|
-
|
|
1761
|
-
// Push this stub's key. Although the operation and the type info are
|
|
1762
|
-
// encoded into the key, the encoding is opaque, so push them too.
|
|
1763
|
-
__ mov(r2, Operand(Smi::FromInt(MinorKey())));
|
|
1764
|
-
__ mov(r1, Operand(Smi::FromInt(op_)));
|
|
1750
|
+
__ mov(r3, Operand(r0)); // the operand
|
|
1751
|
+
__ mov(r2, Operand(Smi::FromInt(op_)));
|
|
1752
|
+
__ mov(r1, Operand(Smi::FromInt(mode_)));
|
|
1765
1753
|
__ mov(r0, Operand(Smi::FromInt(operand_type_)));
|
|
1766
|
-
|
|
1767
1754
|
__ Push(r3, r2, r1, r0);
|
|
1768
1755
|
|
|
1769
1756
|
__ TailCallExternalReference(
|
|
1770
|
-
ExternalReference(IC_Utility(IC::kUnaryOp_Patch),
|
|
1771
|
-
masm->isolate()),
|
|
1772
|
-
4,
|
|
1773
|
-
1);
|
|
1757
|
+
ExternalReference(IC_Utility(IC::kUnaryOp_Patch), masm->isolate()), 4, 1);
|
|
1774
1758
|
}
|
|
1775
1759
|
|
|
1776
1760
|
|
|
@@ -1903,6 +1887,8 @@ void UnaryOpStub::GenerateHeapNumberCodeSub(MacroAssembler* masm,
|
|
|
1903
1887
|
|
|
1904
1888
|
void UnaryOpStub::GenerateHeapNumberCodeBitNot(
|
|
1905
1889
|
MacroAssembler* masm, Label* slow) {
|
|
1890
|
+
Label impossible;
|
|
1891
|
+
|
|
1906
1892
|
EmitCheckForHeapNumber(masm, r0, r1, r6, slow);
|
|
1907
1893
|
// Convert the heap number is r0 to an untagged integer in r1.
|
|
1908
1894
|
__ ConvertToInt32(r0, r1, r2, r3, d0, slow);
|
|
@@ -1921,17 +1907,27 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot(
|
|
|
1921
1907
|
__ bind(&try_float);
|
|
1922
1908
|
if (mode_ == UNARY_NO_OVERWRITE) {
|
|
1923
1909
|
Label slow_allocate_heapnumber, heapnumber_allocated;
|
|
1924
|
-
|
|
1910
|
+
// Allocate a new heap number without zapping r0, which we need if it fails.
|
|
1911
|
+
__ AllocateHeapNumber(r2, r3, r4, r6, &slow_allocate_heapnumber);
|
|
1925
1912
|
__ jmp(&heapnumber_allocated);
|
|
1926
1913
|
|
|
1927
1914
|
__ bind(&slow_allocate_heapnumber);
|
|
1928
1915
|
__ EnterInternalFrame();
|
|
1929
|
-
__ push(
|
|
1930
|
-
|
|
1931
|
-
__
|
|
1916
|
+
__ push(r0); // Push the heap number, not the untagged int32.
|
|
1917
|
+
__ CallRuntime(Runtime::kNumberAlloc, 0);
|
|
1918
|
+
__ mov(r2, r0); // Move the new heap number into r2.
|
|
1919
|
+
// Get the heap number into r0, now that the new heap number is in r2.
|
|
1920
|
+
__ pop(r0);
|
|
1932
1921
|
__ LeaveInternalFrame();
|
|
1933
1922
|
|
|
1923
|
+
// Convert the heap number in r0 to an untagged integer in r1.
|
|
1924
|
+
// This can't go slow-case because it's the same number we already
|
|
1925
|
+
// converted once again.
|
|
1926
|
+
__ ConvertToInt32(r0, r1, r3, r4, d0, &impossible);
|
|
1927
|
+
__ mvn(r1, Operand(r1));
|
|
1928
|
+
|
|
1934
1929
|
__ bind(&heapnumber_allocated);
|
|
1930
|
+
__ mov(r0, r2); // Move newly allocated heap number to r0.
|
|
1935
1931
|
}
|
|
1936
1932
|
|
|
1937
1933
|
if (CpuFeatures::IsSupported(VFP3)) {
|
|
@@ -1948,6 +1944,11 @@ void UnaryOpStub::GenerateHeapNumberCodeBitNot(
|
|
|
1948
1944
|
WriteInt32ToHeapNumberStub stub(r1, r0, r2);
|
|
1949
1945
|
__ Jump(stub.GetCode(), RelocInfo::CODE_TARGET);
|
|
1950
1946
|
}
|
|
1947
|
+
|
|
1948
|
+
__ bind(&impossible);
|
|
1949
|
+
if (FLAG_debug_code) {
|
|
1950
|
+
__ stop("Incorrect assumption in bit-not stub");
|
|
1951
|
+
}
|
|
1951
1952
|
}
|
|
1952
1953
|
|
|
1953
1954
|
|
|
@@ -2002,14 +2003,6 @@ void UnaryOpStub::GenerateGenericCodeFallback(MacroAssembler* masm) {
|
|
|
2002
2003
|
}
|
|
2003
2004
|
|
|
2004
2005
|
|
|
2005
|
-
Handle<Code> GetBinaryOpStub(int key,
|
|
2006
|
-
BinaryOpIC::TypeInfo type_info,
|
|
2007
|
-
BinaryOpIC::TypeInfo result_type_info) {
|
|
2008
|
-
BinaryOpStub stub(key, type_info, result_type_info);
|
|
2009
|
-
return stub.GetCode();
|
|
2010
|
-
}
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
2006
|
void BinaryOpStub::GenerateTypeTransition(MacroAssembler* masm) {
|
|
2014
2007
|
Label get_result;
|
|
2015
2008
|
|
|
@@ -2066,12 +2059,7 @@ void BinaryOpStub::Generate(MacroAssembler* masm) {
|
|
|
2066
2059
|
}
|
|
2067
2060
|
|
|
2068
2061
|
|
|
2069
|
-
|
|
2070
|
-
if (name_ != NULL) return name_;
|
|
2071
|
-
const int kMaxNameLength = 100;
|
|
2072
|
-
name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray(
|
|
2073
|
-
kMaxNameLength);
|
|
2074
|
-
if (name_ == NULL) return "OOM";
|
|
2062
|
+
void BinaryOpStub::PrintName(StringStream* stream) {
|
|
2075
2063
|
const char* op_name = Token::Name(op_);
|
|
2076
2064
|
const char* overwrite_name;
|
|
2077
2065
|
switch (mode_) {
|
|
@@ -2080,13 +2068,10 @@ const char* BinaryOpStub::GetName() {
|
|
|
2080
2068
|
case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break;
|
|
2081
2069
|
default: overwrite_name = "UnknownOverwrite"; break;
|
|
2082
2070
|
}
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
overwrite_name,
|
|
2088
|
-
BinaryOpIC::GetName(operands_type_));
|
|
2089
|
-
return name_;
|
|
2071
|
+
stream->Add("BinaryOpStub_%s_%s_%s",
|
|
2072
|
+
op_name,
|
|
2073
|
+
overwrite_name,
|
|
2074
|
+
BinaryOpIC::GetName(operands_type_));
|
|
2090
2075
|
}
|
|
2091
2076
|
|
|
2092
2077
|
|
|
@@ -2439,13 +2424,11 @@ void BinaryOpStub::GenerateSmiCode(
|
|
|
2439
2424
|
Register left = r1;
|
|
2440
2425
|
Register right = r0;
|
|
2441
2426
|
Register scratch1 = r7;
|
|
2442
|
-
Register scratch2 = r9;
|
|
2443
2427
|
|
|
2444
2428
|
// Perform combined smi check on both operands.
|
|
2445
2429
|
__ orr(scratch1, left, Operand(right));
|
|
2446
2430
|
STATIC_ASSERT(kSmiTag == 0);
|
|
2447
|
-
__
|
|
2448
|
-
__ b(ne, ¬_smis);
|
|
2431
|
+
__ JumpIfNotSmi(scratch1, ¬_smis);
|
|
2449
2432
|
|
|
2450
2433
|
// If the smi-smi operation results in a smi return is generated.
|
|
2451
2434
|
GenerateSmiSmiOperation(masm);
|
|
@@ -2558,37 +2541,36 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|
|
2558
2541
|
case Token::MUL:
|
|
2559
2542
|
case Token::DIV:
|
|
2560
2543
|
case Token::MOD: {
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
|
|
2564
|
-
|
|
2565
|
-
|
|
2566
|
-
|
|
2567
|
-
|
|
2568
|
-
|
|
2569
|
-
|
|
2570
|
-
|
|
2571
|
-
|
|
2572
|
-
|
|
2573
|
-
|
|
2574
|
-
|
|
2575
|
-
|
|
2576
|
-
|
|
2577
|
-
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2587
|
-
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
|
|
2591
|
-
&transition);
|
|
2544
|
+
// Load both operands and check that they are 32-bit integer.
|
|
2545
|
+
// Jump to type transition if they are not. The registers r0 and r1 (right
|
|
2546
|
+
// and left) are preserved for the runtime call.
|
|
2547
|
+
FloatingPointHelper::Destination destination =
|
|
2548
|
+
(CpuFeatures::IsSupported(VFP3) && op_ != Token::MOD)
|
|
2549
|
+
? FloatingPointHelper::kVFPRegisters
|
|
2550
|
+
: FloatingPointHelper::kCoreRegisters;
|
|
2551
|
+
|
|
2552
|
+
FloatingPointHelper::LoadNumberAsInt32Double(masm,
|
|
2553
|
+
right,
|
|
2554
|
+
destination,
|
|
2555
|
+
d7,
|
|
2556
|
+
r2,
|
|
2557
|
+
r3,
|
|
2558
|
+
heap_number_map,
|
|
2559
|
+
scratch1,
|
|
2560
|
+
scratch2,
|
|
2561
|
+
s0,
|
|
2562
|
+
&transition);
|
|
2563
|
+
FloatingPointHelper::LoadNumberAsInt32Double(masm,
|
|
2564
|
+
left,
|
|
2565
|
+
destination,
|
|
2566
|
+
d6,
|
|
2567
|
+
r4,
|
|
2568
|
+
r5,
|
|
2569
|
+
heap_number_map,
|
|
2570
|
+
scratch1,
|
|
2571
|
+
scratch2,
|
|
2572
|
+
s0,
|
|
2573
|
+
&transition);
|
|
2592
2574
|
|
|
2593
2575
|
if (destination == FloatingPointHelper::kVFPRegisters) {
|
|
2594
2576
|
CpuFeatures::Scope scope(VFP3);
|
|
@@ -2635,7 +2617,7 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|
|
2635
2617
|
__ b(mi, &return_heap_number);
|
|
2636
2618
|
// Check for minus zero. Return heap number for minus zero.
|
|
2637
2619
|
Label not_zero;
|
|
2638
|
-
__ cmp(scratch1, Operand(
|
|
2620
|
+
__ cmp(scratch1, Operand::Zero());
|
|
2639
2621
|
__ b(ne, ¬_zero);
|
|
2640
2622
|
__ vmov(scratch2, d5.high());
|
|
2641
2623
|
__ tst(scratch2, Operand(HeapNumber::kSignMask));
|
|
@@ -2649,9 +2631,11 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|
|
2649
2631
|
// DIV just falls through to allocating a heap number.
|
|
2650
2632
|
}
|
|
2651
2633
|
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2634
|
+
__ bind(&return_heap_number);
|
|
2635
|
+
// Return a heap number, or fall through to type transition or runtime
|
|
2636
|
+
// call if we can't.
|
|
2637
|
+
if (result_type_ >= ((op_ == Token::DIV) ? BinaryOpIC::HEAP_NUMBER
|
|
2638
|
+
: BinaryOpIC::INT32)) {
|
|
2655
2639
|
// We are using vfp registers so r5 is available.
|
|
2656
2640
|
heap_number_result = r5;
|
|
2657
2641
|
GenerateHeapResultAllocation(masm,
|
|
@@ -2825,7 +2809,11 @@ void BinaryOpStub::GenerateInt32Stub(MacroAssembler* masm) {
|
|
|
2825
2809
|
UNREACHABLE();
|
|
2826
2810
|
}
|
|
2827
2811
|
|
|
2828
|
-
|
|
2812
|
+
// We never expect DIV to yield an integer result, so we always generate
|
|
2813
|
+
// type transition code for DIV operations expecting an integer result: the
|
|
2814
|
+
// code will fall through to this type transition.
|
|
2815
|
+
if (transition.is_linked() ||
|
|
2816
|
+
((op_ == Token::DIV) && (result_type_ <= BinaryOpIC::INT32))) {
|
|
2829
2817
|
__ bind(&transition);
|
|
2830
2818
|
GenerateTypeTransition(masm);
|
|
2831
2819
|
}
|
|
@@ -3121,7 +3109,6 @@ void TranscendentalCacheStub::Generate(MacroAssembler* masm) {
|
|
|
3121
3109
|
|
|
3122
3110
|
Label no_update;
|
|
3123
3111
|
Label skip_cache;
|
|
3124
|
-
const Register heap_number_map = r5;
|
|
3125
3112
|
|
|
3126
3113
|
// Call C function to calculate the result and update the cache.
|
|
3127
3114
|
// Register r0 holds precalculated cache entry address; preserve
|
|
@@ -3394,15 +3381,10 @@ void CEntryStub::GenerateCore(MacroAssembler* masm,
|
|
|
3394
3381
|
|
|
3395
3382
|
__ mov(r2, Operand(ExternalReference::isolate_address()));
|
|
3396
3383
|
|
|
3397
|
-
|
|
3398
|
-
//
|
|
3399
|
-
//
|
|
3400
|
-
// we
|
|
3401
|
-
// restore from it in case of changes, which makes it impossible to
|
|
3402
|
-
// support moving the C entry code stub. This should be fixed, but currently
|
|
3403
|
-
// this is OK because the CEntryStub gets generated so early in the V8 boot
|
|
3404
|
-
// sequence that it is not moving ever.
|
|
3405
|
-
|
|
3384
|
+
// To let the GC traverse the return address of the exit frames, we need to
|
|
3385
|
+
// know where the return address is. The CEntryStub is unmovable, so
|
|
3386
|
+
// we can store the address on the stack to be able to find it again and
|
|
3387
|
+
// we never have to restore it, because it will not change.
|
|
3406
3388
|
// Compute the return address in lr to return to after the jump below. Pc is
|
|
3407
3389
|
// already at '+ 8' from the current instruction but return is after three
|
|
3408
3390
|
// instructions so add another 4 to pc to get the return address.
|
|
@@ -3552,12 +3534,26 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
3552
3534
|
// Save callee-saved registers (incl. cp and fp), sp, and lr
|
|
3553
3535
|
__ stm(db_w, sp, kCalleeSaved | lr.bit());
|
|
3554
3536
|
|
|
3537
|
+
if (CpuFeatures::IsSupported(VFP3)) {
|
|
3538
|
+
CpuFeatures::Scope scope(VFP3);
|
|
3539
|
+
// Save callee-saved vfp registers.
|
|
3540
|
+
__ vstm(db_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg);
|
|
3541
|
+
// Set up the reserved register for 0.0.
|
|
3542
|
+
__ vmov(kDoubleRegZero, 0.0);
|
|
3543
|
+
}
|
|
3544
|
+
|
|
3555
3545
|
// Get address of argv, see stm above.
|
|
3556
3546
|
// r0: code entry
|
|
3557
3547
|
// r1: function
|
|
3558
3548
|
// r2: receiver
|
|
3559
3549
|
// r3: argc
|
|
3560
|
-
|
|
3550
|
+
|
|
3551
|
+
// Setup argv in r4.
|
|
3552
|
+
int offset_to_argv = (kNumCalleeSaved + 1) * kPointerSize;
|
|
3553
|
+
if (CpuFeatures::IsSupported(VFP3)) {
|
|
3554
|
+
offset_to_argv += kNumDoubleCalleeSaved * kDoubleSize;
|
|
3555
|
+
}
|
|
3556
|
+
__ ldr(r4, MemOperand(sp, offset_to_argv));
|
|
3561
3557
|
|
|
3562
3558
|
// Push a frame with special values setup to mark it as an entry frame.
|
|
3563
3559
|
// r0: code entry
|
|
@@ -3578,13 +3574,12 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
3578
3574
|
// Setup frame pointer for the frame to be pushed.
|
|
3579
3575
|
__ add(fp, sp, Operand(-EntryFrameConstants::kCallerFPOffset));
|
|
3580
3576
|
|
|
3581
|
-
#ifdef ENABLE_LOGGING_AND_PROFILING
|
|
3582
3577
|
// If this is the outermost JS call, set js_entry_sp value.
|
|
3583
3578
|
Label non_outermost_js;
|
|
3584
3579
|
ExternalReference js_entry_sp(Isolate::k_js_entry_sp_address, isolate);
|
|
3585
3580
|
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
|
3586
3581
|
__ ldr(r6, MemOperand(r5));
|
|
3587
|
-
__ cmp(r6, Operand(
|
|
3582
|
+
__ cmp(r6, Operand::Zero());
|
|
3588
3583
|
__ b(ne, &non_outermost_js);
|
|
3589
3584
|
__ str(fp, MemOperand(r5));
|
|
3590
3585
|
__ mov(ip, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
|
@@ -3594,7 +3589,6 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
3594
3589
|
__ mov(ip, Operand(Smi::FromInt(StackFrame::INNER_JSENTRY_FRAME)));
|
|
3595
3590
|
__ bind(&cont);
|
|
3596
3591
|
__ push(ip);
|
|
3597
|
-
#endif
|
|
3598
3592
|
|
|
3599
3593
|
// Call a faked try-block that does the invoke.
|
|
3600
3594
|
__ bl(&invoke);
|
|
@@ -3655,17 +3649,15 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
3655
3649
|
__ PopTryHandler();
|
|
3656
3650
|
|
|
3657
3651
|
__ bind(&exit); // r0 holds result
|
|
3658
|
-
#ifdef ENABLE_LOGGING_AND_PROFILING
|
|
3659
3652
|
// Check if the current stack frame is marked as the outermost JS frame.
|
|
3660
3653
|
Label non_outermost_js_2;
|
|
3661
3654
|
__ pop(r5);
|
|
3662
3655
|
__ cmp(r5, Operand(Smi::FromInt(StackFrame::OUTERMOST_JSENTRY_FRAME)));
|
|
3663
3656
|
__ b(ne, &non_outermost_js_2);
|
|
3664
|
-
__ mov(r6, Operand(
|
|
3657
|
+
__ mov(r6, Operand::Zero());
|
|
3665
3658
|
__ mov(r5, Operand(ExternalReference(js_entry_sp)));
|
|
3666
3659
|
__ str(r6, MemOperand(r5));
|
|
3667
3660
|
__ bind(&non_outermost_js_2);
|
|
3668
|
-
#endif
|
|
3669
3661
|
|
|
3670
3662
|
// Restore the top frame descriptors from the stack.
|
|
3671
3663
|
__ pop(r3);
|
|
@@ -3682,6 +3674,13 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
|
|
|
3682
3674
|
__ mov(lr, Operand(pc));
|
|
3683
3675
|
}
|
|
3684
3676
|
#endif
|
|
3677
|
+
|
|
3678
|
+
if (CpuFeatures::IsSupported(VFP3)) {
|
|
3679
|
+
CpuFeatures::Scope scope(VFP3);
|
|
3680
|
+
// Restore callee-saved vfp registers.
|
|
3681
|
+
__ vldm(ia_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg);
|
|
3682
|
+
}
|
|
3683
|
+
|
|
3685
3684
|
__ ldm(ia_w, sp, kCalleeSaved | pc.bit());
|
|
3686
3685
|
}
|
|
3687
3686
|
|
|
@@ -3856,7 +3855,7 @@ void InstanceofStub::Generate(MacroAssembler* masm) {
|
|
|
3856
3855
|
__ Push(r0, r1);
|
|
3857
3856
|
__ InvokeBuiltin(Builtins::INSTANCE_OF, CALL_FUNCTION);
|
|
3858
3857
|
__ LeaveInternalFrame();
|
|
3859
|
-
__ cmp(r0, Operand(
|
|
3858
|
+
__ cmp(r0, Operand::Zero());
|
|
3860
3859
|
__ LoadRoot(r0, Heap::kTrueValueRootIndex, eq);
|
|
3861
3860
|
__ LoadRoot(r0, Heap::kFalseValueRootIndex, ne);
|
|
3862
3861
|
__ Ret(HasArgsInRegisters() ? 0 : 2);
|
|
@@ -3921,11 +3920,232 @@ void ArgumentsAccessStub::GenerateReadElement(MacroAssembler* masm) {
|
|
|
3921
3920
|
}
|
|
3922
3921
|
|
|
3923
3922
|
|
|
3924
|
-
void ArgumentsAccessStub::
|
|
3923
|
+
void ArgumentsAccessStub::GenerateNewNonStrictSlow(MacroAssembler* masm) {
|
|
3925
3924
|
// sp[0] : number of parameters
|
|
3926
3925
|
// sp[4] : receiver displacement
|
|
3927
3926
|
// sp[8] : function
|
|
3928
3927
|
|
|
3928
|
+
// Check if the calling frame is an arguments adaptor frame.
|
|
3929
|
+
Label runtime;
|
|
3930
|
+
__ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
|
3931
|
+
__ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset));
|
|
3932
|
+
__ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
|
3933
|
+
__ b(ne, &runtime);
|
|
3934
|
+
|
|
3935
|
+
// Patch the arguments.length and the parameters pointer in the current frame.
|
|
3936
|
+
__ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
|
3937
|
+
__ str(r2, MemOperand(sp, 0 * kPointerSize));
|
|
3938
|
+
__ add(r3, r3, Operand(r2, LSL, 1));
|
|
3939
|
+
__ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset));
|
|
3940
|
+
__ str(r3, MemOperand(sp, 1 * kPointerSize));
|
|
3941
|
+
|
|
3942
|
+
__ bind(&runtime);
|
|
3943
|
+
__ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1);
|
|
3944
|
+
}
|
|
3945
|
+
|
|
3946
|
+
|
|
3947
|
+
void ArgumentsAccessStub::GenerateNewNonStrictFast(MacroAssembler* masm) {
|
|
3948
|
+
// Stack layout:
|
|
3949
|
+
// sp[0] : number of parameters (tagged)
|
|
3950
|
+
// sp[4] : address of receiver argument
|
|
3951
|
+
// sp[8] : function
|
|
3952
|
+
// Registers used over whole function:
|
|
3953
|
+
// r6 : allocated object (tagged)
|
|
3954
|
+
// r9 : mapped parameter count (tagged)
|
|
3955
|
+
|
|
3956
|
+
__ ldr(r1, MemOperand(sp, 0 * kPointerSize));
|
|
3957
|
+
// r1 = parameter count (tagged)
|
|
3958
|
+
|
|
3959
|
+
// Check if the calling frame is an arguments adaptor frame.
|
|
3960
|
+
Label runtime;
|
|
3961
|
+
Label adaptor_frame, try_allocate;
|
|
3962
|
+
__ ldr(r3, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
|
3963
|
+
__ ldr(r2, MemOperand(r3, StandardFrameConstants::kContextOffset));
|
|
3964
|
+
__ cmp(r2, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
|
|
3965
|
+
__ b(eq, &adaptor_frame);
|
|
3966
|
+
|
|
3967
|
+
// No adaptor, parameter count = argument count.
|
|
3968
|
+
__ mov(r2, r1);
|
|
3969
|
+
__ b(&try_allocate);
|
|
3970
|
+
|
|
3971
|
+
// We have an adaptor frame. Patch the parameters pointer.
|
|
3972
|
+
__ bind(&adaptor_frame);
|
|
3973
|
+
__ ldr(r2, MemOperand(r3, ArgumentsAdaptorFrameConstants::kLengthOffset));
|
|
3974
|
+
__ add(r3, r3, Operand(r2, LSL, 1));
|
|
3975
|
+
__ add(r3, r3, Operand(StandardFrameConstants::kCallerSPOffset));
|
|
3976
|
+
__ str(r3, MemOperand(sp, 1 * kPointerSize));
|
|
3977
|
+
|
|
3978
|
+
// r1 = parameter count (tagged)
|
|
3979
|
+
// r2 = argument count (tagged)
|
|
3980
|
+
// Compute the mapped parameter count = min(r1, r2) in r1.
|
|
3981
|
+
__ cmp(r1, Operand(r2));
|
|
3982
|
+
__ mov(r1, Operand(r2), LeaveCC, gt);
|
|
3983
|
+
|
|
3984
|
+
__ bind(&try_allocate);
|
|
3985
|
+
|
|
3986
|
+
// Compute the sizes of backing store, parameter map, and arguments object.
|
|
3987
|
+
// 1. Parameter map, has 2 extra words containing context and backing store.
|
|
3988
|
+
const int kParameterMapHeaderSize =
|
|
3989
|
+
FixedArray::kHeaderSize + 2 * kPointerSize;
|
|
3990
|
+
// If there are no mapped parameters, we do not need the parameter_map.
|
|
3991
|
+
__ cmp(r1, Operand(Smi::FromInt(0)));
|
|
3992
|
+
__ mov(r9, Operand::Zero(), LeaveCC, eq);
|
|
3993
|
+
__ mov(r9, Operand(r1, LSL, 1), LeaveCC, ne);
|
|
3994
|
+
__ add(r9, r9, Operand(kParameterMapHeaderSize), LeaveCC, ne);
|
|
3995
|
+
|
|
3996
|
+
// 2. Backing store.
|
|
3997
|
+
__ add(r9, r9, Operand(r2, LSL, 1));
|
|
3998
|
+
__ add(r9, r9, Operand(FixedArray::kHeaderSize));
|
|
3999
|
+
|
|
4000
|
+
// 3. Arguments object.
|
|
4001
|
+
__ add(r9, r9, Operand(Heap::kArgumentsObjectSize));
|
|
4002
|
+
|
|
4003
|
+
// Do the allocation of all three objects in one go.
|
|
4004
|
+
__ AllocateInNewSpace(r9, r0, r3, r4, &runtime, TAG_OBJECT);
|
|
4005
|
+
|
|
4006
|
+
// r0 = address of new object(s) (tagged)
|
|
4007
|
+
// r2 = argument count (tagged)
|
|
4008
|
+
// Get the arguments boilerplate from the current (global) context into r4.
|
|
4009
|
+
const int kNormalOffset =
|
|
4010
|
+
Context::SlotOffset(Context::ARGUMENTS_BOILERPLATE_INDEX);
|
|
4011
|
+
const int kAliasedOffset =
|
|
4012
|
+
Context::SlotOffset(Context::ALIASED_ARGUMENTS_BOILERPLATE_INDEX);
|
|
4013
|
+
|
|
4014
|
+
__ ldr(r4, MemOperand(r8, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
|
4015
|
+
__ ldr(r4, FieldMemOperand(r4, GlobalObject::kGlobalContextOffset));
|
|
4016
|
+
__ cmp(r1, Operand::Zero());
|
|
4017
|
+
__ ldr(r4, MemOperand(r4, kNormalOffset), eq);
|
|
4018
|
+
__ ldr(r4, MemOperand(r4, kAliasedOffset), ne);
|
|
4019
|
+
|
|
4020
|
+
// r0 = address of new object (tagged)
|
|
4021
|
+
// r1 = mapped parameter count (tagged)
|
|
4022
|
+
// r2 = argument count (tagged)
|
|
4023
|
+
// r4 = address of boilerplate object (tagged)
|
|
4024
|
+
// Copy the JS object part.
|
|
4025
|
+
for (int i = 0; i < JSObject::kHeaderSize; i += kPointerSize) {
|
|
4026
|
+
__ ldr(r3, FieldMemOperand(r4, i));
|
|
4027
|
+
__ str(r3, FieldMemOperand(r0, i));
|
|
4028
|
+
}
|
|
4029
|
+
|
|
4030
|
+
// Setup the callee in-object property.
|
|
4031
|
+
STATIC_ASSERT(Heap::kArgumentsCalleeIndex == 1);
|
|
4032
|
+
__ ldr(r3, MemOperand(sp, 2 * kPointerSize));
|
|
4033
|
+
const int kCalleeOffset = JSObject::kHeaderSize +
|
|
4034
|
+
Heap::kArgumentsCalleeIndex * kPointerSize;
|
|
4035
|
+
__ str(r3, FieldMemOperand(r0, kCalleeOffset));
|
|
4036
|
+
|
|
4037
|
+
// Use the length (smi tagged) and set that as an in-object property too.
|
|
4038
|
+
STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0);
|
|
4039
|
+
const int kLengthOffset = JSObject::kHeaderSize +
|
|
4040
|
+
Heap::kArgumentsLengthIndex * kPointerSize;
|
|
4041
|
+
__ str(r2, FieldMemOperand(r0, kLengthOffset));
|
|
4042
|
+
|
|
4043
|
+
// Setup the elements pointer in the allocated arguments object.
|
|
4044
|
+
// If we allocated a parameter map, r4 will point there, otherwise
|
|
4045
|
+
// it will point to the backing store.
|
|
4046
|
+
__ add(r4, r0, Operand(Heap::kArgumentsObjectSize));
|
|
4047
|
+
__ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset));
|
|
4048
|
+
|
|
4049
|
+
// r0 = address of new object (tagged)
|
|
4050
|
+
// r1 = mapped parameter count (tagged)
|
|
4051
|
+
// r2 = argument count (tagged)
|
|
4052
|
+
// r4 = address of parameter map or backing store (tagged)
|
|
4053
|
+
// Initialize parameter map. If there are no mapped arguments, we're done.
|
|
4054
|
+
Label skip_parameter_map;
|
|
4055
|
+
__ cmp(r1, Operand(Smi::FromInt(0)));
|
|
4056
|
+
// Move backing store address to r3, because it is
|
|
4057
|
+
// expected there when filling in the unmapped arguments.
|
|
4058
|
+
__ mov(r3, r4, LeaveCC, eq);
|
|
4059
|
+
__ b(eq, &skip_parameter_map);
|
|
4060
|
+
|
|
4061
|
+
__ LoadRoot(r6, Heap::kNonStrictArgumentsElementsMapRootIndex);
|
|
4062
|
+
__ str(r6, FieldMemOperand(r4, FixedArray::kMapOffset));
|
|
4063
|
+
__ add(r6, r1, Operand(Smi::FromInt(2)));
|
|
4064
|
+
__ str(r6, FieldMemOperand(r4, FixedArray::kLengthOffset));
|
|
4065
|
+
__ str(r8, FieldMemOperand(r4, FixedArray::kHeaderSize + 0 * kPointerSize));
|
|
4066
|
+
__ add(r6, r4, Operand(r1, LSL, 1));
|
|
4067
|
+
__ add(r6, r6, Operand(kParameterMapHeaderSize));
|
|
4068
|
+
__ str(r6, FieldMemOperand(r4, FixedArray::kHeaderSize + 1 * kPointerSize));
|
|
4069
|
+
|
|
4070
|
+
// Copy the parameter slots and the holes in the arguments.
|
|
4071
|
+
// We need to fill in mapped_parameter_count slots. They index the context,
|
|
4072
|
+
// where parameters are stored in reverse order, at
|
|
4073
|
+
// MIN_CONTEXT_SLOTS .. MIN_CONTEXT_SLOTS+parameter_count-1
|
|
4074
|
+
// The mapped parameter thus need to get indices
|
|
4075
|
+
// MIN_CONTEXT_SLOTS+parameter_count-1 ..
|
|
4076
|
+
// MIN_CONTEXT_SLOTS+parameter_count-mapped_parameter_count
|
|
4077
|
+
// We loop from right to left.
|
|
4078
|
+
Label parameters_loop, parameters_test;
|
|
4079
|
+
__ mov(r6, r1);
|
|
4080
|
+
__ ldr(r9, MemOperand(sp, 0 * kPointerSize));
|
|
4081
|
+
__ add(r9, r9, Operand(Smi::FromInt(Context::MIN_CONTEXT_SLOTS)));
|
|
4082
|
+
__ sub(r9, r9, Operand(r1));
|
|
4083
|
+
__ LoadRoot(r7, Heap::kTheHoleValueRootIndex);
|
|
4084
|
+
__ add(r3, r4, Operand(r6, LSL, 1));
|
|
4085
|
+
__ add(r3, r3, Operand(kParameterMapHeaderSize));
|
|
4086
|
+
|
|
4087
|
+
// r6 = loop variable (tagged)
|
|
4088
|
+
// r1 = mapping index (tagged)
|
|
4089
|
+
// r3 = address of backing store (tagged)
|
|
4090
|
+
// r4 = address of parameter map (tagged)
|
|
4091
|
+
// r5 = temporary scratch (a.o., for address calculation)
|
|
4092
|
+
// r7 = the hole value
|
|
4093
|
+
__ jmp(¶meters_test);
|
|
4094
|
+
|
|
4095
|
+
__ bind(¶meters_loop);
|
|
4096
|
+
__ sub(r6, r6, Operand(Smi::FromInt(1)));
|
|
4097
|
+
__ mov(r5, Operand(r6, LSL, 1));
|
|
4098
|
+
__ add(r5, r5, Operand(kParameterMapHeaderSize - kHeapObjectTag));
|
|
4099
|
+
__ str(r9, MemOperand(r4, r5));
|
|
4100
|
+
__ sub(r5, r5, Operand(kParameterMapHeaderSize - FixedArray::kHeaderSize));
|
|
4101
|
+
__ str(r7, MemOperand(r3, r5));
|
|
4102
|
+
__ add(r9, r9, Operand(Smi::FromInt(1)));
|
|
4103
|
+
__ bind(¶meters_test);
|
|
4104
|
+
__ cmp(r6, Operand(Smi::FromInt(0)));
|
|
4105
|
+
__ b(ne, ¶meters_loop);
|
|
4106
|
+
|
|
4107
|
+
__ bind(&skip_parameter_map);
|
|
4108
|
+
// r2 = argument count (tagged)
|
|
4109
|
+
// r3 = address of backing store (tagged)
|
|
4110
|
+
// r5 = scratch
|
|
4111
|
+
// Copy arguments header and remaining slots (if there are any).
|
|
4112
|
+
__ LoadRoot(r5, Heap::kFixedArrayMapRootIndex);
|
|
4113
|
+
__ str(r5, FieldMemOperand(r3, FixedArray::kMapOffset));
|
|
4114
|
+
__ str(r2, FieldMemOperand(r3, FixedArray::kLengthOffset));
|
|
4115
|
+
|
|
4116
|
+
Label arguments_loop, arguments_test;
|
|
4117
|
+
__ mov(r9, r1);
|
|
4118
|
+
__ ldr(r4, MemOperand(sp, 1 * kPointerSize));
|
|
4119
|
+
__ sub(r4, r4, Operand(r9, LSL, 1));
|
|
4120
|
+
__ jmp(&arguments_test);
|
|
4121
|
+
|
|
4122
|
+
__ bind(&arguments_loop);
|
|
4123
|
+
__ sub(r4, r4, Operand(kPointerSize));
|
|
4124
|
+
__ ldr(r6, MemOperand(r4, 0));
|
|
4125
|
+
__ add(r5, r3, Operand(r9, LSL, 1));
|
|
4126
|
+
__ str(r6, FieldMemOperand(r5, FixedArray::kHeaderSize));
|
|
4127
|
+
__ add(r9, r9, Operand(Smi::FromInt(1)));
|
|
4128
|
+
|
|
4129
|
+
__ bind(&arguments_test);
|
|
4130
|
+
__ cmp(r9, Operand(r2));
|
|
4131
|
+
__ b(lt, &arguments_loop);
|
|
4132
|
+
|
|
4133
|
+
// Return and remove the on-stack parameters.
|
|
4134
|
+
__ add(sp, sp, Operand(3 * kPointerSize));
|
|
4135
|
+
__ Ret();
|
|
4136
|
+
|
|
4137
|
+
// Do the runtime call to allocate the arguments object.
|
|
4138
|
+
// r2 = argument count (taggged)
|
|
4139
|
+
__ bind(&runtime);
|
|
4140
|
+
__ str(r2, MemOperand(sp, 0 * kPointerSize)); // Patch argument count.
|
|
4141
|
+
__ TailCallRuntime(Runtime::kNewArgumentsFast, 3, 1);
|
|
4142
|
+
}
|
|
4143
|
+
|
|
4144
|
+
|
|
4145
|
+
void ArgumentsAccessStub::GenerateNewStrict(MacroAssembler* masm) {
|
|
4146
|
+
// sp[0] : number of parameters
|
|
4147
|
+
// sp[4] : receiver displacement
|
|
4148
|
+
// sp[8] : function
|
|
3929
4149
|
// Check if the calling frame is an arguments adaptor frame.
|
|
3930
4150
|
Label adaptor_frame, try_allocate, runtime;
|
|
3931
4151
|
__ ldr(r2, MemOperand(fp, StandardFrameConstants::kCallerFPOffset));
|
|
@@ -3954,40 +4174,31 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
|
|
|
3954
4174
|
__ mov(r1, Operand(r1, LSR, kSmiTagSize));
|
|
3955
4175
|
__ add(r1, r1, Operand(FixedArray::kHeaderSize / kPointerSize));
|
|
3956
4176
|
__ bind(&add_arguments_object);
|
|
3957
|
-
__ add(r1, r1, Operand(
|
|
4177
|
+
__ add(r1, r1, Operand(Heap::kArgumentsObjectSizeStrict / kPointerSize));
|
|
3958
4178
|
|
|
3959
4179
|
// Do the allocation of both objects in one go.
|
|
3960
|
-
__ AllocateInNewSpace(
|
|
3961
|
-
|
|
3962
|
-
|
|
3963
|
-
|
|
3964
|
-
|
|
3965
|
-
|
|
3966
|
-
|
|
4180
|
+
__ AllocateInNewSpace(r1,
|
|
4181
|
+
r0,
|
|
4182
|
+
r2,
|
|
4183
|
+
r3,
|
|
4184
|
+
&runtime,
|
|
4185
|
+
static_cast<AllocationFlags>(TAG_OBJECT |
|
|
4186
|
+
SIZE_IN_WORDS));
|
|
3967
4187
|
|
|
3968
4188
|
// Get the arguments boilerplate from the current (global) context.
|
|
3969
4189
|
__ ldr(r4, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
|
|
3970
4190
|
__ ldr(r4, FieldMemOperand(r4, GlobalObject::kGlobalContextOffset));
|
|
3971
|
-
__ ldr(r4, MemOperand(r4,
|
|
3972
|
-
|
|
4191
|
+
__ ldr(r4, MemOperand(r4, Context::SlotOffset(
|
|
4192
|
+
Context::STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX)));
|
|
3973
4193
|
|
|
3974
4194
|
// Copy the JS object part.
|
|
3975
4195
|
__ CopyFields(r0, r4, r3.bit(), JSObject::kHeaderSize / kPointerSize);
|
|
3976
4196
|
|
|
3977
|
-
if (type_ == NEW_NON_STRICT) {
|
|
3978
|
-
// Setup the callee in-object property.
|
|
3979
|
-
STATIC_ASSERT(Heap::kArgumentsCalleeIndex == 1);
|
|
3980
|
-
__ ldr(r3, MemOperand(sp, 2 * kPointerSize));
|
|
3981
|
-
const int kCalleeOffset = JSObject::kHeaderSize +
|
|
3982
|
-
Heap::kArgumentsCalleeIndex * kPointerSize;
|
|
3983
|
-
__ str(r3, FieldMemOperand(r0, kCalleeOffset));
|
|
3984
|
-
}
|
|
3985
|
-
|
|
3986
4197
|
// Get the length (smi tagged) and set that as an in-object property too.
|
|
3987
4198
|
STATIC_ASSERT(Heap::kArgumentsLengthIndex == 0);
|
|
3988
4199
|
__ ldr(r1, MemOperand(sp, 0 * kPointerSize));
|
|
3989
4200
|
__ str(r1, FieldMemOperand(r0, JSObject::kHeaderSize +
|
|
3990
|
-
|
|
4201
|
+
Heap::kArgumentsLengthIndex * kPointerSize));
|
|
3991
4202
|
|
|
3992
4203
|
// If there are no actual arguments, we're done.
|
|
3993
4204
|
Label done;
|
|
@@ -3999,12 +4210,13 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
|
|
|
3999
4210
|
|
|
4000
4211
|
// Setup the elements pointer in the allocated arguments object and
|
|
4001
4212
|
// initialize the header in the elements fixed array.
|
|
4002
|
-
__ add(r4, r0, Operand(
|
|
4213
|
+
__ add(r4, r0, Operand(Heap::kArgumentsObjectSizeStrict));
|
|
4003
4214
|
__ str(r4, FieldMemOperand(r0, JSObject::kElementsOffset));
|
|
4004
4215
|
__ LoadRoot(r3, Heap::kFixedArrayMapRootIndex);
|
|
4005
4216
|
__ str(r3, FieldMemOperand(r4, FixedArray::kMapOffset));
|
|
4006
4217
|
__ str(r1, FieldMemOperand(r4, FixedArray::kLengthOffset));
|
|
4007
|
-
|
|
4218
|
+
// Untag the length for the loop.
|
|
4219
|
+
__ mov(r1, Operand(r1, LSR, kSmiTagSize));
|
|
4008
4220
|
|
|
4009
4221
|
// Copy the fixed array slots.
|
|
4010
4222
|
Label loop;
|
|
@@ -4027,7 +4239,7 @@ void ArgumentsAccessStub::GenerateNewObject(MacroAssembler* masm) {
|
|
|
4027
4239
|
|
|
4028
4240
|
// Do the runtime call to allocate the arguments object.
|
|
4029
4241
|
__ bind(&runtime);
|
|
4030
|
-
__ TailCallRuntime(Runtime::
|
|
4242
|
+
__ TailCallRuntime(Runtime::kNewStrictArgumentsFast, 3, 1);
|
|
4031
4243
|
}
|
|
4032
4244
|
|
|
4033
4245
|
|
|
@@ -4079,8 +4291,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4079
4291
|
// Check that the first argument is a JSRegExp object.
|
|
4080
4292
|
__ ldr(r0, MemOperand(sp, kJSRegExpOffset));
|
|
4081
4293
|
STATIC_ASSERT(kSmiTag == 0);
|
|
4082
|
-
__
|
|
4083
|
-
__ b(eq, &runtime);
|
|
4294
|
+
__ JumpIfSmi(r0, &runtime);
|
|
4084
4295
|
__ CompareObjectType(r0, r1, r1, JS_REGEXP_TYPE);
|
|
4085
4296
|
__ b(ne, &runtime);
|
|
4086
4297
|
|
|
@@ -4116,8 +4327,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4116
4327
|
// regexp_data: RegExp data (FixedArray)
|
|
4117
4328
|
// Check that the second argument is a string.
|
|
4118
4329
|
__ ldr(subject, MemOperand(sp, kSubjectOffset));
|
|
4119
|
-
__
|
|
4120
|
-
__ b(eq, &runtime);
|
|
4330
|
+
__ JumpIfSmi(subject, &runtime);
|
|
4121
4331
|
Condition is_string = masm->IsObjectStringType(subject, r0);
|
|
4122
4332
|
__ b(NegateCondition(is_string), &runtime);
|
|
4123
4333
|
// Get the length of the string to r3.
|
|
@@ -4130,8 +4340,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4130
4340
|
// Check that the third argument is a positive smi less than the subject
|
|
4131
4341
|
// string length. A negative value will be greater (unsigned comparison).
|
|
4132
4342
|
__ ldr(r0, MemOperand(sp, kPreviousIndexOffset));
|
|
4133
|
-
__
|
|
4134
|
-
__ b(ne, &runtime);
|
|
4343
|
+
__ JumpIfNotSmi(r0, &runtime);
|
|
4135
4344
|
__ cmp(r3, Operand(r0));
|
|
4136
4345
|
__ b(ls, &runtime);
|
|
4137
4346
|
|
|
@@ -4140,8 +4349,7 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4140
4349
|
// regexp_data: RegExp data (FixedArray)
|
|
4141
4350
|
// Check that the fourth object is a JSArray object.
|
|
4142
4351
|
__ ldr(r0, MemOperand(sp, kLastMatchInfoOffset));
|
|
4143
|
-
__
|
|
4144
|
-
__ b(eq, &runtime);
|
|
4352
|
+
__ JumpIfSmi(r0, &runtime);
|
|
4145
4353
|
__ CompareObjectType(r0, r1, r1, JS_ARRAY_TYPE);
|
|
4146
4354
|
__ b(ne, &runtime);
|
|
4147
4355
|
// Check that the JSArray is in fast case.
|
|
@@ -4159,6 +4367,8 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4159
4367
|
__ cmp(r2, Operand(r0, ASR, kSmiTagSize));
|
|
4160
4368
|
__ b(gt, &runtime);
|
|
4161
4369
|
|
|
4370
|
+
// Reset offset for possibly sliced string.
|
|
4371
|
+
__ mov(r9, Operand(0));
|
|
4162
4372
|
// subject: Subject string
|
|
4163
4373
|
// regexp_data: RegExp data (FixedArray)
|
|
4164
4374
|
// Check the representation and encoding of the subject string.
|
|
@@ -4166,33 +4376,45 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4166
4376
|
__ ldr(r0, FieldMemOperand(subject, HeapObject::kMapOffset));
|
|
4167
4377
|
__ ldrb(r0, FieldMemOperand(r0, Map::kInstanceTypeOffset));
|
|
4168
4378
|
// First check for flat string.
|
|
4169
|
-
__
|
|
4379
|
+
__ and_(r1, r0, Operand(kIsNotStringMask | kStringRepresentationMask), SetCC);
|
|
4170
4380
|
STATIC_ASSERT((kStringTag | kSeqStringTag) == 0);
|
|
4171
4381
|
__ b(eq, &seq_string);
|
|
4172
4382
|
|
|
4173
4383
|
// subject: Subject string
|
|
4174
4384
|
// regexp_data: RegExp data (FixedArray)
|
|
4175
|
-
// Check for flat cons string.
|
|
4385
|
+
// Check for flat cons string or sliced string.
|
|
4176
4386
|
// A flat cons string is a cons string where the second part is the empty
|
|
4177
4387
|
// string. In that case the subject string is just the first part of the cons
|
|
4178
4388
|
// string. Also in this case the first part of the cons string is known to be
|
|
4179
4389
|
// a sequential string or an external string.
|
|
4180
|
-
|
|
4181
|
-
|
|
4182
|
-
|
|
4183
|
-
|
|
4390
|
+
// In the case of a sliced string its offset has to be taken into account.
|
|
4391
|
+
Label cons_string, check_encoding;
|
|
4392
|
+
STATIC_ASSERT(kConsStringTag < kExternalStringTag);
|
|
4393
|
+
STATIC_ASSERT(kSlicedStringTag > kExternalStringTag);
|
|
4394
|
+
__ cmp(r1, Operand(kExternalStringTag));
|
|
4395
|
+
__ b(lt, &cons_string);
|
|
4396
|
+
__ b(eq, &runtime);
|
|
4397
|
+
|
|
4398
|
+
// String is sliced.
|
|
4399
|
+
__ ldr(r9, FieldMemOperand(subject, SlicedString::kOffsetOffset));
|
|
4400
|
+
__ mov(r9, Operand(r9, ASR, kSmiTagSize));
|
|
4401
|
+
__ ldr(subject, FieldMemOperand(subject, SlicedString::kParentOffset));
|
|
4402
|
+
// r9: offset of sliced string, smi-tagged.
|
|
4403
|
+
__ jmp(&check_encoding);
|
|
4404
|
+
// String is a cons string, check whether it is flat.
|
|
4405
|
+
__ bind(&cons_string);
|
|
4184
4406
|
__ ldr(r0, FieldMemOperand(subject, ConsString::kSecondOffset));
|
|
4185
4407
|
__ LoadRoot(r1, Heap::kEmptyStringRootIndex);
|
|
4186
4408
|
__ cmp(r0, r1);
|
|
4187
4409
|
__ b(ne, &runtime);
|
|
4188
4410
|
__ ldr(subject, FieldMemOperand(subject, ConsString::kFirstOffset));
|
|
4411
|
+
// Is first part of cons or parent of slice a flat string?
|
|
4412
|
+
__ bind(&check_encoding);
|
|
4189
4413
|
__ ldr(r0, FieldMemOperand(subject, HeapObject::kMapOffset));
|
|
4190
4414
|
__ ldrb(r0, FieldMemOperand(r0, Map::kInstanceTypeOffset));
|
|
4191
|
-
// Is first part a flat string?
|
|
4192
4415
|
STATIC_ASSERT(kSeqStringTag == 0);
|
|
4193
4416
|
__ tst(r0, Operand(kStringRepresentationMask));
|
|
4194
4417
|
__ b(ne, &runtime);
|
|
4195
|
-
|
|
4196
4418
|
__ bind(&seq_string);
|
|
4197
4419
|
// subject: Subject string
|
|
4198
4420
|
// regexp_data: RegExp data (FixedArray)
|
|
@@ -4207,9 +4429,8 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4207
4429
|
|
|
4208
4430
|
// Check that the irregexp code has been generated for the actual string
|
|
4209
4431
|
// encoding. If it has, the field contains a code object otherwise it contains
|
|
4210
|
-
//
|
|
4211
|
-
__
|
|
4212
|
-
__ b(ne, &runtime);
|
|
4432
|
+
// a smi (code flushing support).
|
|
4433
|
+
__ JumpIfSmi(r7, &runtime);
|
|
4213
4434
|
|
|
4214
4435
|
// r3: encoding of subject string (1 if ASCII, 0 if two_byte);
|
|
4215
4436
|
// r7: code
|
|
@@ -4259,21 +4480,30 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4259
4480
|
|
|
4260
4481
|
// For arguments 4 and 3 get string length, calculate start of string data and
|
|
4261
4482
|
// calculate the shift of the index (0 for ASCII and 1 for two byte).
|
|
4262
|
-
__ ldr(r0, FieldMemOperand(subject, String::kLengthOffset));
|
|
4263
|
-
__ mov(r0, Operand(r0, ASR, kSmiTagSize));
|
|
4264
4483
|
STATIC_ASSERT(SeqAsciiString::kHeaderSize == SeqTwoByteString::kHeaderSize);
|
|
4265
|
-
__ add(
|
|
4484
|
+
__ add(r8, subject, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
|
|
4266
4485
|
__ eor(r3, r3, Operand(1));
|
|
4267
|
-
//
|
|
4268
|
-
//
|
|
4486
|
+
// Load the length from the original subject string from the previous stack
|
|
4487
|
+
// frame. Therefore we have to use fp, which points exactly to two pointer
|
|
4488
|
+
// sizes below the previous sp. (Because creating a new stack frame pushes
|
|
4489
|
+
// the previous fp onto the stack and moves up sp by 2 * kPointerSize.)
|
|
4490
|
+
__ ldr(r0, MemOperand(fp, kSubjectOffset + 2 * kPointerSize));
|
|
4491
|
+
// If slice offset is not 0, load the length from the original sliced string.
|
|
4492
|
+
// Argument 4, r3: End of string data
|
|
4493
|
+
// Argument 3, r2: Start of string data
|
|
4494
|
+
// Prepare start and end index of the input.
|
|
4495
|
+
__ add(r9, r8, Operand(r9, LSL, r3));
|
|
4269
4496
|
__ add(r2, r9, Operand(r1, LSL, r3));
|
|
4270
|
-
|
|
4497
|
+
|
|
4498
|
+
__ ldr(r8, FieldMemOperand(r0, String::kLengthOffset));
|
|
4499
|
+
__ mov(r8, Operand(r8, ASR, kSmiTagSize));
|
|
4500
|
+
__ add(r3, r9, Operand(r8, LSL, r3));
|
|
4271
4501
|
|
|
4272
4502
|
// Argument 2 (r1): Previous index.
|
|
4273
4503
|
// Already there
|
|
4274
4504
|
|
|
4275
4505
|
// Argument 1 (r0): Subject string.
|
|
4276
|
-
|
|
4506
|
+
// Already there
|
|
4277
4507
|
|
|
4278
4508
|
// Locate the code entry and call it.
|
|
4279
4509
|
__ add(r7, r7, Operand(Code::kHeaderSize - kHeapObjectTag));
|
|
@@ -4290,12 +4520,12 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4290
4520
|
// Check the result.
|
|
4291
4521
|
Label success;
|
|
4292
4522
|
|
|
4293
|
-
__ cmp(
|
|
4523
|
+
__ cmp(subject, Operand(NativeRegExpMacroAssembler::SUCCESS));
|
|
4294
4524
|
__ b(eq, &success);
|
|
4295
4525
|
Label failure;
|
|
4296
|
-
__ cmp(
|
|
4526
|
+
__ cmp(subject, Operand(NativeRegExpMacroAssembler::FAILURE));
|
|
4297
4527
|
__ b(eq, &failure);
|
|
4298
|
-
__ cmp(
|
|
4528
|
+
__ cmp(subject, Operand(NativeRegExpMacroAssembler::EXCEPTION));
|
|
4299
4529
|
// If not exception it can only be retry. Handle that in the runtime system.
|
|
4300
4530
|
__ b(ne, &runtime);
|
|
4301
4531
|
// Result must now be exception. If there is no pending exception already a
|
|
@@ -4307,18 +4537,18 @@ void RegExpExecStub::Generate(MacroAssembler* masm) {
|
|
|
4307
4537
|
__ mov(r2, Operand(ExternalReference(Isolate::k_pending_exception_address,
|
|
4308
4538
|
isolate)));
|
|
4309
4539
|
__ ldr(r0, MemOperand(r2, 0));
|
|
4310
|
-
__ cmp(
|
|
4540
|
+
__ cmp(subject, r1);
|
|
4311
4541
|
__ b(eq, &runtime);
|
|
4312
4542
|
|
|
4313
4543
|
__ str(r1, MemOperand(r2, 0)); // Clear pending exception.
|
|
4314
4544
|
|
|
4315
4545
|
// Check if the exception is a termination. If so, throw as uncatchable.
|
|
4316
4546
|
__ LoadRoot(ip, Heap::kTerminationExceptionRootIndex);
|
|
4317
|
-
__ cmp(
|
|
4547
|
+
__ cmp(subject, ip);
|
|
4318
4548
|
Label termination_exception;
|
|
4319
4549
|
__ b(eq, &termination_exception);
|
|
4320
4550
|
|
|
4321
|
-
__ Throw(
|
|
4551
|
+
__ Throw(subject); // Expects thrown value in r0.
|
|
4322
4552
|
|
|
4323
4553
|
__ bind(&termination_exception);
|
|
4324
4554
|
__ ThrowUncatchable(TERMINATION, r0); // Expects thrown value in r0.
|
|
@@ -4401,8 +4631,7 @@ void RegExpConstructResultStub::Generate(MacroAssembler* masm) {
|
|
|
4401
4631
|
__ ldr(r1, MemOperand(sp, kPointerSize * 2));
|
|
4402
4632
|
STATIC_ASSERT(kSmiTag == 0);
|
|
4403
4633
|
STATIC_ASSERT(kSmiTagSize == 1);
|
|
4404
|
-
__
|
|
4405
|
-
__ b(ne, &slowcase);
|
|
4634
|
+
__ JumpIfNotSmi(r1, &slowcase);
|
|
4406
4635
|
__ cmp(r1, Operand(Smi::FromInt(kMaxInlineLength)));
|
|
4407
4636
|
__ b(hi, &slowcase);
|
|
4408
4637
|
// Smi-tagging is equivalent to multiplying by 2.
|
|
@@ -4523,7 +4752,11 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|
|
4523
4752
|
Label call_as_function;
|
|
4524
4753
|
__ CompareRoot(r4, Heap::kTheHoleValueRootIndex);
|
|
4525
4754
|
__ b(eq, &call_as_function);
|
|
4526
|
-
__ InvokeFunction(r1,
|
|
4755
|
+
__ InvokeFunction(r1,
|
|
4756
|
+
actual,
|
|
4757
|
+
JUMP_FUNCTION,
|
|
4758
|
+
NullCallWrapper(),
|
|
4759
|
+
CALL_AS_METHOD);
|
|
4527
4760
|
__ bind(&call_as_function);
|
|
4528
4761
|
}
|
|
4529
4762
|
__ InvokeFunction(r1,
|
|
@@ -4540,6 +4773,7 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|
|
4540
4773
|
__ mov(r0, Operand(argc_)); // Setup the number of arguments.
|
|
4541
4774
|
__ mov(r2, Operand(0, RelocInfo::NONE));
|
|
4542
4775
|
__ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
|
|
4776
|
+
__ SetCallKind(r5, CALL_AS_METHOD);
|
|
4543
4777
|
__ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(),
|
|
4544
4778
|
RelocInfo::CODE_TARGET);
|
|
4545
4779
|
}
|
|
@@ -4547,16 +4781,9 @@ void CallFunctionStub::Generate(MacroAssembler* masm) {
|
|
|
4547
4781
|
|
|
4548
4782
|
// Unfortunately you have to run without snapshots to see most of these
|
|
4549
4783
|
// names in the profile since most compare stubs end up in the snapshot.
|
|
4550
|
-
|
|
4784
|
+
void CompareStub::PrintName(StringStream* stream) {
|
|
4551
4785
|
ASSERT((lhs_.is(r0) && rhs_.is(r1)) ||
|
|
4552
4786
|
(lhs_.is(r1) && rhs_.is(r0)));
|
|
4553
|
-
|
|
4554
|
-
if (name_ != NULL) return name_;
|
|
4555
|
-
const int kMaxNameLength = 100;
|
|
4556
|
-
name_ = Isolate::Current()->bootstrapper()->AllocateAutoDeletedArray(
|
|
4557
|
-
kMaxNameLength);
|
|
4558
|
-
if (name_ == NULL) return "OOM";
|
|
4559
|
-
|
|
4560
4787
|
const char* cc_name;
|
|
4561
4788
|
switch (cc_) {
|
|
4562
4789
|
case lt: cc_name = "LT"; break;
|
|
@@ -4567,40 +4794,14 @@ const char* CompareStub::GetName() {
|
|
|
4567
4794
|
case ne: cc_name = "NE"; break;
|
|
4568
4795
|
default: cc_name = "UnknownCondition"; break;
|
|
4569
4796
|
}
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
|
|
4575
|
-
if (
|
|
4576
|
-
|
|
4577
|
-
|
|
4578
|
-
|
|
4579
|
-
const char* never_nan_nan_name = "";
|
|
4580
|
-
if (never_nan_nan_ && (cc_ == eq || cc_ == ne)) {
|
|
4581
|
-
never_nan_nan_name = "_NO_NAN";
|
|
4582
|
-
}
|
|
4583
|
-
|
|
4584
|
-
const char* include_number_compare_name = "";
|
|
4585
|
-
if (!include_number_compare_) {
|
|
4586
|
-
include_number_compare_name = "_NO_NUMBER";
|
|
4587
|
-
}
|
|
4588
|
-
|
|
4589
|
-
const char* include_smi_compare_name = "";
|
|
4590
|
-
if (!include_smi_compare_) {
|
|
4591
|
-
include_smi_compare_name = "_NO_SMI";
|
|
4592
|
-
}
|
|
4593
|
-
|
|
4594
|
-
OS::SNPrintF(Vector<char>(name_, kMaxNameLength),
|
|
4595
|
-
"CompareStub_%s%s%s%s%s%s",
|
|
4596
|
-
cc_name,
|
|
4597
|
-
lhs_name,
|
|
4598
|
-
rhs_name,
|
|
4599
|
-
strict_name,
|
|
4600
|
-
never_nan_nan_name,
|
|
4601
|
-
include_number_compare_name,
|
|
4602
|
-
include_smi_compare_name);
|
|
4603
|
-
return name_;
|
|
4797
|
+
bool is_equality = cc_ == eq || cc_ == ne;
|
|
4798
|
+
stream->Add("CompareStub_%s", cc_name);
|
|
4799
|
+
stream->Add(lhs_.is(r0) ? "_r0" : "_r1");
|
|
4800
|
+
stream->Add(rhs_.is(r0) ? "_r0" : "_r1");
|
|
4801
|
+
if (strict_ && is_equality) stream->Add("_STRICT");
|
|
4802
|
+
if (never_nan_nan_ && is_equality) stream->Add("_NO_NAN");
|
|
4803
|
+
if (!include_number_compare_) stream->Add("_NO_NUMBER");
|
|
4804
|
+
if (!include_smi_compare_) stream->Add("_NO_SMI");
|
|
4604
4805
|
}
|
|
4605
4806
|
|
|
4606
4807
|
|
|
@@ -4625,6 +4826,7 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
|
|
4625
4826
|
Label flat_string;
|
|
4626
4827
|
Label ascii_string;
|
|
4627
4828
|
Label got_char_code;
|
|
4829
|
+
Label sliced_string;
|
|
4628
4830
|
|
|
4629
4831
|
// If the receiver is a smi trigger the non-string case.
|
|
4630
4832
|
__ JumpIfSmi(object_, receiver_not_string_);
|
|
@@ -4654,7 +4856,11 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
|
|
4654
4856
|
__ b(eq, &flat_string);
|
|
4655
4857
|
|
|
4656
4858
|
// Handle non-flat strings.
|
|
4657
|
-
__
|
|
4859
|
+
__ and_(result_, result_, Operand(kStringRepresentationMask));
|
|
4860
|
+
STATIC_ASSERT(kConsStringTag < kExternalStringTag);
|
|
4861
|
+
STATIC_ASSERT(kSlicedStringTag > kExternalStringTag);
|
|
4862
|
+
__ cmp(result_, Operand(kExternalStringTag));
|
|
4863
|
+
__ b(gt, &sliced_string);
|
|
4658
4864
|
__ b(eq, &call_runtime_);
|
|
4659
4865
|
|
|
4660
4866
|
// ConsString.
|
|
@@ -4662,15 +4868,26 @@ void StringCharCodeAtGenerator::GenerateFast(MacroAssembler* masm) {
|
|
|
4662
4868
|
// this is really a flat string in a cons string). If that is not
|
|
4663
4869
|
// the case we would rather go to the runtime system now to flatten
|
|
4664
4870
|
// the string.
|
|
4871
|
+
Label assure_seq_string;
|
|
4665
4872
|
__ ldr(result_, FieldMemOperand(object_, ConsString::kSecondOffset));
|
|
4666
4873
|
__ LoadRoot(ip, Heap::kEmptyStringRootIndex);
|
|
4667
4874
|
__ cmp(result_, Operand(ip));
|
|
4668
4875
|
__ b(ne, &call_runtime_);
|
|
4669
4876
|
// Get the first of the two strings and load its instance type.
|
|
4670
4877
|
__ ldr(object_, FieldMemOperand(object_, ConsString::kFirstOffset));
|
|
4878
|
+
__ jmp(&assure_seq_string);
|
|
4879
|
+
|
|
4880
|
+
// SlicedString, unpack and add offset.
|
|
4881
|
+
__ bind(&sliced_string);
|
|
4882
|
+
__ ldr(result_, FieldMemOperand(object_, SlicedString::kOffsetOffset));
|
|
4883
|
+
__ add(scratch_, scratch_, result_);
|
|
4884
|
+
__ ldr(object_, FieldMemOperand(object_, SlicedString::kParentOffset));
|
|
4885
|
+
|
|
4886
|
+
// Assure that we are dealing with a sequential string. Go to runtime if not.
|
|
4887
|
+
__ bind(&assure_seq_string);
|
|
4671
4888
|
__ ldr(result_, FieldMemOperand(object_, HeapObject::kMapOffset));
|
|
4672
4889
|
__ ldrb(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset));
|
|
4673
|
-
//
|
|
4890
|
+
// Check that parent is not an external string. Go to runtime otherwise.
|
|
4674
4891
|
STATIC_ASSERT(kSeqStringTag == 0);
|
|
4675
4892
|
__ tst(result_, Operand(kStringRepresentationMask));
|
|
4676
4893
|
__ b(ne, &call_runtime_);
|
|
@@ -5250,10 +5467,17 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
|
|
5250
5467
|
// Check bounds and smi-ness.
|
|
5251
5468
|
Register to = r6;
|
|
5252
5469
|
Register from = r7;
|
|
5470
|
+
|
|
5471
|
+
if (FLAG_string_slices) {
|
|
5472
|
+
__ nop(0); // Jumping as first instruction would crash the code generation.
|
|
5473
|
+
__ jmp(&runtime);
|
|
5474
|
+
}
|
|
5475
|
+
|
|
5253
5476
|
__ Ldrd(to, from, MemOperand(sp, kToOffset));
|
|
5254
5477
|
STATIC_ASSERT(kFromOffset == kToOffset + 4);
|
|
5255
5478
|
STATIC_ASSERT(kSmiTag == 0);
|
|
5256
5479
|
STATIC_ASSERT(kSmiTagSize + kSmiShiftSize == 1);
|
|
5480
|
+
|
|
5257
5481
|
// I.e., arithmetic shift right by one un-smi-tags.
|
|
5258
5482
|
__ mov(r2, Operand(to, ASR, 1), SetCC);
|
|
5259
5483
|
__ mov(r3, Operand(from, ASR, 1), SetCC, cc);
|
|
@@ -5262,7 +5486,6 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
|
|
5262
5486
|
__ b(mi, &runtime); // From is negative.
|
|
5263
5487
|
|
|
5264
5488
|
// Both to and from are smis.
|
|
5265
|
-
|
|
5266
5489
|
__ sub(r2, r2, Operand(r3), SetCC);
|
|
5267
5490
|
__ b(mi, &runtime); // Fail if from > to.
|
|
5268
5491
|
// Special handling of sub-strings of length 1 and 2. One character strings
|
|
@@ -5279,8 +5502,7 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
|
|
5279
5502
|
// Make sure first argument is a sequential (or flat) string.
|
|
5280
5503
|
__ ldr(r5, MemOperand(sp, kStringOffset));
|
|
5281
5504
|
STATIC_ASSERT(kSmiTag == 0);
|
|
5282
|
-
__
|
|
5283
|
-
__ b(eq, &runtime);
|
|
5505
|
+
__ JumpIfSmi(r5, &runtime);
|
|
5284
5506
|
Condition is_string = masm->IsObjectStringType(r5, r1);
|
|
5285
5507
|
__ b(NegateCondition(is_string), &runtime);
|
|
5286
5508
|
|
|
@@ -5518,7 +5740,7 @@ void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
|
|
5518
5740
|
Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
|
|
5519
5741
|
__ add(left, left, Operand(scratch1));
|
|
5520
5742
|
__ add(right, right, Operand(scratch1));
|
|
5521
|
-
__ rsb(length, length, Operand(
|
|
5743
|
+
__ rsb(length, length, Operand::Zero());
|
|
5522
5744
|
Register index = length; // index = -length;
|
|
5523
5745
|
|
|
5524
5746
|
// Compare loop.
|
|
@@ -5917,8 +6139,7 @@ void ICCompareStub::GenerateSmis(MacroAssembler* masm) {
|
|
|
5917
6139
|
ASSERT(state_ == CompareIC::SMIS);
|
|
5918
6140
|
Label miss;
|
|
5919
6141
|
__ orr(r2, r1, r0);
|
|
5920
|
-
__
|
|
5921
|
-
__ b(ne, &miss);
|
|
6142
|
+
__ JumpIfNotSmi(r2, &miss);
|
|
5922
6143
|
|
|
5923
6144
|
if (GetCondition() == eq) {
|
|
5924
6145
|
// For equality we do not care about the sign of the result.
|
|
@@ -5942,8 +6163,7 @@ void ICCompareStub::GenerateHeapNumbers(MacroAssembler* masm) {
|
|
|
5942
6163
|
Label unordered;
|
|
5943
6164
|
Label miss;
|
|
5944
6165
|
__ and_(r2, r1, Operand(r0));
|
|
5945
|
-
__
|
|
5946
|
-
__ b(eq, &generic_stub);
|
|
6166
|
+
__ JumpIfSmi(r2, &generic_stub);
|
|
5947
6167
|
|
|
5948
6168
|
__ CompareObjectType(r0, r2, r2, HEAP_NUMBER_TYPE);
|
|
5949
6169
|
__ b(ne, &miss);
|
|
@@ -6092,8 +6312,7 @@ void ICCompareStub::GenerateObjects(MacroAssembler* masm) {
|
|
|
6092
6312
|
ASSERT(state_ == CompareIC::OBJECTS);
|
|
6093
6313
|
Label miss;
|
|
6094
6314
|
__ and_(r2, r1, Operand(r0));
|
|
6095
|
-
__
|
|
6096
|
-
__ b(eq, &miss);
|
|
6315
|
+
__ JumpIfSmi(r2, &miss);
|
|
6097
6316
|
|
|
6098
6317
|
__ CompareObjectType(r0, r2, r2, JS_OBJECT_TYPE);
|
|
6099
6318
|
__ b(ne, &miss);
|
|
@@ -6139,12 +6358,8 @@ void DirectCEntryStub::Generate(MacroAssembler* masm) {
|
|
|
6139
6358
|
|
|
6140
6359
|
void DirectCEntryStub::GenerateCall(MacroAssembler* masm,
|
|
6141
6360
|
ExternalReference function) {
|
|
6142
|
-
__ mov(lr, Operand(reinterpret_cast<intptr_t>(GetCode().location()),
|
|
6143
|
-
RelocInfo::CODE_TARGET));
|
|
6144
6361
|
__ mov(r2, Operand(function));
|
|
6145
|
-
|
|
6146
|
-
__ str(pc, MemOperand(sp, 0));
|
|
6147
|
-
__ Jump(r2); // Call the api function.
|
|
6362
|
+
GenerateCall(masm, r2);
|
|
6148
6363
|
}
|
|
6149
6364
|
|
|
6150
6365
|
|
|
@@ -6153,8 +6368,14 @@ void DirectCEntryStub::GenerateCall(MacroAssembler* masm,
|
|
|
6153
6368
|
__ mov(lr, Operand(reinterpret_cast<intptr_t>(GetCode().location()),
|
|
6154
6369
|
RelocInfo::CODE_TARGET));
|
|
6155
6370
|
// Push return address (accessible to GC through exit frame pc).
|
|
6156
|
-
|
|
6371
|
+
// Note that using pc with str is deprecated.
|
|
6372
|
+
Label start;
|
|
6373
|
+
__ bind(&start);
|
|
6374
|
+
__ add(ip, pc, Operand(Assembler::kInstrSize));
|
|
6375
|
+
__ str(ip, MemOperand(sp, 0));
|
|
6157
6376
|
__ Jump(target); // Call the C++ function.
|
|
6377
|
+
ASSERT_EQ(Assembler::kInstrSize + Assembler::kPcLoadDelta,
|
|
6378
|
+
masm->SizeOfCodeGeneratedSince(&start));
|
|
6158
6379
|
}
|
|
6159
6380
|
|
|
6160
6381
|
|
|
@@ -6377,7 +6598,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
|
|
6377
6598
|
// treated as a lookup success. For positive lookup probing failure
|
|
6378
6599
|
// should be treated as lookup failure.
|
|
6379
6600
|
if (mode_ == POSITIVE_LOOKUP) {
|
|
6380
|
-
__ mov(result, Operand(
|
|
6601
|
+
__ mov(result, Operand::Zero());
|
|
6381
6602
|
__ Ret();
|
|
6382
6603
|
}
|
|
6383
6604
|
|
|
@@ -6386,7 +6607,7 @@ void StringDictionaryLookupStub::Generate(MacroAssembler* masm) {
|
|
|
6386
6607
|
__ Ret();
|
|
6387
6608
|
|
|
6388
6609
|
__ bind(¬_in_dictionary);
|
|
6389
|
-
__ mov(result, Operand(
|
|
6610
|
+
__ mov(result, Operand::Zero());
|
|
6390
6611
|
__ Ret();
|
|
6391
6612
|
}
|
|
6392
6613
|
|