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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
|
3
3
|
// modification, are permitted provided that the following conditions are
|
|
4
4
|
// met:
|
|
@@ -67,6 +67,7 @@ inline bool StackHandler::includes(Address address) const {
|
|
|
67
67
|
|
|
68
68
|
|
|
69
69
|
inline void StackHandler::Iterate(ObjectVisitor* v, Code* holder) const {
|
|
70
|
+
v->VisitPointer(context_address());
|
|
70
71
|
StackFrame::IteratePc(v, pc_address(), holder);
|
|
71
72
|
}
|
|
72
73
|
|
|
@@ -82,6 +83,12 @@ inline StackHandler::State StackHandler::state() const {
|
|
|
82
83
|
}
|
|
83
84
|
|
|
84
85
|
|
|
86
|
+
inline Object** StackHandler::context_address() const {
|
|
87
|
+
const int offset = StackHandlerConstants::kContextOffset;
|
|
88
|
+
return reinterpret_cast<Object**>(address() + offset);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
85
92
|
inline Address* StackHandler::pc_address() const {
|
|
86
93
|
const int offset = StackHandlerConstants::kPCOffset;
|
|
87
94
|
return reinterpret_cast<Address*>(address() + offset);
|
data/lib/libv8/v8/src/frames.cc
CHANGED
|
@@ -36,6 +36,8 @@
|
|
|
36
36
|
#include "scopeinfo.h"
|
|
37
37
|
#include "string-stream.h"
|
|
38
38
|
|
|
39
|
+
#include "allocation-inl.h"
|
|
40
|
+
|
|
39
41
|
namespace v8 {
|
|
40
42
|
namespace internal {
|
|
41
43
|
|
|
@@ -346,7 +348,6 @@ void SafeStackFrameIterator::Reset() {
|
|
|
346
348
|
// -------------------------------------------------------------------------
|
|
347
349
|
|
|
348
350
|
|
|
349
|
-
#ifdef ENABLE_LOGGING_AND_PROFILING
|
|
350
351
|
SafeStackTraceFrameIterator::SafeStackTraceFrameIterator(
|
|
351
352
|
Isolate* isolate,
|
|
352
353
|
Address fp, Address sp, Address low_bound, Address high_bound) :
|
|
@@ -362,7 +363,6 @@ void SafeStackTraceFrameIterator::Advance() {
|
|
|
362
363
|
if (frame()->is_java_script()) return;
|
|
363
364
|
}
|
|
364
365
|
}
|
|
365
|
-
#endif
|
|
366
366
|
|
|
367
367
|
|
|
368
368
|
Code* StackFrame::GetSafepointData(Isolate* isolate,
|
|
@@ -371,7 +371,6 @@ Code* StackFrame::GetSafepointData(Isolate* isolate,
|
|
|
371
371
|
unsigned* stack_slots) {
|
|
372
372
|
PcToCodeCache::PcToCodeCacheEntry* entry =
|
|
373
373
|
isolate->pc_to_code_cache()->GetCacheEntry(pc);
|
|
374
|
-
SafepointEntry cached_safepoint_entry = entry->safepoint_entry;
|
|
375
374
|
if (!entry->safepoint_entry.is_valid()) {
|
|
376
375
|
entry->safepoint_entry = entry->code->GetSafepointEntry(pc);
|
|
377
376
|
ASSERT(entry->safepoint_entry.is_valid());
|
|
@@ -528,6 +527,17 @@ Address StandardFrame::GetExpressionAddress(int n) const {
|
|
|
528
527
|
}
|
|
529
528
|
|
|
530
529
|
|
|
530
|
+
Object* StandardFrame::GetExpression(Address fp, int index) {
|
|
531
|
+
return Memory::Object_at(GetExpressionAddress(fp, index));
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
|
|
535
|
+
Address StandardFrame::GetExpressionAddress(Address fp, int n) {
|
|
536
|
+
const int offset = StandardFrameConstants::kExpressionsOffset;
|
|
537
|
+
return fp + offset - n * kPointerSize;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
|
|
531
541
|
int StandardFrame::ComputeExpressionsCount() const {
|
|
532
542
|
const int offset =
|
|
533
543
|
StandardFrameConstants::kExpressionsOffset + kPointerSize;
|
|
@@ -646,6 +656,16 @@ bool JavaScriptFrame::IsConstructor() const {
|
|
|
646
656
|
}
|
|
647
657
|
|
|
648
658
|
|
|
659
|
+
int JavaScriptFrame::GetArgumentsLength() const {
|
|
660
|
+
// If there is an arguments adaptor frame get the arguments length from it.
|
|
661
|
+
if (has_adapted_arguments()) {
|
|
662
|
+
return Smi::cast(GetExpression(caller_fp(), 0))->value();
|
|
663
|
+
} else {
|
|
664
|
+
return GetNumberOfIncomingArguments();
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
|
|
649
669
|
Code* JavaScriptFrame::unchecked_code() const {
|
|
650
670
|
JSFunction* function = JSFunction::cast(this->function());
|
|
651
671
|
return function->unchecked_code();
|
|
@@ -812,6 +832,22 @@ DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData(
|
|
|
812
832
|
}
|
|
813
833
|
|
|
814
834
|
|
|
835
|
+
int OptimizedFrame::GetInlineCount() {
|
|
836
|
+
ASSERT(is_optimized());
|
|
837
|
+
|
|
838
|
+
int deopt_index = Safepoint::kNoDeoptimizationIndex;
|
|
839
|
+
DeoptimizationInputData* data = GetDeoptimizationData(&deopt_index);
|
|
840
|
+
|
|
841
|
+
TranslationIterator it(data->TranslationByteArray(),
|
|
842
|
+
data->TranslationIndex(deopt_index)->value());
|
|
843
|
+
Translation::Opcode opcode = static_cast<Translation::Opcode>(it.Next());
|
|
844
|
+
ASSERT(opcode == Translation::BEGIN);
|
|
845
|
+
USE(opcode);
|
|
846
|
+
int frame_count = it.Next();
|
|
847
|
+
return frame_count;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
|
|
815
851
|
void OptimizedFrame::GetFunctions(List<JSFunction*>* functions) {
|
|
816
852
|
ASSERT(functions->length() == 0);
|
|
817
853
|
ASSERT(is_optimized());
|
data/lib/libv8/v8/src/frames.h
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Copyright
|
|
1
|
+
// Copyright 2011 the V8 project authors. All rights reserved.
|
|
2
2
|
// Redistribution and use in source and binary forms, with or without
|
|
3
3
|
// modification, are permitted provided that the following conditions are
|
|
4
4
|
// met:
|
|
@@ -114,6 +114,7 @@ class StackHandler BASE_EMBEDDED {
|
|
|
114
114
|
// Accessors.
|
|
115
115
|
inline State state() const;
|
|
116
116
|
|
|
117
|
+
inline Object** context_address() const;
|
|
117
118
|
inline Address* pc_address() const;
|
|
118
119
|
|
|
119
120
|
DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler);
|
|
@@ -383,6 +384,7 @@ class StandardFrame: public StackFrame {
|
|
|
383
384
|
inline Object* GetExpression(int index) const;
|
|
384
385
|
inline void SetExpression(int index, Object* value);
|
|
385
386
|
int ComputeExpressionsCount() const;
|
|
387
|
+
static Object* GetExpression(Address fp, int index);
|
|
386
388
|
|
|
387
389
|
virtual void SetCallerFp(Address caller_fp);
|
|
388
390
|
|
|
@@ -411,6 +413,7 @@ class StandardFrame: public StackFrame {
|
|
|
411
413
|
|
|
412
414
|
// Returns the address of the n'th expression stack element.
|
|
413
415
|
Address GetExpressionAddress(int n) const;
|
|
416
|
+
static Address GetExpressionAddress(Address fp, int n);
|
|
414
417
|
|
|
415
418
|
// Determines if the n'th expression stack element is in a stack
|
|
416
419
|
// handler or not. Requires traversing all handlers in this frame.
|
|
@@ -483,6 +486,7 @@ class JavaScriptFrame: public StandardFrame {
|
|
|
483
486
|
// actual passed arguments are available in an arguments adaptor
|
|
484
487
|
// frame below it on the stack.
|
|
485
488
|
inline bool has_adapted_arguments() const;
|
|
489
|
+
int GetArgumentsLength() const;
|
|
486
490
|
|
|
487
491
|
// Garbage collection support.
|
|
488
492
|
virtual void Iterate(ObjectVisitor* v) const;
|
|
@@ -495,6 +499,9 @@ class JavaScriptFrame: public StandardFrame {
|
|
|
495
499
|
// Determine the code for the frame.
|
|
496
500
|
virtual Code* unchecked_code() const;
|
|
497
501
|
|
|
502
|
+
// Returns the levels of inlining for this frame.
|
|
503
|
+
virtual int GetInlineCount() { return 1; }
|
|
504
|
+
|
|
498
505
|
// Return a list with JSFunctions of this frame.
|
|
499
506
|
virtual void GetFunctions(List<JSFunction*>* functions);
|
|
500
507
|
|
|
@@ -533,6 +540,8 @@ class OptimizedFrame : public JavaScriptFrame {
|
|
|
533
540
|
// GC support.
|
|
534
541
|
virtual void Iterate(ObjectVisitor* v) const;
|
|
535
542
|
|
|
543
|
+
virtual int GetInlineCount();
|
|
544
|
+
|
|
536
545
|
// Return a list with JSFunctions of this frame.
|
|
537
546
|
// The functions are ordered bottom-to-top (i.e. functions.last()
|
|
538
547
|
// is the top-most activation)
|
|
@@ -835,7 +844,6 @@ class SafeStackFrameIterator BASE_EMBEDDED {
|
|
|
835
844
|
};
|
|
836
845
|
|
|
837
846
|
|
|
838
|
-
#ifdef ENABLE_LOGGING_AND_PROFILING
|
|
839
847
|
typedef JavaScriptFrameIteratorTemp<SafeStackFrameIterator>
|
|
840
848
|
SafeJavaScriptFrameIterator;
|
|
841
849
|
|
|
@@ -847,7 +855,6 @@ class SafeStackTraceFrameIterator: public SafeJavaScriptFrameIterator {
|
|
|
847
855
|
Address low_bound, Address high_bound);
|
|
848
856
|
void Advance();
|
|
849
857
|
};
|
|
850
|
-
#endif
|
|
851
858
|
|
|
852
859
|
|
|
853
860
|
class StackFrameLocator BASE_EMBEDDED {
|
|
@@ -35,6 +35,7 @@
|
|
|
35
35
|
#include "macro-assembler.h"
|
|
36
36
|
#include "prettyprinter.h"
|
|
37
37
|
#include "scopes.h"
|
|
38
|
+
#include "scopeinfo.h"
|
|
38
39
|
#include "stub-cache.h"
|
|
39
40
|
|
|
40
41
|
namespace v8 {
|
|
@@ -90,14 +91,13 @@ void BreakableStatementChecker::VisitReturnStatement(ReturnStatement* stmt) {
|
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
|
|
93
|
-
void BreakableStatementChecker::
|
|
94
|
-
WithEnterStatement* stmt) {
|
|
94
|
+
void BreakableStatementChecker::VisitWithStatement(WithStatement* stmt) {
|
|
95
95
|
Visit(stmt->expression());
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
|
|
99
|
-
void BreakableStatementChecker::
|
|
100
|
-
|
|
99
|
+
void BreakableStatementChecker::VisitExitContextStatement(
|
|
100
|
+
ExitContextStatement* stmt) {
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
|
|
@@ -187,11 +187,6 @@ void BreakableStatementChecker::VisitArrayLiteral(ArrayLiteral* expr) {
|
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
|
|
190
|
-
void BreakableStatementChecker::VisitCatchExtensionObject(
|
|
191
|
-
CatchExtensionObject* expr) {
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
|
|
195
190
|
void BreakableStatementChecker::VisitAssignment(Assignment* expr) {
|
|
196
191
|
// If assigning to a property (including a global property) the assignment is
|
|
197
192
|
// breakable.
|
|
@@ -247,7 +242,10 @@ void BreakableStatementChecker::VisitCountOperation(CountOperation* expr) {
|
|
|
247
242
|
|
|
248
243
|
void BreakableStatementChecker::VisitBinaryOperation(BinaryOperation* expr) {
|
|
249
244
|
Visit(expr->left());
|
|
250
|
-
|
|
245
|
+
if (expr->op() != Token::AND &&
|
|
246
|
+
expr->op() != Token::OR) {
|
|
247
|
+
Visit(expr->right());
|
|
248
|
+
}
|
|
251
249
|
}
|
|
252
250
|
|
|
253
251
|
|
|
@@ -319,7 +317,6 @@ unsigned FullCodeGenerator::EmitStackCheckTable() {
|
|
|
319
317
|
// field, and then a sequence of entries. Each entry is a pair of AST id
|
|
320
318
|
// and code-relative pc offset.
|
|
321
319
|
masm()->Align(kIntSize);
|
|
322
|
-
masm()->RecordComment("[ Stack check table");
|
|
323
320
|
unsigned offset = masm()->pc_offset();
|
|
324
321
|
unsigned length = stack_checks_.length();
|
|
325
322
|
__ dd(length);
|
|
@@ -327,7 +324,6 @@ unsigned FullCodeGenerator::EmitStackCheckTable() {
|
|
|
327
324
|
__ dd(stack_checks_[i].id);
|
|
328
325
|
__ dd(stack_checks_[i].pc_and_state);
|
|
329
326
|
}
|
|
330
|
-
masm()->RecordComment("]");
|
|
331
327
|
return offset;
|
|
332
328
|
}
|
|
333
329
|
|
|
@@ -348,7 +344,7 @@ void FullCodeGenerator::PopulateDeoptimizationData(Handle<Code> code) {
|
|
|
348
344
|
}
|
|
349
345
|
|
|
350
346
|
|
|
351
|
-
void FullCodeGenerator::PrepareForBailout(
|
|
347
|
+
void FullCodeGenerator::PrepareForBailout(Expression* node, State state) {
|
|
352
348
|
PrepareForBailoutForId(node->id(), state);
|
|
353
349
|
}
|
|
354
350
|
|
|
@@ -406,7 +402,7 @@ int FullCodeGenerator::SlotOffset(Slot* slot) {
|
|
|
406
402
|
// Adjust by a (parameter or local) base offset.
|
|
407
403
|
switch (slot->type()) {
|
|
408
404
|
case Slot::PARAMETER:
|
|
409
|
-
offset += (scope()->num_parameters() + 1) * kPointerSize;
|
|
405
|
+
offset += (info_->scope()->num_parameters() + 1) * kPointerSize;
|
|
410
406
|
break;
|
|
411
407
|
case Slot::LOCAL:
|
|
412
408
|
offset += JavaScriptFrameConstants::kLocal0Offset;
|
|
@@ -439,6 +435,7 @@ void FullCodeGenerator::AccumulatorValueContext::Plug(Register reg) const {
|
|
|
439
435
|
|
|
440
436
|
void FullCodeGenerator::StackValueContext::Plug(Register reg) const {
|
|
441
437
|
__ push(reg);
|
|
438
|
+
codegen()->increment_stack_height();
|
|
442
439
|
}
|
|
443
440
|
|
|
444
441
|
|
|
@@ -446,17 +443,19 @@ void FullCodeGenerator::TestContext::Plug(Register reg) const {
|
|
|
446
443
|
// For simplicity we always test the accumulator register.
|
|
447
444
|
__ Move(result_register(), reg);
|
|
448
445
|
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
449
|
-
codegen()->DoTest(
|
|
446
|
+
codegen()->DoTest(this);
|
|
450
447
|
}
|
|
451
448
|
|
|
452
449
|
|
|
453
450
|
void FullCodeGenerator::EffectContext::PlugTOS() const {
|
|
454
451
|
__ Drop(1);
|
|
452
|
+
codegen()->decrement_stack_height();
|
|
455
453
|
}
|
|
456
454
|
|
|
457
455
|
|
|
458
456
|
void FullCodeGenerator::AccumulatorValueContext::PlugTOS() const {
|
|
459
457
|
__ pop(result_register());
|
|
458
|
+
codegen()->decrement_stack_height();
|
|
460
459
|
}
|
|
461
460
|
|
|
462
461
|
|
|
@@ -467,8 +466,9 @@ void FullCodeGenerator::StackValueContext::PlugTOS() const {
|
|
|
467
466
|
void FullCodeGenerator::TestContext::PlugTOS() const {
|
|
468
467
|
// For simplicity we always test the accumulator register.
|
|
469
468
|
__ pop(result_register());
|
|
469
|
+
codegen()->decrement_stack_height();
|
|
470
470
|
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
471
|
-
codegen()->DoTest(
|
|
471
|
+
codegen()->DoTest(this);
|
|
472
472
|
}
|
|
473
473
|
|
|
474
474
|
|
|
@@ -518,6 +518,14 @@ void FullCodeGenerator::TestContext::PrepareTest(
|
|
|
518
518
|
}
|
|
519
519
|
|
|
520
520
|
|
|
521
|
+
void FullCodeGenerator::DoTest(const TestContext* context) {
|
|
522
|
+
DoTest(context->condition(),
|
|
523
|
+
context->true_label(),
|
|
524
|
+
context->false_label(),
|
|
525
|
+
context->fall_through());
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
|
|
521
529
|
void FullCodeGenerator::VisitDeclarations(
|
|
522
530
|
ZoneList<Declaration*>* declarations) {
|
|
523
531
|
int length = declarations->length();
|
|
@@ -577,88 +585,78 @@ void FullCodeGenerator::VisitDeclarations(
|
|
|
577
585
|
|
|
578
586
|
|
|
579
587
|
void FullCodeGenerator::SetFunctionPosition(FunctionLiteral* fun) {
|
|
580
|
-
|
|
581
|
-
CodeGenerator::RecordPositions(masm_, fun->start_position());
|
|
582
|
-
}
|
|
588
|
+
CodeGenerator::RecordPositions(masm_, fun->start_position());
|
|
583
589
|
}
|
|
584
590
|
|
|
585
591
|
|
|
586
592
|
void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) {
|
|
587
|
-
|
|
588
|
-
CodeGenerator::RecordPositions(masm_, fun->end_position() - 1);
|
|
589
|
-
}
|
|
593
|
+
CodeGenerator::RecordPositions(masm_, fun->end_position() - 1);
|
|
590
594
|
}
|
|
591
595
|
|
|
592
596
|
|
|
593
597
|
void FullCodeGenerator::SetStatementPosition(Statement* stmt) {
|
|
594
|
-
if (FLAG_debug_info) {
|
|
595
598
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
}
|
|
599
|
+
if (!isolate()->debugger()->IsDebuggerActive()) {
|
|
600
|
+
CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
|
|
601
|
+
} else {
|
|
602
|
+
// Check if the statement will be breakable without adding a debug break
|
|
603
|
+
// slot.
|
|
604
|
+
BreakableStatementChecker checker;
|
|
605
|
+
checker.Check(stmt);
|
|
606
|
+
// Record the statement position right here if the statement is not
|
|
607
|
+
// breakable. For breakable statements the actual recording of the
|
|
608
|
+
// position will be postponed to the breakable code (typically an IC).
|
|
609
|
+
bool position_recorded = CodeGenerator::RecordPositions(
|
|
610
|
+
masm_, stmt->statement_pos(), !checker.is_breakable());
|
|
611
|
+
// If the position recording did record a new position generate a debug
|
|
612
|
+
// break slot to make the statement breakable.
|
|
613
|
+
if (position_recorded) {
|
|
614
|
+
Debug::GenerateSlot(masm_);
|
|
613
615
|
}
|
|
616
|
+
}
|
|
614
617
|
#else
|
|
615
|
-
|
|
618
|
+
CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
|
|
616
619
|
#endif
|
|
617
|
-
}
|
|
618
620
|
}
|
|
619
621
|
|
|
620
622
|
|
|
621
623
|
void FullCodeGenerator::SetExpressionPosition(Expression* expr, int pos) {
|
|
622
|
-
if (FLAG_debug_info) {
|
|
623
624
|
#ifdef ENABLE_DEBUGGER_SUPPORT
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
}
|
|
625
|
+
if (!isolate()->debugger()->IsDebuggerActive()) {
|
|
626
|
+
CodeGenerator::RecordPositions(masm_, pos);
|
|
627
|
+
} else {
|
|
628
|
+
// Check if the expression will be breakable without adding a debug break
|
|
629
|
+
// slot.
|
|
630
|
+
BreakableStatementChecker checker;
|
|
631
|
+
checker.Check(expr);
|
|
632
|
+
// Record a statement position right here if the expression is not
|
|
633
|
+
// breakable. For breakable expressions the actual recording of the
|
|
634
|
+
// position will be postponed to the breakable code (typically an IC).
|
|
635
|
+
// NOTE this will record a statement position for something which might
|
|
636
|
+
// not be a statement. As stepping in the debugger will only stop at
|
|
637
|
+
// statement positions this is used for e.g. the condition expression of
|
|
638
|
+
// a do while loop.
|
|
639
|
+
bool position_recorded = CodeGenerator::RecordPositions(
|
|
640
|
+
masm_, pos, !checker.is_breakable());
|
|
641
|
+
// If the position recording did record a new position generate a debug
|
|
642
|
+
// break slot to make the statement breakable.
|
|
643
|
+
if (position_recorded) {
|
|
644
|
+
Debug::GenerateSlot(masm_);
|
|
645
645
|
}
|
|
646
|
+
}
|
|
646
647
|
#else
|
|
647
|
-
|
|
648
|
+
CodeGenerator::RecordPositions(masm_, pos);
|
|
648
649
|
#endif
|
|
649
|
-
}
|
|
650
650
|
}
|
|
651
651
|
|
|
652
652
|
|
|
653
653
|
void FullCodeGenerator::SetStatementPosition(int pos) {
|
|
654
|
-
|
|
655
|
-
CodeGenerator::RecordPositions(masm_, pos);
|
|
656
|
-
}
|
|
654
|
+
CodeGenerator::RecordPositions(masm_, pos);
|
|
657
655
|
}
|
|
658
656
|
|
|
659
657
|
|
|
660
658
|
void FullCodeGenerator::SetSourcePosition(int pos) {
|
|
661
|
-
if (
|
|
659
|
+
if (pos != RelocInfo::kNoPosition) {
|
|
662
660
|
masm_->positions_recorder()->RecordPosition(pos);
|
|
663
661
|
}
|
|
664
662
|
}
|
|
@@ -690,7 +688,6 @@ FullCodeGenerator::InlineFunctionGenerator
|
|
|
690
688
|
|
|
691
689
|
void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
|
|
692
690
|
ZoneList<Expression*>* args = node->arguments();
|
|
693
|
-
Handle<String> name = node->name();
|
|
694
691
|
const Runtime::Function* function = node->function();
|
|
695
692
|
ASSERT(function != NULL);
|
|
696
693
|
ASSERT(function->intrinsic_type == Runtime::INLINE);
|
|
@@ -701,143 +698,116 @@ void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
|
|
|
701
698
|
|
|
702
699
|
|
|
703
700
|
void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
|
|
704
|
-
|
|
705
|
-
Token::Value op = expr->op();
|
|
706
|
-
Expression* left = expr->left();
|
|
707
|
-
Expression* right = expr->right();
|
|
708
|
-
|
|
709
|
-
OverwriteMode mode = NO_OVERWRITE;
|
|
710
|
-
if (left->ResultOverwriteAllowed()) {
|
|
711
|
-
mode = OVERWRITE_LEFT;
|
|
712
|
-
} else if (right->ResultOverwriteAllowed()) {
|
|
713
|
-
mode = OVERWRITE_RIGHT;
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
switch (op) {
|
|
701
|
+
switch (expr->op()) {
|
|
717
702
|
case Token::COMMA:
|
|
718
|
-
|
|
719
|
-
if (context()->IsTest()) ForwardBailoutToChild(expr);
|
|
720
|
-
context()->HandleExpression(right);
|
|
721
|
-
break;
|
|
722
|
-
|
|
703
|
+
return VisitComma(expr);
|
|
723
704
|
case Token::OR:
|
|
724
705
|
case Token::AND:
|
|
725
|
-
|
|
726
|
-
break;
|
|
727
|
-
|
|
728
|
-
case Token::ADD:
|
|
729
|
-
case Token::SUB:
|
|
730
|
-
case Token::DIV:
|
|
731
|
-
case Token::MOD:
|
|
732
|
-
case Token::MUL:
|
|
733
|
-
case Token::BIT_OR:
|
|
734
|
-
case Token::BIT_AND:
|
|
735
|
-
case Token::BIT_XOR:
|
|
736
|
-
case Token::SHL:
|
|
737
|
-
case Token::SHR:
|
|
738
|
-
case Token::SAR: {
|
|
739
|
-
// Load both operands.
|
|
740
|
-
VisitForStackValue(left);
|
|
741
|
-
VisitForAccumulatorValue(right);
|
|
742
|
-
|
|
743
|
-
SetSourcePosition(expr->position());
|
|
744
|
-
if (ShouldInlineSmiCase(op)) {
|
|
745
|
-
EmitInlineSmiBinaryOp(expr, op, mode, left, right);
|
|
746
|
-
} else {
|
|
747
|
-
EmitBinaryOp(expr, op, mode);
|
|
748
|
-
}
|
|
749
|
-
break;
|
|
750
|
-
}
|
|
751
|
-
|
|
706
|
+
return VisitLogicalExpression(expr);
|
|
752
707
|
default:
|
|
753
|
-
|
|
708
|
+
return VisitArithmeticExpression(expr);
|
|
754
709
|
}
|
|
755
710
|
}
|
|
756
711
|
|
|
757
712
|
|
|
758
|
-
void FullCodeGenerator::
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
context()->EmitLogicalLeft(expr, &eval_right, &done);
|
|
762
|
-
|
|
763
|
-
PrepareForBailoutForId(expr->RightId(), NO_REGISTERS);
|
|
764
|
-
__ bind(&eval_right);
|
|
713
|
+
void FullCodeGenerator::VisitComma(BinaryOperation* expr) {
|
|
714
|
+
Comment cmnt(masm_, "[ Comma");
|
|
715
|
+
VisitForEffect(expr->left());
|
|
765
716
|
if (context()->IsTest()) ForwardBailoutToChild(expr);
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
__ bind(&done);
|
|
717
|
+
VisitInCurrentContext(expr->right());
|
|
769
718
|
}
|
|
770
719
|
|
|
771
720
|
|
|
772
|
-
void FullCodeGenerator::
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
codegen()->VisitForControl(expr->left(), eval_right, done, eval_right);
|
|
780
|
-
}
|
|
781
|
-
}
|
|
721
|
+
void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) {
|
|
722
|
+
bool is_logical_and = expr->op() == Token::AND;
|
|
723
|
+
Comment cmnt(masm_, is_logical_and ? "[ Logical AND" : "[ Logical OR");
|
|
724
|
+
Expression* left = expr->left();
|
|
725
|
+
Expression* right = expr->right();
|
|
726
|
+
int right_id = expr->RightId();
|
|
727
|
+
Label done;
|
|
782
728
|
|
|
729
|
+
if (context()->IsTest()) {
|
|
730
|
+
Label eval_right;
|
|
731
|
+
const TestContext* test = TestContext::cast(context());
|
|
732
|
+
if (is_logical_and) {
|
|
733
|
+
VisitForControl(left, &eval_right, test->false_label(), &eval_right);
|
|
734
|
+
} else {
|
|
735
|
+
VisitForControl(left, test->true_label(), &eval_right, &eval_right);
|
|
736
|
+
}
|
|
737
|
+
PrepareForBailoutForId(right_id, NO_REGISTERS);
|
|
738
|
+
__ bind(&eval_right);
|
|
739
|
+
ForwardBailoutToChild(expr);
|
|
740
|
+
|
|
741
|
+
} else if (context()->IsAccumulatorValue()) {
|
|
742
|
+
VisitForAccumulatorValue(left);
|
|
743
|
+
// We want the value in the accumulator for the test, and on the stack in
|
|
744
|
+
// case we need it.
|
|
745
|
+
__ push(result_register());
|
|
746
|
+
Label discard, restore;
|
|
747
|
+
PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
748
|
+
if (is_logical_and) {
|
|
749
|
+
DoTest(left, &discard, &restore, &restore);
|
|
750
|
+
} else {
|
|
751
|
+
DoTest(left, &restore, &discard, &restore);
|
|
752
|
+
}
|
|
753
|
+
__ bind(&restore);
|
|
754
|
+
__ pop(result_register());
|
|
755
|
+
__ jmp(&done);
|
|
756
|
+
__ bind(&discard);
|
|
757
|
+
__ Drop(1);
|
|
758
|
+
PrepareForBailoutForId(right_id, NO_REGISTERS);
|
|
759
|
+
|
|
760
|
+
} else if (context()->IsStackValue()) {
|
|
761
|
+
VisitForAccumulatorValue(left);
|
|
762
|
+
// We want the value in the accumulator for the test, and on the stack in
|
|
763
|
+
// case we need it.
|
|
764
|
+
__ push(result_register());
|
|
765
|
+
Label discard;
|
|
766
|
+
PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
767
|
+
if (is_logical_and) {
|
|
768
|
+
DoTest(left, &discard, &done, &discard);
|
|
769
|
+
} else {
|
|
770
|
+
DoTest(left, &done, &discard, &discard);
|
|
771
|
+
}
|
|
772
|
+
__ bind(&discard);
|
|
773
|
+
__ Drop(1);
|
|
774
|
+
PrepareForBailoutForId(right_id, NO_REGISTERS);
|
|
783
775
|
|
|
784
|
-
void FullCodeGenerator::AccumulatorValueContext::EmitLogicalLeft(
|
|
785
|
-
BinaryOperation* expr,
|
|
786
|
-
Label* eval_right,
|
|
787
|
-
Label* done) const {
|
|
788
|
-
HandleExpression(expr->left());
|
|
789
|
-
// We want the value in the accumulator for the test, and on the stack in case
|
|
790
|
-
// we need it.
|
|
791
|
-
__ push(result_register());
|
|
792
|
-
Label discard, restore;
|
|
793
|
-
if (expr->op() == Token::OR) {
|
|
794
|
-
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
795
|
-
codegen()->DoTest(&restore, &discard, &restore);
|
|
796
776
|
} else {
|
|
797
|
-
ASSERT(
|
|
798
|
-
|
|
799
|
-
|
|
777
|
+
ASSERT(context()->IsEffect());
|
|
778
|
+
Label eval_right;
|
|
779
|
+
if (is_logical_and) {
|
|
780
|
+
VisitForControl(left, &eval_right, &done, &eval_right);
|
|
781
|
+
} else {
|
|
782
|
+
VisitForControl(left, &done, &eval_right, &eval_right);
|
|
783
|
+
}
|
|
784
|
+
PrepareForBailoutForId(right_id, NO_REGISTERS);
|
|
785
|
+
__ bind(&eval_right);
|
|
800
786
|
}
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
__
|
|
804
|
-
__ bind(&discard);
|
|
805
|
-
__ Drop(1);
|
|
787
|
+
|
|
788
|
+
VisitInCurrentContext(right);
|
|
789
|
+
__ bind(&done);
|
|
806
790
|
}
|
|
807
791
|
|
|
808
792
|
|
|
809
|
-
void FullCodeGenerator::
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
if (expr->op() == Token::OR) {
|
|
819
|
-
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
820
|
-
codegen()->DoTest(done, &discard, &discard);
|
|
821
|
-
} else {
|
|
822
|
-
ASSERT(expr->op() == Token::AND);
|
|
823
|
-
codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
|
|
824
|
-
codegen()->DoTest(&discard, done, &discard);
|
|
825
|
-
}
|
|
826
|
-
__ bind(&discard);
|
|
827
|
-
__ Drop(1);
|
|
828
|
-
}
|
|
793
|
+
void FullCodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) {
|
|
794
|
+
Token::Value op = expr->op();
|
|
795
|
+
Comment cmnt(masm_, "[ ArithmeticExpression");
|
|
796
|
+
Expression* left = expr->left();
|
|
797
|
+
Expression* right = expr->right();
|
|
798
|
+
OverwriteMode mode =
|
|
799
|
+
left->ResultOverwriteAllowed()
|
|
800
|
+
? OVERWRITE_LEFT
|
|
801
|
+
: (right->ResultOverwriteAllowed() ? OVERWRITE_RIGHT : NO_OVERWRITE);
|
|
829
802
|
|
|
803
|
+
VisitForStackValue(left);
|
|
804
|
+
VisitForAccumulatorValue(right);
|
|
830
805
|
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
if (expr->op() == Token::OR) {
|
|
835
|
-
codegen()->VisitForControl(expr->left(),
|
|
836
|
-
true_label_, eval_right, eval_right);
|
|
806
|
+
SetSourcePosition(expr->position());
|
|
807
|
+
if (ShouldInlineSmiCase(op)) {
|
|
808
|
+
EmitInlineSmiBinaryOp(expr, op, mode, left, right);
|
|
837
809
|
} else {
|
|
838
|
-
|
|
839
|
-
codegen()->VisitForControl(expr->left(),
|
|
840
|
-
eval_right, false_label_, eval_right);
|
|
810
|
+
EmitBinaryOp(expr, op, mode);
|
|
841
811
|
}
|
|
842
812
|
}
|
|
843
813
|
|
|
@@ -850,46 +820,23 @@ void FullCodeGenerator::ForwardBailoutToChild(Expression* expr) {
|
|
|
850
820
|
}
|
|
851
821
|
|
|
852
822
|
|
|
853
|
-
void FullCodeGenerator::
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
void FullCodeGenerator::TestContext::HandleExpression(Expression* expr) const {
|
|
872
|
-
codegen()->VisitInTestContext(expr);
|
|
873
|
-
}
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
void FullCodeGenerator::HandleInNonTestContext(Expression* expr, State state) {
|
|
877
|
-
ASSERT(forward_bailout_pending_ == NULL);
|
|
878
|
-
AstVisitor::Visit(expr);
|
|
879
|
-
PrepareForBailout(expr, state);
|
|
880
|
-
// Forwarding bailouts to children is a one shot operation. It
|
|
881
|
-
// should have been processed at this point.
|
|
882
|
-
ASSERT(forward_bailout_pending_ == NULL);
|
|
883
|
-
}
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
void FullCodeGenerator::VisitInTestContext(Expression* expr) {
|
|
887
|
-
ForwardBailoutStack stack(expr, forward_bailout_pending_);
|
|
888
|
-
ForwardBailoutStack* saved = forward_bailout_stack_;
|
|
889
|
-
forward_bailout_pending_ = NULL;
|
|
890
|
-
forward_bailout_stack_ = &stack;
|
|
891
|
-
AstVisitor::Visit(expr);
|
|
892
|
-
forward_bailout_stack_ = saved;
|
|
823
|
+
void FullCodeGenerator::VisitInCurrentContext(Expression* expr) {
|
|
824
|
+
if (context()->IsTest()) {
|
|
825
|
+
ForwardBailoutStack stack(expr, forward_bailout_pending_);
|
|
826
|
+
ForwardBailoutStack* saved = forward_bailout_stack_;
|
|
827
|
+
forward_bailout_pending_ = NULL;
|
|
828
|
+
forward_bailout_stack_ = &stack;
|
|
829
|
+
Visit(expr);
|
|
830
|
+
forward_bailout_stack_ = saved;
|
|
831
|
+
} else {
|
|
832
|
+
ASSERT(forward_bailout_pending_ == NULL);
|
|
833
|
+
Visit(expr);
|
|
834
|
+
State state = context()->IsAccumulatorValue() ? TOS_REG : NO_REGISTERS;
|
|
835
|
+
PrepareForBailout(expr, state);
|
|
836
|
+
// Forwarding bailouts to children is a one shot operation. It should have
|
|
837
|
+
// been processed at this point.
|
|
838
|
+
ASSERT(forward_bailout_pending_ == NULL);
|
|
839
|
+
}
|
|
893
840
|
}
|
|
894
841
|
|
|
895
842
|
|
|
@@ -898,9 +845,24 @@ void FullCodeGenerator::VisitBlock(Block* stmt) {
|
|
|
898
845
|
Breakable nested_statement(this, stmt);
|
|
899
846
|
SetStatementPosition(stmt);
|
|
900
847
|
|
|
848
|
+
Scope* saved_scope = scope();
|
|
849
|
+
if (stmt->block_scope() != NULL) {
|
|
850
|
+
{ Comment cmnt(masm_, "[ Extend block context");
|
|
851
|
+
scope_ = stmt->block_scope();
|
|
852
|
+
__ Push(scope_->GetSerializedScopeInfo());
|
|
853
|
+
PushFunctionArgumentForContextAllocation();
|
|
854
|
+
__ CallRuntime(Runtime::kPushBlockContext, 2);
|
|
855
|
+
StoreToFrameField(StandardFrameConstants::kContextOffset,
|
|
856
|
+
context_register());
|
|
857
|
+
}
|
|
858
|
+
{ Comment cmnt(masm_, "[ Declarations");
|
|
859
|
+
VisitDeclarations(scope_->declarations());
|
|
860
|
+
}
|
|
861
|
+
}
|
|
901
862
|
PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS);
|
|
902
863
|
VisitStatements(stmt->statements());
|
|
903
|
-
|
|
864
|
+
scope_ = saved_scope;
|
|
865
|
+
__ bind(nested_statement.break_label());
|
|
904
866
|
PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
|
905
867
|
}
|
|
906
868
|
|
|
@@ -942,7 +904,7 @@ void FullCodeGenerator::VisitIfStatement(IfStatement* stmt) {
|
|
|
942
904
|
PrepareForBailoutForId(stmt->ElseId(), NO_REGISTERS);
|
|
943
905
|
}
|
|
944
906
|
__ bind(&done);
|
|
945
|
-
PrepareForBailoutForId(stmt->
|
|
907
|
+
PrepareForBailoutForId(stmt->IfId(), NO_REGISTERS);
|
|
946
908
|
}
|
|
947
909
|
|
|
948
910
|
|
|
@@ -951,19 +913,26 @@ void FullCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) {
|
|
|
951
913
|
SetStatementPosition(stmt);
|
|
952
914
|
NestedStatement* current = nesting_stack_;
|
|
953
915
|
int stack_depth = 0;
|
|
916
|
+
int context_length = 0;
|
|
954
917
|
// When continuing, we clobber the unpredictable value in the accumulator
|
|
955
918
|
// with one that's safe for GC. If we hit an exit from the try block of
|
|
956
919
|
// try...finally on our way out, we will unconditionally preserve the
|
|
957
920
|
// accumulator on the stack.
|
|
958
921
|
ClearAccumulator();
|
|
959
922
|
while (!current->IsContinueTarget(stmt->target())) {
|
|
960
|
-
|
|
961
|
-
current = current->outer();
|
|
923
|
+
current = current->Exit(&stack_depth, &context_length);
|
|
962
924
|
}
|
|
963
925
|
__ Drop(stack_depth);
|
|
926
|
+
if (context_length > 0) {
|
|
927
|
+
while (context_length > 0) {
|
|
928
|
+
LoadContextField(context_register(), Context::PREVIOUS_INDEX);
|
|
929
|
+
--context_length;
|
|
930
|
+
}
|
|
931
|
+
StoreToFrameField(StandardFrameConstants::kContextOffset,
|
|
932
|
+
context_register());
|
|
933
|
+
}
|
|
964
934
|
|
|
965
|
-
|
|
966
|
-
__ jmp(loop->continue_target());
|
|
935
|
+
__ jmp(current->AsIteration()->continue_label());
|
|
967
936
|
}
|
|
968
937
|
|
|
969
938
|
|
|
@@ -972,19 +941,26 @@ void FullCodeGenerator::VisitBreakStatement(BreakStatement* stmt) {
|
|
|
972
941
|
SetStatementPosition(stmt);
|
|
973
942
|
NestedStatement* current = nesting_stack_;
|
|
974
943
|
int stack_depth = 0;
|
|
944
|
+
int context_length = 0;
|
|
975
945
|
// When breaking, we clobber the unpredictable value in the accumulator
|
|
976
946
|
// with one that's safe for GC. If we hit an exit from the try block of
|
|
977
947
|
// try...finally on our way out, we will unconditionally preserve the
|
|
978
948
|
// accumulator on the stack.
|
|
979
949
|
ClearAccumulator();
|
|
980
950
|
while (!current->IsBreakTarget(stmt->target())) {
|
|
981
|
-
|
|
982
|
-
current = current->outer();
|
|
951
|
+
current = current->Exit(&stack_depth, &context_length);
|
|
983
952
|
}
|
|
984
953
|
__ Drop(stack_depth);
|
|
954
|
+
if (context_length > 0) {
|
|
955
|
+
while (context_length > 0) {
|
|
956
|
+
LoadContextField(context_register(), Context::PREVIOUS_INDEX);
|
|
957
|
+
--context_length;
|
|
958
|
+
}
|
|
959
|
+
StoreToFrameField(StandardFrameConstants::kContextOffset,
|
|
960
|
+
context_register());
|
|
961
|
+
}
|
|
985
962
|
|
|
986
|
-
|
|
987
|
-
__ jmp(target->break_target());
|
|
963
|
+
__ jmp(current->AsBreakable()->break_label());
|
|
988
964
|
}
|
|
989
965
|
|
|
990
966
|
|
|
@@ -997,9 +973,9 @@ void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
|
|
|
997
973
|
// Exit all nested statements.
|
|
998
974
|
NestedStatement* current = nesting_stack_;
|
|
999
975
|
int stack_depth = 0;
|
|
976
|
+
int context_length = 0;
|
|
1000
977
|
while (current != NULL) {
|
|
1001
|
-
|
|
1002
|
-
current = current->outer();
|
|
978
|
+
current = current->Exit(&stack_depth, &context_length);
|
|
1003
979
|
}
|
|
1004
980
|
__ Drop(stack_depth);
|
|
1005
981
|
|
|
@@ -1007,26 +983,29 @@ void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
|
|
|
1007
983
|
}
|
|
1008
984
|
|
|
1009
985
|
|
|
1010
|
-
void FullCodeGenerator::
|
|
1011
|
-
Comment cmnt(masm_, "[
|
|
986
|
+
void FullCodeGenerator::VisitWithStatement(WithStatement* stmt) {
|
|
987
|
+
Comment cmnt(masm_, "[ WithStatement");
|
|
1012
988
|
SetStatementPosition(stmt);
|
|
1013
989
|
|
|
1014
990
|
VisitForStackValue(stmt->expression());
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
991
|
+
PushFunctionArgumentForContextAllocation();
|
|
992
|
+
__ CallRuntime(Runtime::kPushWithContext, 2);
|
|
993
|
+
decrement_stack_height();
|
|
994
|
+
StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
|
|
995
|
+
|
|
996
|
+
{ WithOrCatch body(this);
|
|
997
|
+
Visit(stmt->statement());
|
|
1019
998
|
}
|
|
1020
|
-
// Both runtime calls return the new context in both the context and the
|
|
1021
|
-
// result registers.
|
|
1022
999
|
|
|
1000
|
+
// Pop context.
|
|
1001
|
+
LoadContextField(context_register(), Context::PREVIOUS_INDEX);
|
|
1023
1002
|
// Update local stack frame context field.
|
|
1024
1003
|
StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
|
|
1025
1004
|
}
|
|
1026
1005
|
|
|
1027
1006
|
|
|
1028
|
-
void FullCodeGenerator::
|
|
1029
|
-
Comment cmnt(masm_, "[
|
|
1007
|
+
void FullCodeGenerator::VisitExitContextStatement(ExitContextStatement* stmt) {
|
|
1008
|
+
Comment cmnt(masm_, "[ ExitContextStatement");
|
|
1030
1009
|
SetStatementPosition(stmt);
|
|
1031
1010
|
|
|
1032
1011
|
// Pop context.
|
|
@@ -1049,12 +1028,12 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) {
|
|
|
1049
1028
|
|
|
1050
1029
|
// Record the position of the do while condition and make sure it is
|
|
1051
1030
|
// possible to break on the condition.
|
|
1052
|
-
__ bind(loop_statement.
|
|
1031
|
+
__ bind(loop_statement.continue_label());
|
|
1053
1032
|
PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
|
|
1054
1033
|
SetExpressionPosition(stmt->cond(), stmt->condition_position());
|
|
1055
1034
|
VisitForControl(stmt->cond(),
|
|
1056
1035
|
&stack_check,
|
|
1057
|
-
loop_statement.
|
|
1036
|
+
loop_statement.break_label(),
|
|
1058
1037
|
&stack_check);
|
|
1059
1038
|
|
|
1060
1039
|
// Check stack before looping.
|
|
@@ -1064,7 +1043,7 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) {
|
|
|
1064
1043
|
__ jmp(&body);
|
|
1065
1044
|
|
|
1066
1045
|
PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
|
1067
|
-
__ bind(loop_statement.
|
|
1046
|
+
__ bind(loop_statement.break_label());
|
|
1068
1047
|
decrement_loop_depth();
|
|
1069
1048
|
}
|
|
1070
1049
|
|
|
@@ -1085,7 +1064,7 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) {
|
|
|
1085
1064
|
|
|
1086
1065
|
// Emit the statement position here as this is where the while
|
|
1087
1066
|
// statement code starts.
|
|
1088
|
-
__ bind(loop_statement.
|
|
1067
|
+
__ bind(loop_statement.continue_label());
|
|
1089
1068
|
SetStatementPosition(stmt);
|
|
1090
1069
|
|
|
1091
1070
|
// Check stack before looping.
|
|
@@ -1094,11 +1073,11 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) {
|
|
|
1094
1073
|
__ bind(&test);
|
|
1095
1074
|
VisitForControl(stmt->cond(),
|
|
1096
1075
|
&body,
|
|
1097
|
-
loop_statement.
|
|
1098
|
-
loop_statement.
|
|
1076
|
+
loop_statement.break_label(),
|
|
1077
|
+
loop_statement.break_label());
|
|
1099
1078
|
|
|
1100
1079
|
PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
|
1101
|
-
__ bind(loop_statement.
|
|
1080
|
+
__ bind(loop_statement.break_label());
|
|
1102
1081
|
decrement_loop_depth();
|
|
1103
1082
|
}
|
|
1104
1083
|
|
|
@@ -1121,7 +1100,7 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
|
|
|
1121
1100
|
Visit(stmt->body());
|
|
1122
1101
|
|
|
1123
1102
|
PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
|
|
1124
|
-
__ bind(loop_statement.
|
|
1103
|
+
__ bind(loop_statement.continue_label());
|
|
1125
1104
|
SetStatementPosition(stmt);
|
|
1126
1105
|
if (stmt->next() != NULL) {
|
|
1127
1106
|
Visit(stmt->next());
|
|
@@ -1138,14 +1117,14 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
|
|
|
1138
1117
|
if (stmt->cond() != NULL) {
|
|
1139
1118
|
VisitForControl(stmt->cond(),
|
|
1140
1119
|
&body,
|
|
1141
|
-
loop_statement.
|
|
1142
|
-
loop_statement.
|
|
1120
|
+
loop_statement.break_label(),
|
|
1121
|
+
loop_statement.break_label());
|
|
1143
1122
|
} else {
|
|
1144
1123
|
__ jmp(&body);
|
|
1145
1124
|
}
|
|
1146
1125
|
|
|
1147
1126
|
PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
|
|
1148
|
-
__ bind(loop_statement.
|
|
1127
|
+
__ bind(loop_statement.break_label());
|
|
1149
1128
|
decrement_loop_depth();
|
|
1150
1129
|
}
|
|
1151
1130
|
|
|
@@ -1163,31 +1142,39 @@ void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
|
|
|
1163
1142
|
// to introduce a new scope to bind the catch variable and to remove
|
|
1164
1143
|
// that scope again afterwards.
|
|
1165
1144
|
|
|
1166
|
-
Label try_handler_setup,
|
|
1145
|
+
Label try_handler_setup, done;
|
|
1167
1146
|
__ Call(&try_handler_setup);
|
|
1168
1147
|
// Try handler code, exception in result register.
|
|
1169
1148
|
|
|
1170
|
-
//
|
|
1171
|
-
{
|
|
1172
|
-
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
StoreToFrameField(SlotOffset(variable_slot), result_register());
|
|
1149
|
+
// Extend the context before executing the catch block.
|
|
1150
|
+
{ Comment cmnt(masm_, "[ Extend catch context");
|
|
1151
|
+
__ Push(stmt->variable()->name());
|
|
1152
|
+
__ push(result_register());
|
|
1153
|
+
PushFunctionArgumentForContextAllocation();
|
|
1154
|
+
__ CallRuntime(Runtime::kPushCatchContext, 3);
|
|
1155
|
+
StoreToFrameField(StandardFrameConstants::kContextOffset,
|
|
1156
|
+
context_register());
|
|
1179
1157
|
}
|
|
1180
1158
|
|
|
1181
|
-
|
|
1159
|
+
Scope* saved_scope = scope();
|
|
1160
|
+
scope_ = stmt->scope();
|
|
1161
|
+
ASSERT(scope_->declarations()->is_empty());
|
|
1162
|
+
{ WithOrCatch body(this);
|
|
1163
|
+
Visit(stmt->catch_block());
|
|
1164
|
+
}
|
|
1165
|
+
scope_ = saved_scope;
|
|
1182
1166
|
__ jmp(&done);
|
|
1183
1167
|
|
|
1184
1168
|
// Try block code. Sets up the exception handler chain.
|
|
1185
1169
|
__ bind(&try_handler_setup);
|
|
1186
1170
|
{
|
|
1187
|
-
|
|
1171
|
+
const int delta = StackHandlerConstants::kSize / kPointerSize;
|
|
1172
|
+
TryCatch try_block(this);
|
|
1188
1173
|
__ PushTryHandler(IN_JAVASCRIPT, TRY_CATCH_HANDLER);
|
|
1174
|
+
increment_stack_height(delta);
|
|
1189
1175
|
Visit(stmt->try_block());
|
|
1190
1176
|
__ PopTryHandler();
|
|
1177
|
+
decrement_stack_height(delta);
|
|
1191
1178
|
}
|
|
1192
1179
|
__ bind(&done);
|
|
1193
1180
|
}
|
|
@@ -1219,6 +1206,7 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
|
|
1219
1206
|
// cooked before GC.
|
|
1220
1207
|
Label finally_entry;
|
|
1221
1208
|
Label try_handler_setup;
|
|
1209
|
+
const int original_stack_height = stack_height();
|
|
1222
1210
|
|
|
1223
1211
|
// Setup the try-handler chain. Use a call to
|
|
1224
1212
|
// Jump to try-handler setup and try-block code. Use call to put try-handler
|
|
@@ -1227,9 +1215,9 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
|
|
1227
1215
|
// Try handler code. Return address of call is pushed on handler stack.
|
|
1228
1216
|
{
|
|
1229
1217
|
// This code is only executed during stack-handler traversal when an
|
|
1230
|
-
// exception is thrown. The
|
|
1218
|
+
// exception is thrown. The exception is in the result register, which
|
|
1231
1219
|
// is retained by the finally block.
|
|
1232
|
-
// Call the finally block and then rethrow the exception.
|
|
1220
|
+
// Call the finally block and then rethrow the exception if it returns.
|
|
1233
1221
|
__ Call(&finally_entry);
|
|
1234
1222
|
__ push(result_register());
|
|
1235
1223
|
__ CallRuntime(Runtime::kReThrow, 1);
|
|
@@ -1240,6 +1228,7 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
|
|
1240
1228
|
// Finally block implementation.
|
|
1241
1229
|
Finally finally_block(this);
|
|
1242
1230
|
EnterFinallyBlock();
|
|
1231
|
+
set_stack_height(original_stack_height + Finally::kElementCount);
|
|
1243
1232
|
Visit(stmt->finally_block());
|
|
1244
1233
|
ExitFinallyBlock(); // Return to the calling code.
|
|
1245
1234
|
}
|
|
@@ -1247,10 +1236,13 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
|
|
|
1247
1236
|
__ bind(&try_handler_setup);
|
|
1248
1237
|
{
|
|
1249
1238
|
// Setup try handler (stack pointer registers).
|
|
1239
|
+
const int delta = StackHandlerConstants::kSize / kPointerSize;
|
|
1250
1240
|
TryFinally try_block(this, &finally_entry);
|
|
1251
1241
|
__ PushTryHandler(IN_JAVASCRIPT, TRY_FINALLY_HANDLER);
|
|
1242
|
+
set_stack_height(original_stack_height + delta);
|
|
1252
1243
|
Visit(stmt->try_block());
|
|
1253
1244
|
__ PopTryHandler();
|
|
1245
|
+
set_stack_height(original_stack_height);
|
|
1254
1246
|
}
|
|
1255
1247
|
// Execute the finally block on the way out. Clobber the unpredictable
|
|
1256
1248
|
// value in the accumulator with one that's safe for GC. The finally
|
|
@@ -1280,6 +1272,7 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) {
|
|
|
1280
1272
|
__ bind(&true_case);
|
|
1281
1273
|
SetExpressionPosition(expr->then_expression(),
|
|
1282
1274
|
expr->then_expression_position());
|
|
1275
|
+
int start_stack_height = stack_height();
|
|
1283
1276
|
if (context()->IsTest()) {
|
|
1284
1277
|
const TestContext* for_test = TestContext::cast(context());
|
|
1285
1278
|
VisitForControl(expr->then_expression(),
|
|
@@ -1287,16 +1280,17 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) {
|
|
|
1287
1280
|
for_test->false_label(),
|
|
1288
1281
|
NULL);
|
|
1289
1282
|
} else {
|
|
1290
|
-
|
|
1283
|
+
VisitInCurrentContext(expr->then_expression());
|
|
1291
1284
|
__ jmp(&done);
|
|
1292
1285
|
}
|
|
1293
1286
|
|
|
1294
1287
|
PrepareForBailoutForId(expr->ElseId(), NO_REGISTERS);
|
|
1295
1288
|
__ bind(&false_case);
|
|
1289
|
+
set_stack_height(start_stack_height);
|
|
1296
1290
|
if (context()->IsTest()) ForwardBailoutToChild(expr);
|
|
1297
1291
|
SetExpressionPosition(expr->else_expression(),
|
|
1298
1292
|
expr->else_expression_position());
|
|
1299
|
-
|
|
1293
|
+
VisitInCurrentContext(expr->else_expression());
|
|
1300
1294
|
// If control flow falls through Visit, merge it with true case here.
|
|
1301
1295
|
if (!context()->IsTest()) {
|
|
1302
1296
|
__ bind(&done);
|
|
@@ -1331,40 +1325,64 @@ void FullCodeGenerator::VisitSharedFunctionInfoLiteral(
|
|
|
1331
1325
|
}
|
|
1332
1326
|
|
|
1333
1327
|
|
|
1334
|
-
void FullCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) {
|
|
1335
|
-
// Call runtime routine to allocate the catch extension object and
|
|
1336
|
-
// assign the exception value to the catch variable.
|
|
1337
|
-
Comment cmnt(masm_, "[ CatchExtensionObject");
|
|
1338
|
-
VisitForStackValue(expr->key());
|
|
1339
|
-
VisitForStackValue(expr->value());
|
|
1340
|
-
// Create catch extension object.
|
|
1341
|
-
__ CallRuntime(Runtime::kCreateCatchExtensionObject, 2);
|
|
1342
|
-
context()->Plug(result_register());
|
|
1343
|
-
}
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
1328
|
void FullCodeGenerator::VisitThrow(Throw* expr) {
|
|
1347
1329
|
Comment cmnt(masm_, "[ Throw");
|
|
1330
|
+
// Throw has no effect on the stack height or the current expression context.
|
|
1331
|
+
// Usually the expression context is null, because throw is a statement.
|
|
1348
1332
|
VisitForStackValue(expr->exception());
|
|
1349
1333
|
__ CallRuntime(Runtime::kThrow, 1);
|
|
1334
|
+
decrement_stack_height();
|
|
1350
1335
|
// Never returns here.
|
|
1351
1336
|
}
|
|
1352
1337
|
|
|
1353
1338
|
|
|
1354
|
-
|
|
1339
|
+
FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit(
|
|
1340
|
+
int* stack_depth,
|
|
1341
|
+
int* context_length) {
|
|
1355
1342
|
// The macros used here must preserve the result register.
|
|
1356
|
-
__ Drop(stack_depth);
|
|
1343
|
+
__ Drop(*stack_depth);
|
|
1357
1344
|
__ PopTryHandler();
|
|
1345
|
+
*stack_depth = 0;
|
|
1346
|
+
|
|
1347
|
+
Register context = FullCodeGenerator::context_register();
|
|
1348
|
+
while (*context_length > 0) {
|
|
1349
|
+
codegen_->LoadContextField(context, Context::PREVIOUS_INDEX);
|
|
1350
|
+
--(*context_length);
|
|
1351
|
+
}
|
|
1352
|
+
|
|
1358
1353
|
__ Call(finally_entry_);
|
|
1359
|
-
return
|
|
1354
|
+
return previous_;
|
|
1360
1355
|
}
|
|
1361
1356
|
|
|
1362
1357
|
|
|
1363
|
-
|
|
1358
|
+
FullCodeGenerator::NestedStatement* FullCodeGenerator::TryCatch::Exit(
|
|
1359
|
+
int* stack_depth,
|
|
1360
|
+
int* context_length) {
|
|
1364
1361
|
// The macros used here must preserve the result register.
|
|
1365
|
-
__ Drop(stack_depth);
|
|
1362
|
+
__ Drop(*stack_depth);
|
|
1366
1363
|
__ PopTryHandler();
|
|
1367
|
-
|
|
1364
|
+
*stack_depth = 0;
|
|
1365
|
+
return previous_;
|
|
1366
|
+
}
|
|
1367
|
+
|
|
1368
|
+
|
|
1369
|
+
bool FullCodeGenerator::TryLiteralCompare(CompareOperation* compare,
|
|
1370
|
+
Label* if_true,
|
|
1371
|
+
Label* if_false,
|
|
1372
|
+
Label* fall_through) {
|
|
1373
|
+
Expression *expr;
|
|
1374
|
+
Handle<String> check;
|
|
1375
|
+
if (compare->IsLiteralCompareTypeof(&expr, &check)) {
|
|
1376
|
+
EmitLiteralCompareTypeof(expr, check, if_true, if_false, fall_through);
|
|
1377
|
+
return true;
|
|
1378
|
+
}
|
|
1379
|
+
|
|
1380
|
+
if (compare->IsLiteralCompareUndefined(&expr)) {
|
|
1381
|
+
EmitLiteralCompareUndefined(expr, if_true, if_false, fall_through);
|
|
1382
|
+
return true;
|
|
1383
|
+
}
|
|
1384
|
+
|
|
1385
|
+
return false;
|
|
1368
1386
|
}
|
|
1369
1387
|
|
|
1370
1388
|
|