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
|
@@ -193,6 +193,11 @@ class MarkCompactCollector {
|
|
|
193
193
|
inline bool is_code_flushing_enabled() const { return code_flusher_ != NULL; }
|
|
194
194
|
void EnableCodeFlushing(bool enable);
|
|
195
195
|
|
|
196
|
+
inline Object* encountered_weak_maps() { return encountered_weak_maps_; }
|
|
197
|
+
inline void set_encountered_weak_maps(Object* weak_map) {
|
|
198
|
+
encountered_weak_maps_ = weak_map;
|
|
199
|
+
}
|
|
200
|
+
|
|
196
201
|
private:
|
|
197
202
|
MarkCompactCollector();
|
|
198
203
|
~MarkCompactCollector();
|
|
@@ -306,6 +311,10 @@ class MarkCompactCollector {
|
|
|
306
311
|
// flag on the marking stack.
|
|
307
312
|
void RefillMarkingStack();
|
|
308
313
|
|
|
314
|
+
// After reachable maps have been marked process per context object
|
|
315
|
+
// literal map caches removing unmarked entries.
|
|
316
|
+
void ProcessMapCaches();
|
|
317
|
+
|
|
309
318
|
// Callback function for telling whether the object *p is an unmarked
|
|
310
319
|
// heap object.
|
|
311
320
|
static bool IsUnmarkedHeapObject(Object** p);
|
|
@@ -325,6 +334,16 @@ class MarkCompactCollector {
|
|
|
325
334
|
// We replace them with a null descriptor, with the same key.
|
|
326
335
|
void ClearNonLiveTransitions();
|
|
327
336
|
|
|
337
|
+
// Mark all values associated with reachable keys in weak maps encountered
|
|
338
|
+
// so far. This might push new object or even new weak maps onto the
|
|
339
|
+
// marking stack.
|
|
340
|
+
void ProcessWeakMaps();
|
|
341
|
+
|
|
342
|
+
// After all reachable objects have been marked those weak map entries
|
|
343
|
+
// with an unreachable key are removed from all encountered weak maps.
|
|
344
|
+
// The linked list of all encountered weak maps is destroyed.
|
|
345
|
+
void ClearWeakMaps();
|
|
346
|
+
|
|
328
347
|
// -----------------------------------------------------------------------
|
|
329
348
|
// Phase 2: Sweeping to clear mark bits and free non-live objects for
|
|
330
349
|
// a non-compacting collection, or else computing and encoding
|
|
@@ -495,6 +514,7 @@ class MarkCompactCollector {
|
|
|
495
514
|
Heap* heap_;
|
|
496
515
|
MarkingStack marking_stack_;
|
|
497
516
|
CodeFlusher* code_flusher_;
|
|
517
|
+
Object* encountered_weak_maps_;
|
|
498
518
|
|
|
499
519
|
friend class Heap;
|
|
500
520
|
friend class OverflowedObjectsScanner;
|
|
@@ -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:
|
|
@@ -57,11 +57,13 @@ function FormatString(format, message) {
|
|
|
57
57
|
for (var i = 0; i < format.length; i++) {
|
|
58
58
|
var str = format[i];
|
|
59
59
|
for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) {
|
|
60
|
-
if (
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
60
|
+
if (str == kReplacementMarkers[arg_num]) {
|
|
61
|
+
try {
|
|
62
|
+
str = ToDetailString(args[arg_num]);
|
|
63
|
+
} catch (e) {
|
|
64
|
+
str = "#<error>";
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
result += str;
|
|
@@ -100,7 +102,8 @@ function ToStringCheckErrorObject(obj) {
|
|
|
100
102
|
|
|
101
103
|
|
|
102
104
|
function ToDetailString(obj) {
|
|
103
|
-
if (obj != null && IS_OBJECT(obj) &&
|
|
105
|
+
if (obj != null && IS_OBJECT(obj) &&
|
|
106
|
+
obj.toString === $Object.prototype.toString) {
|
|
104
107
|
var constructor = obj.constructor;
|
|
105
108
|
if (!constructor) return ToStringCheckErrorObject(obj);
|
|
106
109
|
var constructorName = constructor.name;
|
|
@@ -148,6 +151,7 @@ function FormatMessage(message) {
|
|
|
148
151
|
unexpected_token_number: ["Unexpected number"],
|
|
149
152
|
unexpected_token_string: ["Unexpected string"],
|
|
150
153
|
unexpected_token_identifier: ["Unexpected identifier"],
|
|
154
|
+
unexpected_reserved: ["Unexpected reserved word"],
|
|
151
155
|
unexpected_strict_reserved: ["Unexpected strict mode reserved word"],
|
|
152
156
|
unexpected_eos: ["Unexpected end of input"],
|
|
153
157
|
malformed_regexp: ["Invalid regular expression: /", "%0", "/: ", "%1"],
|
|
@@ -190,15 +194,23 @@ function FormatMessage(message) {
|
|
|
190
194
|
proto_object_or_null: ["Object prototype may only be an Object or null"],
|
|
191
195
|
property_desc_object: ["Property description must be an object: ", "%0"],
|
|
192
196
|
redefine_disallowed: ["Cannot redefine property: ", "%0"],
|
|
193
|
-
define_disallowed: ["Cannot define property, object is not extensible
|
|
197
|
+
define_disallowed: ["Cannot define property:", "%0", ", object is not extensible."],
|
|
194
198
|
non_extensible_proto: ["%0", " is not extensible"],
|
|
199
|
+
handler_non_object: ["Proxy.", "%0", " called with non-object as handler"],
|
|
195
200
|
handler_trap_missing: ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
|
|
201
|
+
handler_trap_must_be_callable: ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
|
|
202
|
+
handler_returned_false: ["Proxy handler ", "%0", " returned false for '", "%1", "' trap"],
|
|
203
|
+
handler_returned_undefined: ["Proxy handler ", "%0", " returned undefined for '", "%1", "' trap"],
|
|
204
|
+
proxy_prop_not_configurable: ["Trap ", "%1", " of proxy handler ", "%0", " returned non-configurable descriptor for property ", "%2"],
|
|
205
|
+
proxy_non_object_prop_names: ["Trap ", "%1", " returned non-object ", "%0"],
|
|
206
|
+
proxy_repeated_prop_name: ["Trap ", "%1", " returned repeated property name ", "%2"],
|
|
207
|
+
invalid_weakmap_key: ["Invalid value used as weak map key"],
|
|
196
208
|
// RangeError
|
|
197
209
|
invalid_array_length: ["Invalid array length"],
|
|
198
210
|
stack_overflow: ["Maximum call stack size exceeded"],
|
|
199
211
|
// SyntaxError
|
|
200
212
|
unable_to_parse: ["Parse error"],
|
|
201
|
-
|
|
213
|
+
invalid_regexp_flags: ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
|
|
202
214
|
invalid_regexp: ["Invalid RegExp pattern /", "%0", "/"],
|
|
203
215
|
illegal_break: ["Illegal break statement"],
|
|
204
216
|
illegal_continue: ["Illegal continue statement"],
|
|
@@ -215,6 +227,7 @@ function FormatMessage(message) {
|
|
|
215
227
|
invalid_preparser_data: ["Invalid preparser data for function ", "%0"],
|
|
216
228
|
strict_mode_with: ["Strict mode code may not include a with statement"],
|
|
217
229
|
strict_catch_variable: ["Catch variable may not be eval or arguments in strict mode"],
|
|
230
|
+
too_many_arguments: ["Too many arguments in function call (only 32766 allowed)"],
|
|
218
231
|
too_many_parameters: ["Too many parameters in function definition (only 32766 allowed)"],
|
|
219
232
|
too_many_variables: ["Too many variables declared (only 32767 allowed)"],
|
|
220
233
|
strict_param_name: ["Parameter name eval or arguments is not allowed in strict mode"],
|
|
@@ -237,6 +250,7 @@ function FormatMessage(message) {
|
|
|
237
250
|
strict_cannot_assign: ["Cannot assign to read only '", "%0", "' in strict mode"],
|
|
238
251
|
strict_poison_pill: ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
|
|
239
252
|
strict_caller: ["Illegal access to a strict mode caller function."],
|
|
253
|
+
unprotected_let: ["Illegal let declaration in unprotected statement context."],
|
|
240
254
|
};
|
|
241
255
|
}
|
|
242
256
|
var message_type = %MessageGetType(message);
|
|
@@ -549,6 +563,7 @@ function SourceLocation(script, position, line, column, start, end) {
|
|
|
549
563
|
this.end = end;
|
|
550
564
|
}
|
|
551
565
|
|
|
566
|
+
SourceLocation.prototype.__proto__ = null;
|
|
552
567
|
|
|
553
568
|
const kLineLengthLimit = 78;
|
|
554
569
|
|
|
@@ -638,6 +653,7 @@ function SourceSlice(script, from_line, to_line, from_position, to_position) {
|
|
|
638
653
|
this.to_position = to_position;
|
|
639
654
|
}
|
|
640
655
|
|
|
656
|
+
SourceSlice.prototype.__proto__ = null;
|
|
641
657
|
|
|
642
658
|
/**
|
|
643
659
|
* Get the source text for a SourceSlice
|
|
@@ -679,18 +695,24 @@ function DefineOneShotAccessor(obj, name, fun) {
|
|
|
679
695
|
// can't rely on 'this' being the same as 'obj'.
|
|
680
696
|
var hasBeenSet = false;
|
|
681
697
|
var value;
|
|
682
|
-
|
|
698
|
+
function getter() {
|
|
683
699
|
if (hasBeenSet) {
|
|
684
700
|
return value;
|
|
685
701
|
}
|
|
686
702
|
hasBeenSet = true;
|
|
687
703
|
value = fun(obj);
|
|
688
704
|
return value;
|
|
689
|
-
}
|
|
690
|
-
|
|
705
|
+
}
|
|
706
|
+
function setter(v) {
|
|
691
707
|
hasBeenSet = true;
|
|
692
708
|
value = v;
|
|
693
|
-
}
|
|
709
|
+
}
|
|
710
|
+
var desc = { get: getter,
|
|
711
|
+
set: setter,
|
|
712
|
+
enumerable: false,
|
|
713
|
+
configurable: true };
|
|
714
|
+
desc = ToPropertyDescriptor(desc);
|
|
715
|
+
DefineOwnProperty(obj, name, desc, true);
|
|
694
716
|
}
|
|
695
717
|
|
|
696
718
|
function CallSite(receiver, fun, pos) {
|
|
@@ -699,23 +721,28 @@ function CallSite(receiver, fun, pos) {
|
|
|
699
721
|
this.pos = pos;
|
|
700
722
|
}
|
|
701
723
|
|
|
724
|
+
CallSite.prototype.__proto__ = null;
|
|
725
|
+
|
|
702
726
|
CallSite.prototype.getThis = function () {
|
|
703
727
|
return this.receiver;
|
|
704
728
|
};
|
|
705
729
|
|
|
706
730
|
CallSite.prototype.getTypeName = function () {
|
|
707
731
|
var constructor = this.receiver.constructor;
|
|
708
|
-
if (!constructor)
|
|
732
|
+
if (!constructor) {
|
|
709
733
|
return %_CallFunction(this.receiver, ObjectToString);
|
|
734
|
+
}
|
|
710
735
|
var constructorName = constructor.name;
|
|
711
|
-
if (!constructorName)
|
|
736
|
+
if (!constructorName) {
|
|
712
737
|
return %_CallFunction(this.receiver, ObjectToString);
|
|
738
|
+
}
|
|
713
739
|
return constructorName;
|
|
714
740
|
};
|
|
715
741
|
|
|
716
742
|
CallSite.prototype.isToplevel = function () {
|
|
717
|
-
if (this.receiver == null)
|
|
743
|
+
if (this.receiver == null) {
|
|
718
744
|
return true;
|
|
745
|
+
}
|
|
719
746
|
return IS_GLOBAL(this.receiver);
|
|
720
747
|
};
|
|
721
748
|
|
|
@@ -748,8 +775,9 @@ CallSite.prototype.getFunctionName = function () {
|
|
|
748
775
|
}
|
|
749
776
|
// Maybe this is an evaluation?
|
|
750
777
|
var script = %FunctionGetScript(this.fun);
|
|
751
|
-
if (script && script.compilation_type == COMPILATION_TYPE_EVAL)
|
|
778
|
+
if (script && script.compilation_type == COMPILATION_TYPE_EVAL) {
|
|
752
779
|
return "eval";
|
|
780
|
+
}
|
|
753
781
|
return null;
|
|
754
782
|
};
|
|
755
783
|
|
|
@@ -771,13 +799,15 @@ CallSite.prototype.getMethodName = function () {
|
|
|
771
799
|
this.receiver.__lookupSetter__(prop) === this.fun ||
|
|
772
800
|
(!this.receiver.__lookupGetter__(prop) && this.receiver[prop] === this.fun)) {
|
|
773
801
|
// If we find more than one match bail out to avoid confusion.
|
|
774
|
-
if (name)
|
|
802
|
+
if (name) {
|
|
775
803
|
return null;
|
|
804
|
+
}
|
|
776
805
|
name = prop;
|
|
777
806
|
}
|
|
778
807
|
}
|
|
779
|
-
if (name)
|
|
808
|
+
if (name) {
|
|
780
809
|
return name;
|
|
810
|
+
}
|
|
781
811
|
return null;
|
|
782
812
|
};
|
|
783
813
|
|
|
@@ -787,8 +817,9 @@ CallSite.prototype.getFileName = function () {
|
|
|
787
817
|
};
|
|
788
818
|
|
|
789
819
|
CallSite.prototype.getLineNumber = function () {
|
|
790
|
-
if (this.pos == -1)
|
|
820
|
+
if (this.pos == -1) {
|
|
791
821
|
return null;
|
|
822
|
+
}
|
|
792
823
|
var script = %FunctionGetScript(this.fun);
|
|
793
824
|
var location = null;
|
|
794
825
|
if (script) {
|
|
@@ -798,8 +829,9 @@ CallSite.prototype.getLineNumber = function () {
|
|
|
798
829
|
};
|
|
799
830
|
|
|
800
831
|
CallSite.prototype.getColumnNumber = function () {
|
|
801
|
-
if (this.pos == -1)
|
|
832
|
+
if (this.pos == -1) {
|
|
802
833
|
return null;
|
|
834
|
+
}
|
|
803
835
|
var script = %FunctionGetScript(this.fun);
|
|
804
836
|
var location = null;
|
|
805
837
|
if (script) {
|
|
@@ -819,15 +851,17 @@ CallSite.prototype.getPosition = function () {
|
|
|
819
851
|
|
|
820
852
|
CallSite.prototype.isConstructor = function () {
|
|
821
853
|
var constructor = this.receiver ? this.receiver.constructor : null;
|
|
822
|
-
if (!constructor)
|
|
854
|
+
if (!constructor) {
|
|
823
855
|
return false;
|
|
856
|
+
}
|
|
824
857
|
return this.fun === constructor;
|
|
825
858
|
};
|
|
826
859
|
|
|
827
860
|
function FormatEvalOrigin(script) {
|
|
828
861
|
var sourceURL = script.nameOrSourceURL();
|
|
829
|
-
if (sourceURL)
|
|
862
|
+
if (sourceURL) {
|
|
830
863
|
return sourceURL;
|
|
864
|
+
}
|
|
831
865
|
|
|
832
866
|
var eval_origin = "eval at ";
|
|
833
867
|
if (script.eval_from_function_name) {
|
|
@@ -994,15 +1028,15 @@ function DefineError(f) {
|
|
|
994
1028
|
// overwriting allows leaks of error objects between script blocks
|
|
995
1029
|
// in the same context in a browser setting. Therefore we fix the
|
|
996
1030
|
// name.
|
|
997
|
-
%SetProperty(f.prototype, "name", name,
|
|
1031
|
+
%SetProperty(f.prototype, "name", name, DONT_ENUM | DONT_DELETE | READ_ONLY);
|
|
998
1032
|
%SetCode(f, function(m) {
|
|
999
1033
|
if (%_IsConstructCall()) {
|
|
1000
1034
|
// Define all the expected properties directly on the error
|
|
1001
1035
|
// object. This avoids going through getters and setters defined
|
|
1002
1036
|
// on prototype objects.
|
|
1003
|
-
%IgnoreAttributesAndSetProperty(this, 'stack', void 0);
|
|
1004
|
-
%IgnoreAttributesAndSetProperty(this, 'arguments', void 0);
|
|
1005
|
-
%IgnoreAttributesAndSetProperty(this, 'type', void 0);
|
|
1037
|
+
%IgnoreAttributesAndSetProperty(this, 'stack', void 0, DONT_ENUM);
|
|
1038
|
+
%IgnoreAttributesAndSetProperty(this, 'arguments', void 0, DONT_ENUM);
|
|
1039
|
+
%IgnoreAttributesAndSetProperty(this, 'type', void 0, DONT_ENUM);
|
|
1006
1040
|
if (m === kAddMessageAccessorsMarker) {
|
|
1007
1041
|
// DefineOneShotAccessor always inserts a message property and
|
|
1008
1042
|
// ignores setters.
|
|
@@ -1010,7 +1044,10 @@ function DefineError(f) {
|
|
|
1010
1044
|
return FormatMessage(%NewMessageObject(obj.type, obj.arguments));
|
|
1011
1045
|
});
|
|
1012
1046
|
} else if (!IS_UNDEFINED(m)) {
|
|
1013
|
-
%IgnoreAttributesAndSetProperty(this,
|
|
1047
|
+
%IgnoreAttributesAndSetProperty(this,
|
|
1048
|
+
'message',
|
|
1049
|
+
ToString(m),
|
|
1050
|
+
DONT_ENUM);
|
|
1014
1051
|
}
|
|
1015
1052
|
captureStackTrace(this, f);
|
|
1016
1053
|
} else {
|
|
@@ -1022,8 +1059,9 @@ function DefineError(f) {
|
|
|
1022
1059
|
function captureStackTrace(obj, cons_opt) {
|
|
1023
1060
|
var stackTraceLimit = $Error.stackTraceLimit;
|
|
1024
1061
|
if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
|
|
1025
|
-
if (stackTraceLimit < 0 || stackTraceLimit > 10000)
|
|
1062
|
+
if (stackTraceLimit < 0 || stackTraceLimit > 10000) {
|
|
1026
1063
|
stackTraceLimit = 10000;
|
|
1064
|
+
}
|
|
1027
1065
|
var raw_stack = %CollectStackTrace(cons_opt
|
|
1028
1066
|
? cons_opt
|
|
1029
1067
|
: captureStackTrace, stackTraceLimit);
|
|
@@ -1034,18 +1072,32 @@ function captureStackTrace(obj, cons_opt) {
|
|
|
1034
1072
|
|
|
1035
1073
|
$Math.__proto__ = global.Object.prototype;
|
|
1036
1074
|
|
|
1037
|
-
DefineError
|
|
1038
|
-
|
|
1039
|
-
DefineError(function
|
|
1040
|
-
DefineError(function
|
|
1041
|
-
DefineError(function
|
|
1042
|
-
DefineError(function
|
|
1043
|
-
DefineError(function
|
|
1075
|
+
// DefineError is a native function. Use explicit receiver. Otherwise
|
|
1076
|
+
// the receiver will be 'undefined'.
|
|
1077
|
+
this.DefineError(function Error() { });
|
|
1078
|
+
this.DefineError(function TypeError() { });
|
|
1079
|
+
this.DefineError(function RangeError() { });
|
|
1080
|
+
this.DefineError(function SyntaxError() { });
|
|
1081
|
+
this.DefineError(function ReferenceError() { });
|
|
1082
|
+
this.DefineError(function EvalError() { });
|
|
1083
|
+
this.DefineError(function URIError() { });
|
|
1044
1084
|
|
|
1045
1085
|
$Error.captureStackTrace = captureStackTrace;
|
|
1046
1086
|
|
|
1047
1087
|
// Setup extra properties of the Error.prototype object.
|
|
1048
|
-
|
|
1088
|
+
function setErrorMessage() {
|
|
1089
|
+
var desc = {value: '',
|
|
1090
|
+
enumerable: false,
|
|
1091
|
+
configurable: true,
|
|
1092
|
+
writable: true };
|
|
1093
|
+
DefineOwnProperty($Error.prototype,
|
|
1094
|
+
'message',
|
|
1095
|
+
ToPropertyDescriptor(desc),
|
|
1096
|
+
true);
|
|
1097
|
+
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
setErrorMessage();
|
|
1049
1101
|
|
|
1050
1102
|
// Global list of error objects visited during errorToString. This is
|
|
1051
1103
|
// used to detect cycles in error toString formatting.
|
|
@@ -1083,8 +1135,10 @@ function errorToString() {
|
|
|
1083
1135
|
} catch(e) {
|
|
1084
1136
|
// If this error message was encountered already return the empty
|
|
1085
1137
|
// string for it instead of recursively formatting it.
|
|
1086
|
-
if (isCyclicErrorMarker(e))
|
|
1087
|
-
|
|
1138
|
+
if (isCyclicErrorMarker(e)) {
|
|
1139
|
+
return '';
|
|
1140
|
+
}
|
|
1141
|
+
throw e;
|
|
1088
1142
|
}
|
|
1089
1143
|
}
|
|
1090
1144
|
|
|
@@ -83,8 +83,12 @@ bool Operand::is_reg() const {
|
|
|
83
83
|
// RelocInfo.
|
|
84
84
|
|
|
85
85
|
void RelocInfo::apply(intptr_t delta) {
|
|
86
|
-
|
|
87
|
-
|
|
86
|
+
if (IsInternalReference(rmode_)) {
|
|
87
|
+
// Absolute code pointer inside code object moves with the code object.
|
|
88
|
+
byte* p = reinterpret_cast<byte*>(pc_);
|
|
89
|
+
int count = Assembler::RelocateInternalReference(p, delta);
|
|
90
|
+
CPU::FlushICache(p, count * sizeof(uint32_t));
|
|
91
|
+
}
|
|
88
92
|
}
|
|
89
93
|
|
|
90
94
|
|
|
@@ -300,7 +304,9 @@ void Assembler::CheckTrampolinePoolQuick() {
|
|
|
300
304
|
|
|
301
305
|
|
|
302
306
|
void Assembler::emit(Instr x) {
|
|
303
|
-
|
|
307
|
+
if (!is_buffer_growth_blocked()) {
|
|
308
|
+
CheckBuffer();
|
|
309
|
+
}
|
|
304
310
|
*reinterpret_cast<Instr*>(pc_) = x;
|
|
305
311
|
pc_ += kInstrSize;
|
|
306
312
|
CheckTrampolinePoolQuick();
|
|
@@ -140,7 +140,7 @@ Register ToRegister(int num) {
|
|
|
140
140
|
// -----------------------------------------------------------------------------
|
|
141
141
|
// Implementation of RelocInfo.
|
|
142
142
|
|
|
143
|
-
const int RelocInfo::kApplyMask =
|
|
143
|
+
const int RelocInfo::kApplyMask = 1 << RelocInfo::INTERNAL_REFERENCE;
|
|
144
144
|
|
|
145
145
|
|
|
146
146
|
bool RelocInfo::IsCodedSpecially() {
|
|
@@ -275,11 +275,17 @@ Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size)
|
|
|
275
275
|
last_trampoline_pool_end_ = 0;
|
|
276
276
|
no_trampoline_pool_before_ = 0;
|
|
277
277
|
trampoline_pool_blocked_nesting_ = 0;
|
|
278
|
-
|
|
278
|
+
// We leave space (16 * kTrampolineSlotsSize)
|
|
279
|
+
// for BlockTrampolinePoolScope buffer.
|
|
280
|
+
next_buffer_check_ = kMaxBranchOffset - kTrampolineSlotsSize * 16;
|
|
279
281
|
internal_trampoline_exception_ = false;
|
|
280
282
|
last_bound_pos_ = 0;
|
|
281
283
|
|
|
282
|
-
|
|
284
|
+
trampoline_emitted_ = false;
|
|
285
|
+
unbound_labels_count_ = 0;
|
|
286
|
+
block_buffer_growth_ = false;
|
|
287
|
+
|
|
288
|
+
ClearRecordedAstId();
|
|
283
289
|
}
|
|
284
290
|
|
|
285
291
|
|
|
@@ -386,6 +392,16 @@ uint32_t Assembler::GetOpcodeField(Instr instr) {
|
|
|
386
392
|
}
|
|
387
393
|
|
|
388
394
|
|
|
395
|
+
uint32_t Assembler::GetFunction(Instr instr) {
|
|
396
|
+
return (instr & kFunctionFieldMask) >> kFunctionShift;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
uint32_t Assembler::GetFunctionField(Instr instr) {
|
|
401
|
+
return instr & kFunctionFieldMask;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
|
|
389
405
|
uint32_t Assembler::GetImmediate16(Instr instr) {
|
|
390
406
|
return instr & kImm16Mask;
|
|
391
407
|
}
|
|
@@ -444,6 +460,8 @@ bool Assembler::IsLwRegFpNegOffset(Instr instr) {
|
|
|
444
460
|
// code is conv to an 18-bit value addressing bytes, hence the -4 value.
|
|
445
461
|
|
|
446
462
|
const int kEndOfChain = -4;
|
|
463
|
+
// Determines the end of the Jump chain (a subset of the label link chain).
|
|
464
|
+
const int kEndOfJumpChain = 0;
|
|
447
465
|
|
|
448
466
|
|
|
449
467
|
bool Assembler::IsBranch(Instr instr) {
|
|
@@ -477,6 +495,39 @@ bool Assembler::IsBne(Instr instr) {
|
|
|
477
495
|
}
|
|
478
496
|
|
|
479
497
|
|
|
498
|
+
bool Assembler::IsJump(Instr instr) {
|
|
499
|
+
uint32_t opcode = GetOpcodeField(instr);
|
|
500
|
+
uint32_t rt_field = GetRtField(instr);
|
|
501
|
+
uint32_t rd_field = GetRdField(instr);
|
|
502
|
+
uint32_t function_field = GetFunctionField(instr);
|
|
503
|
+
// Checks if the instruction is a jump.
|
|
504
|
+
return opcode == J || opcode == JAL ||
|
|
505
|
+
(opcode == SPECIAL && rt_field == 0 &&
|
|
506
|
+
((function_field == JALR) || (rd_field == 0 && (function_field == JR))));
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
|
|
510
|
+
bool Assembler::IsJ(Instr instr) {
|
|
511
|
+
uint32_t opcode = GetOpcodeField(instr);
|
|
512
|
+
// Checks if the instruction is a jump.
|
|
513
|
+
return opcode == J;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
bool Assembler::IsLui(Instr instr) {
|
|
518
|
+
uint32_t opcode = GetOpcodeField(instr);
|
|
519
|
+
// Checks if the instruction is a load upper immediate.
|
|
520
|
+
return opcode == LUI;
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
bool Assembler::IsOri(Instr instr) {
|
|
525
|
+
uint32_t opcode = GetOpcodeField(instr);
|
|
526
|
+
// Checks if the instruction is a load upper immediate.
|
|
527
|
+
return opcode == ORI;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
|
|
480
531
|
bool Assembler::IsNop(Instr instr, unsigned int type) {
|
|
481
532
|
// See Assembler::nop(type).
|
|
482
533
|
ASSERT(type < 32);
|
|
@@ -564,17 +615,47 @@ int Assembler::target_at(int32_t pos) {
|
|
|
564
615
|
return (imm18 + pos);
|
|
565
616
|
}
|
|
566
617
|
}
|
|
567
|
-
// Check we have a branch instruction.
|
|
568
|
-
ASSERT(IsBranch(instr));
|
|
618
|
+
// Check we have a branch or jump instruction.
|
|
619
|
+
ASSERT(IsBranch(instr) || IsJ(instr) || IsLui(instr));
|
|
569
620
|
// Do NOT change this to <<2. We rely on arithmetic shifts here, assuming
|
|
570
621
|
// the compiler uses arithmectic shifts for signed integers.
|
|
571
|
-
|
|
622
|
+
if (IsBranch(instr)) {
|
|
623
|
+
int32_t imm18 = ((instr & static_cast<int32_t>(kImm16Mask)) << 16) >> 14;
|
|
572
624
|
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
625
|
+
if (imm18 == kEndOfChain) {
|
|
626
|
+
// EndOfChain sentinel is returned directly, not relative to pc or pos.
|
|
627
|
+
return kEndOfChain;
|
|
628
|
+
} else {
|
|
629
|
+
return pos + kBranchPCOffset + imm18;
|
|
630
|
+
}
|
|
631
|
+
} else if (IsLui(instr)) {
|
|
632
|
+
Instr instr_lui = instr_at(pos + 0 * Assembler::kInstrSize);
|
|
633
|
+
Instr instr_ori = instr_at(pos + 1 * Assembler::kInstrSize);
|
|
634
|
+
ASSERT(IsOri(instr_ori));
|
|
635
|
+
int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift;
|
|
636
|
+
imm |= (instr_ori & static_cast<int32_t>(kImm16Mask));
|
|
637
|
+
|
|
638
|
+
if (imm == kEndOfJumpChain) {
|
|
639
|
+
// EndOfChain sentinel is returned directly, not relative to pc or pos.
|
|
640
|
+
return kEndOfChain;
|
|
641
|
+
} else {
|
|
642
|
+
uint32_t instr_address = reinterpret_cast<int32_t>(buffer_ + pos);
|
|
643
|
+
int32_t delta = instr_address - imm;
|
|
644
|
+
ASSERT(pos > delta);
|
|
645
|
+
return pos - delta;
|
|
646
|
+
}
|
|
576
647
|
} else {
|
|
577
|
-
|
|
648
|
+
int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2;
|
|
649
|
+
if (imm28 == kEndOfJumpChain) {
|
|
650
|
+
// EndOfChain sentinel is returned directly, not relative to pc or pos.
|
|
651
|
+
return kEndOfChain;
|
|
652
|
+
} else {
|
|
653
|
+
uint32_t instr_address = reinterpret_cast<int32_t>(buffer_ + pos);
|
|
654
|
+
instr_address &= kImm28Mask;
|
|
655
|
+
int32_t delta = instr_address - imm28;
|
|
656
|
+
ASSERT(pos > delta);
|
|
657
|
+
return pos - delta;
|
|
658
|
+
}
|
|
578
659
|
}
|
|
579
660
|
}
|
|
580
661
|
|
|
@@ -589,15 +670,41 @@ void Assembler::target_at_put(int32_t pos, int32_t target_pos) {
|
|
|
589
670
|
return;
|
|
590
671
|
}
|
|
591
672
|
|
|
592
|
-
ASSERT(IsBranch(instr));
|
|
593
|
-
|
|
594
|
-
|
|
673
|
+
ASSERT(IsBranch(instr) || IsJ(instr) || IsLui(instr));
|
|
674
|
+
if (IsBranch(instr)) {
|
|
675
|
+
int32_t imm18 = target_pos - (pos + kBranchPCOffset);
|
|
676
|
+
ASSERT((imm18 & 3) == 0);
|
|
677
|
+
|
|
678
|
+
instr &= ~kImm16Mask;
|
|
679
|
+
int32_t imm16 = imm18 >> 2;
|
|
680
|
+
ASSERT(is_int16(imm16));
|
|
681
|
+
|
|
682
|
+
instr_at_put(pos, instr | (imm16 & kImm16Mask));
|
|
683
|
+
} else if (IsLui(instr)) {
|
|
684
|
+
Instr instr_lui = instr_at(pos + 0 * Assembler::kInstrSize);
|
|
685
|
+
Instr instr_ori = instr_at(pos + 1 * Assembler::kInstrSize);
|
|
686
|
+
ASSERT(IsOri(instr_ori));
|
|
687
|
+
uint32_t imm = (uint32_t)buffer_ + target_pos;
|
|
688
|
+
ASSERT((imm & 3) == 0);
|
|
689
|
+
|
|
690
|
+
instr_lui &= ~kImm16Mask;
|
|
691
|
+
instr_ori &= ~kImm16Mask;
|
|
692
|
+
|
|
693
|
+
instr_at_put(pos + 0 * Assembler::kInstrSize,
|
|
694
|
+
instr_lui | ((imm & kHiMask) >> kLuiShift));
|
|
695
|
+
instr_at_put(pos + 1 * Assembler::kInstrSize,
|
|
696
|
+
instr_ori | (imm & kImm16Mask));
|
|
697
|
+
} else {
|
|
698
|
+
uint32_t imm28 = (uint32_t)buffer_ + target_pos;
|
|
699
|
+
imm28 &= kImm28Mask;
|
|
700
|
+
ASSERT((imm28 & 3) == 0);
|
|
595
701
|
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
702
|
+
instr &= ~kImm26Mask;
|
|
703
|
+
uint32_t imm26 = imm28 >> 2;
|
|
704
|
+
ASSERT(is_uint26(imm26));
|
|
599
705
|
|
|
600
|
-
|
|
706
|
+
instr_at_put(pos, instr | (imm26 & kImm26Mask));
|
|
707
|
+
}
|
|
601
708
|
}
|
|
602
709
|
|
|
603
710
|
|
|
@@ -627,36 +734,33 @@ void Assembler::print(Label* L) {
|
|
|
627
734
|
|
|
628
735
|
void Assembler::bind_to(Label* L, int pos) {
|
|
629
736
|
ASSERT(0 <= pos && pos <= pc_offset()); // Must have valid binding position.
|
|
737
|
+
int32_t trampoline_pos = kInvalidSlotPos;
|
|
738
|
+
if (L->is_linked() && !trampoline_emitted_) {
|
|
739
|
+
unbound_labels_count_--;
|
|
740
|
+
next_buffer_check_ += kTrampolineSlotsSize;
|
|
741
|
+
}
|
|
742
|
+
|
|
630
743
|
while (L->is_linked()) {
|
|
631
744
|
int32_t fixup_pos = L->pos();
|
|
632
745
|
int32_t dist = pos - fixup_pos;
|
|
633
746
|
next(L); // Call next before overwriting link with target at fixup_pos.
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
if (
|
|
638
|
-
|
|
639
|
-
|
|
747
|
+
Instr instr = instr_at(fixup_pos);
|
|
748
|
+
if (IsBranch(instr)) {
|
|
749
|
+
if (dist > kMaxBranchOffset) {
|
|
750
|
+
if (trampoline_pos == kInvalidSlotPos) {
|
|
751
|
+
trampoline_pos = get_trampoline_entry(fixup_pos);
|
|
752
|
+
CHECK(trampoline_pos != kInvalidSlotPos);
|
|
640
753
|
}
|
|
641
754
|
ASSERT((trampoline_pos - fixup_pos) <= kMaxBranchOffset);
|
|
642
755
|
target_at_put(fixup_pos, trampoline_pos);
|
|
643
756
|
fixup_pos = trampoline_pos;
|
|
644
757
|
dist = pos - fixup_pos;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
return;
|
|
652
|
-
}
|
|
653
|
-
ASSERT((trampoline_pos - fixup_pos) >= -kMaxBranchOffset);
|
|
654
|
-
target_at_put(fixup_pos, trampoline_pos);
|
|
655
|
-
fixup_pos = trampoline_pos;
|
|
656
|
-
dist = pos - fixup_pos;
|
|
657
|
-
} while (dist < -kMaxBranchOffset);
|
|
658
|
-
};
|
|
659
|
-
target_at_put(fixup_pos, pos);
|
|
758
|
+
}
|
|
759
|
+
target_at_put(fixup_pos, pos);
|
|
760
|
+
} else {
|
|
761
|
+
ASSERT(IsJ(instr) || IsLui(instr));
|
|
762
|
+
target_at_put(fixup_pos, pos);
|
|
763
|
+
}
|
|
660
764
|
}
|
|
661
765
|
L->bind_to(pos);
|
|
662
766
|
|
|
@@ -667,27 +771,6 @@ void Assembler::bind_to(Label* L, int pos) {
|
|
|
667
771
|
}
|
|
668
772
|
|
|
669
773
|
|
|
670
|
-
void Assembler::link_to(Label* L, Label* appendix) {
|
|
671
|
-
if (appendix->is_linked()) {
|
|
672
|
-
if (L->is_linked()) {
|
|
673
|
-
// Append appendix to L's list.
|
|
674
|
-
int fixup_pos;
|
|
675
|
-
int link = L->pos();
|
|
676
|
-
do {
|
|
677
|
-
fixup_pos = link;
|
|
678
|
-
link = target_at(fixup_pos);
|
|
679
|
-
} while (link > 0);
|
|
680
|
-
ASSERT(link == kEndOfChain);
|
|
681
|
-
target_at_put(fixup_pos, appendix->pos());
|
|
682
|
-
} else {
|
|
683
|
-
// L is empty, simply use appendix.
|
|
684
|
-
*L = *appendix;
|
|
685
|
-
}
|
|
686
|
-
}
|
|
687
|
-
appendix->Unuse(); // Appendix should not be used anymore.
|
|
688
|
-
}
|
|
689
|
-
|
|
690
|
-
|
|
691
774
|
void Assembler::bind(Label* L) {
|
|
692
775
|
ASSERT(!L->is_bound()); // Label can only be bound once.
|
|
693
776
|
bind_to(L, pc_offset());
|
|
@@ -697,14 +780,20 @@ void Assembler::bind(Label* L) {
|
|
|
697
780
|
void Assembler::next(Label* L) {
|
|
698
781
|
ASSERT(L->is_linked());
|
|
699
782
|
int link = target_at(L->pos());
|
|
700
|
-
ASSERT(link > 0 || link == kEndOfChain);
|
|
701
783
|
if (link == kEndOfChain) {
|
|
702
784
|
L->Unuse();
|
|
703
|
-
} else
|
|
785
|
+
} else {
|
|
786
|
+
ASSERT(link >= 0);
|
|
704
787
|
L->link_to(link);
|
|
705
788
|
}
|
|
706
789
|
}
|
|
707
790
|
|
|
791
|
+
bool Assembler::is_near(Label* L) {
|
|
792
|
+
if (L->is_bound()) {
|
|
793
|
+
return ((pc_offset() - L->pos()) < kMaxBranchOffset - 4 * kInstrSize);
|
|
794
|
+
}
|
|
795
|
+
return false;
|
|
796
|
+
}
|
|
708
797
|
|
|
709
798
|
// We have to use a temporary register for things that can be relocated even
|
|
710
799
|
// if they can be encoded in the MIPS's 16 bits of immediate-offset instruction
|
|
@@ -817,7 +906,6 @@ void Assembler::GenInstrImmediate(Opcode opcode,
|
|
|
817
906
|
}
|
|
818
907
|
|
|
819
908
|
|
|
820
|
-
// Registers are in the order of the instruction encoding, from left to right.
|
|
821
909
|
void Assembler::GenInstrJump(Opcode opcode,
|
|
822
910
|
uint32_t address) {
|
|
823
911
|
BlockTrampolinePoolScope block_trampoline_pool(this);
|
|
@@ -828,119 +916,60 @@ void Assembler::GenInstrJump(Opcode opcode,
|
|
|
828
916
|
}
|
|
829
917
|
|
|
830
918
|
|
|
831
|
-
// Returns the next free
|
|
832
|
-
int32_t Assembler::
|
|
833
|
-
|
|
834
|
-
int32_t label_entry = 0;
|
|
835
|
-
ASSERT(trampoline_count > 0);
|
|
919
|
+
// Returns the next free trampoline entry.
|
|
920
|
+
int32_t Assembler::get_trampoline_entry(int32_t pos) {
|
|
921
|
+
int32_t trampoline_entry = kInvalidSlotPos;
|
|
836
922
|
|
|
837
|
-
if (
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
label_entry = trampolines_[i].take_label();
|
|
841
|
-
break;
|
|
842
|
-
}
|
|
923
|
+
if (!internal_trampoline_exception_) {
|
|
924
|
+
if (trampoline_.start() > pos) {
|
|
925
|
+
trampoline_entry = trampoline_.take_slot();
|
|
843
926
|
}
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
label_entry = trampolines_[i].take_label();
|
|
848
|
-
break;
|
|
849
|
-
}
|
|
927
|
+
|
|
928
|
+
if (kInvalidSlotPos == trampoline_entry) {
|
|
929
|
+
internal_trampoline_exception_ = true;
|
|
850
930
|
}
|
|
851
931
|
}
|
|
852
|
-
return
|
|
932
|
+
return trampoline_entry;
|
|
853
933
|
}
|
|
854
934
|
|
|
855
935
|
|
|
856
|
-
|
|
857
|
-
int32_t
|
|
858
|
-
int trampoline_count = trampolines_.length();
|
|
859
|
-
int32_t trampoline_entry = kInvalidSlotPos;
|
|
860
|
-
ASSERT(trampoline_count > 0);
|
|
936
|
+
uint32_t Assembler::jump_address(Label* L) {
|
|
937
|
+
int32_t target_pos;
|
|
861
938
|
|
|
862
|
-
if (
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
for (int i = trampoline_count-1; i >= 0; i--) {
|
|
872
|
-
if (trampolines_[i].end() < pos) {
|
|
873
|
-
trampoline_entry = trampolines_[i].take_slot();
|
|
874
|
-
break;
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
if (kInvalidSlotPos == trampoline_entry) {
|
|
879
|
-
internal_trampoline_exception_ = true;
|
|
939
|
+
if (L->is_bound()) {
|
|
940
|
+
target_pos = L->pos();
|
|
941
|
+
} else {
|
|
942
|
+
if (L->is_linked()) {
|
|
943
|
+
target_pos = L->pos(); // L's link.
|
|
944
|
+
L->link_to(pc_offset());
|
|
945
|
+
} else {
|
|
946
|
+
L->link_to(pc_offset());
|
|
947
|
+
return kEndOfJumpChain;
|
|
880
948
|
}
|
|
881
949
|
}
|
|
882
|
-
|
|
950
|
+
|
|
951
|
+
uint32_t imm = (uint32_t)buffer_ + target_pos;
|
|
952
|
+
ASSERT((imm & 3) == 0);
|
|
953
|
+
|
|
954
|
+
return imm;
|
|
883
955
|
}
|
|
884
956
|
|
|
885
957
|
|
|
886
958
|
int32_t Assembler::branch_offset(Label* L, bool jump_elimination_allowed) {
|
|
887
959
|
int32_t target_pos;
|
|
888
|
-
int32_t pc_offset_v = pc_offset();
|
|
889
960
|
|
|
890
961
|
if (L->is_bound()) {
|
|
891
962
|
target_pos = L->pos();
|
|
892
|
-
int32_t dist = pc_offset_v - target_pos;
|
|
893
|
-
if (dist > kMaxBranchOffset) {
|
|
894
|
-
do {
|
|
895
|
-
int32_t trampoline_pos = get_trampoline_entry(target_pos);
|
|
896
|
-
if (kInvalidSlotPos == trampoline_pos) {
|
|
897
|
-
// Internal error.
|
|
898
|
-
return 0;
|
|
899
|
-
}
|
|
900
|
-
ASSERT((trampoline_pos - target_pos) > 0);
|
|
901
|
-
ASSERT((trampoline_pos - target_pos) <= kMaxBranchOffset);
|
|
902
|
-
target_at_put(trampoline_pos, target_pos);
|
|
903
|
-
target_pos = trampoline_pos;
|
|
904
|
-
dist = pc_offset_v - target_pos;
|
|
905
|
-
} while (dist > kMaxBranchOffset);
|
|
906
|
-
} else if (dist < -kMaxBranchOffset) {
|
|
907
|
-
do {
|
|
908
|
-
int32_t trampoline_pos = get_trampoline_entry(target_pos, false);
|
|
909
|
-
if (kInvalidSlotPos == trampoline_pos) {
|
|
910
|
-
// Internal error.
|
|
911
|
-
return 0;
|
|
912
|
-
}
|
|
913
|
-
ASSERT((target_pos - trampoline_pos) > 0);
|
|
914
|
-
ASSERT((target_pos - trampoline_pos) <= kMaxBranchOffset);
|
|
915
|
-
target_at_put(trampoline_pos, target_pos);
|
|
916
|
-
target_pos = trampoline_pos;
|
|
917
|
-
dist = pc_offset_v - target_pos;
|
|
918
|
-
} while (dist < -kMaxBranchOffset);
|
|
919
|
-
}
|
|
920
963
|
} else {
|
|
921
964
|
if (L->is_linked()) {
|
|
922
|
-
target_pos = L->pos();
|
|
923
|
-
int32_t dist = pc_offset_v - target_pos;
|
|
924
|
-
if (dist > kMaxBranchOffset) {
|
|
925
|
-
do {
|
|
926
|
-
int32_t label_pos = get_label_entry(target_pos);
|
|
927
|
-
ASSERT((label_pos - target_pos) < kMaxBranchOffset);
|
|
928
|
-
label_at_put(L, label_pos);
|
|
929
|
-
target_pos = label_pos;
|
|
930
|
-
dist = pc_offset_v - target_pos;
|
|
931
|
-
} while (dist > kMaxBranchOffset);
|
|
932
|
-
} else if (dist < -kMaxBranchOffset) {
|
|
933
|
-
do {
|
|
934
|
-
int32_t label_pos = get_label_entry(target_pos, false);
|
|
935
|
-
ASSERT((label_pos - target_pos) > -kMaxBranchOffset);
|
|
936
|
-
label_at_put(L, label_pos);
|
|
937
|
-
target_pos = label_pos;
|
|
938
|
-
dist = pc_offset_v - target_pos;
|
|
939
|
-
} while (dist < -kMaxBranchOffset);
|
|
940
|
-
}
|
|
965
|
+
target_pos = L->pos();
|
|
941
966
|
L->link_to(pc_offset());
|
|
942
967
|
} else {
|
|
943
968
|
L->link_to(pc_offset());
|
|
969
|
+
if (!trampoline_emitted_) {
|
|
970
|
+
unbound_labels_count_++;
|
|
971
|
+
next_buffer_check_ -= kTrampolineSlotsSize;
|
|
972
|
+
}
|
|
944
973
|
return kEndOfChain;
|
|
945
974
|
}
|
|
946
975
|
}
|
|
@@ -969,6 +998,10 @@ void Assembler::label_at_put(Label* L, int at_offset) {
|
|
|
969
998
|
} else {
|
|
970
999
|
target_pos = kEndOfChain;
|
|
971
1000
|
instr_at_put(at_offset, 0);
|
|
1001
|
+
if (!trampoline_emitted_) {
|
|
1002
|
+
unbound_labels_count_++;
|
|
1003
|
+
next_buffer_check_ -= kTrampolineSlotsSize;
|
|
1004
|
+
}
|
|
972
1005
|
}
|
|
973
1006
|
L->link_to(at_offset);
|
|
974
1007
|
}
|
|
@@ -1336,13 +1369,37 @@ void Assembler::lui(Register rd, int32_t j) {
|
|
|
1336
1369
|
//-------------Misc-instructions--------------
|
|
1337
1370
|
|
|
1338
1371
|
// Break / Trap instructions.
|
|
1339
|
-
void Assembler::break_(uint32_t code) {
|
|
1372
|
+
void Assembler::break_(uint32_t code, bool break_as_stop) {
|
|
1340
1373
|
ASSERT((code & ~0xfffff) == 0);
|
|
1374
|
+
// We need to invalidate breaks that could be stops as well because the
|
|
1375
|
+
// simulator expects a char pointer after the stop instruction.
|
|
1376
|
+
// See constants-mips.h for explanation.
|
|
1377
|
+
ASSERT((break_as_stop &&
|
|
1378
|
+
code <= kMaxStopCode &&
|
|
1379
|
+
code > kMaxWatchpointCode) ||
|
|
1380
|
+
(!break_as_stop &&
|
|
1381
|
+
(code > kMaxStopCode ||
|
|
1382
|
+
code <= kMaxWatchpointCode)));
|
|
1341
1383
|
Instr break_instr = SPECIAL | BREAK | (code << 6);
|
|
1342
1384
|
emit(break_instr);
|
|
1343
1385
|
}
|
|
1344
1386
|
|
|
1345
1387
|
|
|
1388
|
+
void Assembler::stop(const char* msg, uint32_t code) {
|
|
1389
|
+
ASSERT(code > kMaxWatchpointCode);
|
|
1390
|
+
ASSERT(code <= kMaxStopCode);
|
|
1391
|
+
#if defined(V8_HOST_ARCH_MIPS)
|
|
1392
|
+
break_(0x54321);
|
|
1393
|
+
#else // V8_HOST_ARCH_MIPS
|
|
1394
|
+
BlockTrampolinePoolFor(2);
|
|
1395
|
+
// The Simulator will handle the stop instruction and get the message address.
|
|
1396
|
+
// On MIPS stop() is just a special kind of break_().
|
|
1397
|
+
break_(code, true);
|
|
1398
|
+
emit(reinterpret_cast<Instr>(msg));
|
|
1399
|
+
#endif
|
|
1400
|
+
}
|
|
1401
|
+
|
|
1402
|
+
|
|
1346
1403
|
void Assembler::tge(Register rs, Register rt, uint16_t code) {
|
|
1347
1404
|
ASSERT(is_uint10(code));
|
|
1348
1405
|
Instr instr = SPECIAL | TGE | rs.code() << kRsShift
|
|
@@ -1767,6 +1824,48 @@ void Assembler::RecordComment(const char* msg) {
|
|
|
1767
1824
|
}
|
|
1768
1825
|
|
|
1769
1826
|
|
|
1827
|
+
int Assembler::RelocateInternalReference(byte* pc, intptr_t pc_delta) {
|
|
1828
|
+
Instr instr = instr_at(pc);
|
|
1829
|
+
ASSERT(IsJ(instr) || IsLui(instr));
|
|
1830
|
+
if (IsLui(instr)) {
|
|
1831
|
+
Instr instr_lui = instr_at(pc + 0 * Assembler::kInstrSize);
|
|
1832
|
+
Instr instr_ori = instr_at(pc + 1 * Assembler::kInstrSize);
|
|
1833
|
+
ASSERT(IsOri(instr_ori));
|
|
1834
|
+
int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift;
|
|
1835
|
+
imm |= (instr_ori & static_cast<int32_t>(kImm16Mask));
|
|
1836
|
+
if (imm == kEndOfJumpChain) {
|
|
1837
|
+
return 0; // Number of instructions patched.
|
|
1838
|
+
}
|
|
1839
|
+
imm += pc_delta;
|
|
1840
|
+
ASSERT((imm & 3) == 0);
|
|
1841
|
+
|
|
1842
|
+
instr_lui &= ~kImm16Mask;
|
|
1843
|
+
instr_ori &= ~kImm16Mask;
|
|
1844
|
+
|
|
1845
|
+
instr_at_put(pc + 0 * Assembler::kInstrSize,
|
|
1846
|
+
instr_lui | ((imm >> kLuiShift) & kImm16Mask));
|
|
1847
|
+
instr_at_put(pc + 1 * Assembler::kInstrSize,
|
|
1848
|
+
instr_ori | (imm & kImm16Mask));
|
|
1849
|
+
return 2; // Number of instructions patched.
|
|
1850
|
+
} else {
|
|
1851
|
+
uint32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2;
|
|
1852
|
+
if ((int32_t)imm28 == kEndOfJumpChain) {
|
|
1853
|
+
return 0; // Number of instructions patched.
|
|
1854
|
+
}
|
|
1855
|
+
imm28 += pc_delta;
|
|
1856
|
+
imm28 &= kImm28Mask;
|
|
1857
|
+
ASSERT((imm28 & 3) == 0);
|
|
1858
|
+
|
|
1859
|
+
instr &= ~kImm26Mask;
|
|
1860
|
+
uint32_t imm26 = imm28 >> 2;
|
|
1861
|
+
ASSERT(is_uint26(imm26));
|
|
1862
|
+
|
|
1863
|
+
instr_at_put(pc, instr | (imm26 & kImm26Mask));
|
|
1864
|
+
return 1; // Number of instructions patched.
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
|
|
1770
1869
|
void Assembler::GrowBuffer() {
|
|
1771
1870
|
if (!own_buffer_) FATAL("external code buffer is too small");
|
|
1772
1871
|
|
|
@@ -1802,9 +1901,14 @@ void Assembler::GrowBuffer() {
|
|
|
1802
1901
|
reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
|
|
1803
1902
|
reloc_info_writer.last_pc() + pc_delta);
|
|
1804
1903
|
|
|
1805
|
-
//
|
|
1806
|
-
|
|
1807
|
-
|
|
1904
|
+
// Relocate runtime entries.
|
|
1905
|
+
for (RelocIterator it(desc); !it.done(); it.next()) {
|
|
1906
|
+
RelocInfo::Mode rmode = it.rinfo()->rmode();
|
|
1907
|
+
if (rmode == RelocInfo::INTERNAL_REFERENCE) {
|
|
1908
|
+
byte* p = reinterpret_cast<byte*>(it.rinfo()->pc());
|
|
1909
|
+
RelocateInternalReference(p, pc_delta);
|
|
1910
|
+
}
|
|
1911
|
+
}
|
|
1808
1912
|
|
|
1809
1913
|
ASSERT(!overflow());
|
|
1810
1914
|
}
|
|
@@ -1843,9 +1947,8 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
|
|
|
1843
1947
|
}
|
|
1844
1948
|
ASSERT(buffer_space() >= kMaxRelocSize); // Too late to grow buffer here.
|
|
1845
1949
|
if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
ast_id_for_reloc_info_ = kNoASTId;
|
|
1950
|
+
RelocInfo reloc_info_with_ast_id(pc_, rmode, RecordedAstId());
|
|
1951
|
+
ClearRecordedAstId();
|
|
1849
1952
|
reloc_info_writer.Write(&reloc_info_with_ast_id);
|
|
1850
1953
|
} else {
|
|
1851
1954
|
reloc_info_writer.Write(&rinfo);
|
|
@@ -1859,16 +1962,7 @@ void Assembler::BlockTrampolinePoolFor(int instructions) {
|
|
|
1859
1962
|
}
|
|
1860
1963
|
|
|
1861
1964
|
|
|
1862
|
-
void Assembler::CheckTrampolinePool(
|
|
1863
|
-
// Calculate the offset of the next check.
|
|
1864
|
-
next_buffer_check_ = pc_offset() + kCheckConstInterval;
|
|
1865
|
-
|
|
1866
|
-
int dist = pc_offset() - last_trampoline_pool_end_;
|
|
1867
|
-
|
|
1868
|
-
if (dist <= kMaxDistBetweenPools && !force_emit) {
|
|
1869
|
-
return;
|
|
1870
|
-
}
|
|
1871
|
-
|
|
1965
|
+
void Assembler::CheckTrampolinePool() {
|
|
1872
1966
|
// Some small sequences of instructions must not be broken up by the
|
|
1873
1967
|
// insertion of a trampoline pool; such sequences are protected by setting
|
|
1874
1968
|
// either trampoline_pool_blocked_nesting_ or no_trampoline_pool_before_,
|
|
@@ -1886,29 +1980,43 @@ void Assembler::CheckTrampolinePool(bool force_emit) {
|
|
|
1886
1980
|
return;
|
|
1887
1981
|
}
|
|
1888
1982
|
|
|
1889
|
-
|
|
1890
|
-
|
|
1891
|
-
|
|
1892
|
-
|
|
1893
|
-
|
|
1894
|
-
|
|
1895
|
-
int pool_start = pc_offset();
|
|
1896
|
-
for (int i = 0; i < kSlotsPerTrampoline; i++) {
|
|
1983
|
+
ASSERT(!trampoline_emitted_);
|
|
1984
|
+
ASSERT(unbound_labels_count_ >= 0);
|
|
1985
|
+
if (unbound_labels_count_ > 0) {
|
|
1986
|
+
// First we emit jump (2 instructions), then we emit trampoline pool.
|
|
1987
|
+
{ BlockTrampolinePoolScope block_trampoline_pool(this);
|
|
1988
|
+
Label after_pool;
|
|
1897
1989
|
b(&after_pool);
|
|
1898
1990
|
nop();
|
|
1991
|
+
|
|
1992
|
+
int pool_start = pc_offset();
|
|
1993
|
+
for (int i = 0; i < unbound_labels_count_; i++) {
|
|
1994
|
+
uint32_t imm32;
|
|
1995
|
+
imm32 = jump_address(&after_pool);
|
|
1996
|
+
{ BlockGrowBufferScope block_buf_growth(this);
|
|
1997
|
+
// Buffer growth (and relocation) must be blocked for internal
|
|
1998
|
+
// references until associated instructions are emitted and available
|
|
1999
|
+
// to be patched.
|
|
2000
|
+
RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
|
|
2001
|
+
lui(at, (imm32 & kHiMask) >> kLuiShift);
|
|
2002
|
+
ori(at, at, (imm32 & kImm16Mask));
|
|
2003
|
+
}
|
|
2004
|
+
jr(at);
|
|
2005
|
+
nop();
|
|
2006
|
+
}
|
|
2007
|
+
bind(&after_pool);
|
|
2008
|
+
trampoline_ = Trampoline(pool_start, unbound_labels_count_);
|
|
2009
|
+
|
|
2010
|
+
trampoline_emitted_ = true;
|
|
2011
|
+
// As we are only going to emit trampoline once, we need to prevent any
|
|
2012
|
+
// further emission.
|
|
2013
|
+
next_buffer_check_ = kMaxInt;
|
|
1899
2014
|
}
|
|
1900
|
-
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1904
|
-
|
|
1905
|
-
trampolines_.Add(Trampoline(pool_start,
|
|
1906
|
-
kSlotsPerTrampoline,
|
|
1907
|
-
kLabelsPerTrampoline));
|
|
1908
|
-
|
|
1909
|
-
// Since a trampoline pool was just emitted,
|
|
1910
|
-
// move the check offset forward by the standard interval.
|
|
1911
|
-
next_buffer_check_ = last_trampoline_pool_end_ + kMaxDistBetweenPools;
|
|
2015
|
+
} else {
|
|
2016
|
+
// Number of branches to unbound label at this point is zero, so we can
|
|
2017
|
+
// move next buffer check to maximum.
|
|
2018
|
+
next_buffer_check_ = pc_offset() +
|
|
2019
|
+
kMaxBranchOffset - kTrampolineSlotsSize * 16;
|
|
1912
2020
|
}
|
|
1913
2021
|
return;
|
|
1914
2022
|
}
|