libv8 3.3.10.4 → 3.5.10.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/libv8/scons/CHANGES.txt +24 -231
- data/lib/libv8/scons/LICENSE.txt +1 -1
- data/lib/libv8/scons/MANIFEST +0 -1
- data/lib/libv8/scons/PKG-INFO +1 -1
- data/lib/libv8/scons/README.txt +9 -9
- data/lib/libv8/scons/RELEASE.txt +75 -77
- data/lib/libv8/scons/engine/SCons/Action.py +6 -22
- data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
- data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
- data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
- data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
- data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
- data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
- data/lib/libv8/scons/engine/SCons/Job.py +2 -2
- data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
- data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
- data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
- data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
- data/lib/libv8/scons/engine/SCons/Util.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
- data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
- data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
- data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
- data/lib/libv8/scons/scons-time.1 +3 -3
- data/lib/libv8/scons/scons.1 +1164 -1170
- data/lib/libv8/scons/sconsign.1 +3 -3
- data/lib/libv8/scons/script/scons +22 -22
- data/lib/libv8/scons/script/scons-time +2 -2
- data/lib/libv8/scons/script/scons.bat +4 -7
- data/lib/libv8/scons/script/sconsign +20 -21
- data/lib/libv8/scons/setup.cfg +1 -0
- data/lib/libv8/scons/setup.py +40 -38
- data/lib/libv8/v8/.gitignore +1 -1
- data/lib/libv8/v8/AUTHORS +2 -0
- data/lib/libv8/v8/ChangeLog +387 -0
- data/lib/libv8/v8/Makefile +171 -0
- data/lib/libv8/v8/SConstruct +124 -51
- data/lib/libv8/v8/build/README.txt +31 -14
- data/lib/libv8/v8/build/all.gyp +11 -4
- data/lib/libv8/v8/build/armu.gypi +6 -2
- data/lib/libv8/v8/build/common.gypi +240 -94
- data/lib/libv8/v8/build/gyp_v8 +32 -4
- data/lib/libv8/v8/build/standalone.gypi +200 -0
- data/lib/libv8/v8/include/v8-debug.h +0 -0
- data/lib/libv8/v8/include/v8-profiler.h +8 -11
- data/lib/libv8/v8/include/v8.h +191 -108
- data/lib/libv8/v8/preparser/SConscript +2 -2
- data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
- data/lib/libv8/v8/preparser/preparser.gyp +42 -0
- data/lib/libv8/v8/src/SConscript +33 -8
- data/lib/libv8/v8/src/accessors.cc +77 -43
- data/lib/libv8/v8/src/api.cc +393 -191
- data/lib/libv8/v8/src/api.h +4 -8
- data/lib/libv8/v8/src/apinatives.js +15 -3
- data/lib/libv8/v8/src/arguments.h +8 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
- data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
- data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
- data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
- data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
- data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
- data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
- data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
- data/lib/libv8/v8/src/array.js +38 -18
- data/lib/libv8/v8/src/assembler.cc +12 -5
- data/lib/libv8/v8/src/assembler.h +15 -9
- data/lib/libv8/v8/src/ast-inl.h +34 -25
- data/lib/libv8/v8/src/ast.cc +141 -72
- data/lib/libv8/v8/src/ast.h +255 -181
- data/lib/libv8/v8/src/bignum.cc +3 -4
- data/lib/libv8/v8/src/bootstrapper.cc +55 -11
- data/lib/libv8/v8/src/bootstrapper.h +3 -2
- data/lib/libv8/v8/src/builtins.cc +8 -2
- data/lib/libv8/v8/src/builtins.h +4 -0
- data/lib/libv8/v8/src/cached-powers.cc +8 -4
- data/lib/libv8/v8/src/checks.h +3 -3
- data/lib/libv8/v8/src/code-stubs.cc +173 -28
- data/lib/libv8/v8/src/code-stubs.h +104 -148
- data/lib/libv8/v8/src/codegen.cc +8 -8
- data/lib/libv8/v8/src/compilation-cache.cc +2 -47
- data/lib/libv8/v8/src/compilation-cache.h +0 -10
- data/lib/libv8/v8/src/compiler.cc +27 -16
- data/lib/libv8/v8/src/compiler.h +13 -18
- data/lib/libv8/v8/src/contexts.cc +107 -72
- data/lib/libv8/v8/src/contexts.h +70 -34
- data/lib/libv8/v8/src/conversions-inl.h +572 -14
- data/lib/libv8/v8/src/conversions.cc +9 -707
- data/lib/libv8/v8/src/conversions.h +23 -12
- data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
- data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
- data/lib/libv8/v8/src/cpu-profiler.h +8 -17
- data/lib/libv8/v8/src/d8-debug.cc +5 -3
- data/lib/libv8/v8/src/d8-debug.h +6 -7
- data/lib/libv8/v8/src/d8-posix.cc +1 -10
- data/lib/libv8/v8/src/d8.cc +721 -219
- data/lib/libv8/v8/src/d8.gyp +37 -12
- data/lib/libv8/v8/src/d8.h +141 -19
- data/lib/libv8/v8/src/d8.js +17 -8
- data/lib/libv8/v8/src/date.js +16 -5
- data/lib/libv8/v8/src/dateparser-inl.h +242 -39
- data/lib/libv8/v8/src/dateparser.cc +38 -4
- data/lib/libv8/v8/src/dateparser.h +170 -28
- data/lib/libv8/v8/src/debug-agent.cc +5 -3
- data/lib/libv8/v8/src/debug-agent.h +11 -7
- data/lib/libv8/v8/src/debug-debugger.js +65 -34
- data/lib/libv8/v8/src/debug.cc +30 -60
- data/lib/libv8/v8/src/debug.h +5 -3
- data/lib/libv8/v8/src/deoptimizer.cc +227 -10
- data/lib/libv8/v8/src/deoptimizer.h +133 -9
- data/lib/libv8/v8/src/disassembler.cc +22 -14
- data/lib/libv8/v8/src/diy-fp.cc +4 -3
- data/lib/libv8/v8/src/diy-fp.h +3 -3
- data/lib/libv8/v8/src/elements.cc +634 -0
- data/lib/libv8/v8/src/elements.h +95 -0
- data/lib/libv8/v8/src/execution.cc +5 -21
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
- data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
- data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
- data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
- data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
- data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
- data/lib/libv8/v8/src/factory.cc +89 -18
- data/lib/libv8/v8/src/factory.h +36 -8
- data/lib/libv8/v8/src/flag-definitions.h +11 -44
- data/lib/libv8/v8/src/frames-inl.h +8 -1
- data/lib/libv8/v8/src/frames.cc +39 -3
- data/lib/libv8/v8/src/frames.h +10 -3
- data/lib/libv8/v8/src/full-codegen.cc +311 -293
- data/lib/libv8/v8/src/full-codegen.h +183 -143
- data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
- data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
- data/lib/libv8/v8/src/gdb-jit.cc +658 -55
- data/lib/libv8/v8/src/gdb-jit.h +6 -2
- data/lib/libv8/v8/src/global-handles.cc +368 -312
- data/lib/libv8/v8/src/global-handles.h +29 -36
- data/lib/libv8/v8/src/globals.h +3 -1
- data/lib/libv8/v8/src/handles.cc +43 -69
- data/lib/libv8/v8/src/handles.h +21 -16
- data/lib/libv8/v8/src/heap-inl.h +11 -13
- data/lib/libv8/v8/src/heap-profiler.cc +0 -999
- data/lib/libv8/v8/src/heap-profiler.h +0 -303
- data/lib/libv8/v8/src/heap.cc +366 -141
- data/lib/libv8/v8/src/heap.h +87 -26
- data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
- data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
- data/lib/libv8/v8/src/hydrogen.cc +1146 -629
- data/lib/libv8/v8/src/hydrogen.h +100 -64
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
- data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
- data/lib/libv8/v8/src/ic.cc +198 -234
- data/lib/libv8/v8/src/ic.h +32 -30
- data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
- data/lib/libv8/v8/src/isolate.cc +112 -95
- data/lib/libv8/v8/src/isolate.h +55 -71
- data/lib/libv8/v8/src/json-parser.h +486 -48
- data/lib/libv8/v8/src/json.js +28 -23
- data/lib/libv8/v8/src/jsregexp.cc +163 -208
- data/lib/libv8/v8/src/jsregexp.h +0 -1
- data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
- data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
- data/lib/libv8/v8/src/lithium-allocator.h +8 -8
- data/lib/libv8/v8/src/lithium.cc +16 -11
- data/lib/libv8/v8/src/lithium.h +31 -34
- data/lib/libv8/v8/src/liveedit.cc +111 -15
- data/lib/libv8/v8/src/liveedit.h +3 -4
- data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
- data/lib/libv8/v8/src/liveobjectlist.h +2 -2
- data/lib/libv8/v8/src/log-inl.h +0 -4
- data/lib/libv8/v8/src/log-utils.cc +25 -143
- data/lib/libv8/v8/src/log-utils.h +13 -92
- data/lib/libv8/v8/src/log.cc +26 -249
- data/lib/libv8/v8/src/log.h +6 -17
- data/lib/libv8/v8/src/macros.py +9 -6
- data/lib/libv8/v8/src/mark-compact.cc +276 -56
- data/lib/libv8/v8/src/mark-compact.h +20 -0
- data/lib/libv8/v8/src/messages.js +93 -39
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
- data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
- data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
- data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
- data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
- data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
- data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
- data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
- data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
- data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
- data/lib/libv8/v8/src/mirror-debugger.js +55 -8
- data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
- data/lib/libv8/v8/src/mksnapshot.cc +36 -4
- data/lib/libv8/v8/src/natives.h +5 -2
- data/lib/libv8/v8/src/objects-debug.cc +73 -6
- data/lib/libv8/v8/src/objects-inl.h +529 -164
- data/lib/libv8/v8/src/objects-printer.cc +67 -12
- data/lib/libv8/v8/src/objects-visiting.cc +13 -2
- data/lib/libv8/v8/src/objects-visiting.h +41 -1
- data/lib/libv8/v8/src/objects.cc +2200 -1177
- data/lib/libv8/v8/src/objects.h +912 -283
- data/lib/libv8/v8/src/parser.cc +566 -371
- data/lib/libv8/v8/src/parser.h +35 -33
- data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
- data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
- data/lib/libv8/v8/src/platform-linux.cc +60 -57
- data/lib/libv8/v8/src/platform-macos.cc +4 -27
- data/lib/libv8/v8/src/platform-nullos.cc +3 -16
- data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
- data/lib/libv8/v8/src/platform-posix.cc +43 -1
- data/lib/libv8/v8/src/platform-solaris.cc +151 -112
- data/lib/libv8/v8/src/platform-tls.h +1 -1
- data/lib/libv8/v8/src/platform-win32.cc +65 -39
- data/lib/libv8/v8/src/platform.h +17 -14
- data/lib/libv8/v8/src/preparse-data-format.h +2 -2
- data/lib/libv8/v8/src/preparse-data.h +8 -2
- data/lib/libv8/v8/src/preparser-api.cc +2 -18
- data/lib/libv8/v8/src/preparser.cc +106 -65
- data/lib/libv8/v8/src/preparser.h +26 -5
- data/lib/libv8/v8/src/prettyprinter.cc +25 -43
- data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
- data/lib/libv8/v8/src/profile-generator.cc +213 -34
- data/lib/libv8/v8/src/profile-generator.h +9 -9
- data/lib/libv8/v8/src/property.h +1 -0
- data/lib/libv8/v8/src/proxy.js +74 -4
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
- data/lib/libv8/v8/src/regexp.js +16 -11
- data/lib/libv8/v8/src/rewriter.cc +24 -133
- data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
- data/lib/libv8/v8/src/runtime-profiler.h +5 -31
- data/lib/libv8/v8/src/runtime.cc +1450 -681
- data/lib/libv8/v8/src/runtime.h +47 -31
- data/lib/libv8/v8/src/runtime.js +2 -1
- data/lib/libv8/v8/src/scanner-base.cc +358 -220
- data/lib/libv8/v8/src/scanner-base.h +30 -138
- data/lib/libv8/v8/src/scanner.cc +0 -18
- data/lib/libv8/v8/src/scanner.h +0 -15
- data/lib/libv8/v8/src/scopeinfo.cc +3 -1
- data/lib/libv8/v8/src/scopeinfo.h +1 -6
- data/lib/libv8/v8/src/scopes.cc +243 -253
- data/lib/libv8/v8/src/scopes.h +58 -109
- data/lib/libv8/v8/src/serialize.cc +12 -54
- data/lib/libv8/v8/src/serialize.h +47 -0
- data/lib/libv8/v8/src/small-pointer-list.h +25 -0
- data/lib/libv8/v8/src/spaces-inl.h +4 -50
- data/lib/libv8/v8/src/spaces.cc +64 -131
- data/lib/libv8/v8/src/spaces.h +19 -70
- data/lib/libv8/v8/src/string-stream.cc +3 -1
- data/lib/libv8/v8/src/string.js +10 -6
- data/lib/libv8/v8/src/strtod.cc +7 -3
- data/lib/libv8/v8/src/stub-cache.cc +59 -129
- data/lib/libv8/v8/src/stub-cache.h +42 -54
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
- data/lib/libv8/v8/src/token.cc +4 -4
- data/lib/libv8/v8/src/token.h +6 -5
- data/lib/libv8/v8/src/type-info.cc +173 -129
- data/lib/libv8/v8/src/type-info.h +40 -22
- data/lib/libv8/v8/src/utils.cc +25 -304
- data/lib/libv8/v8/src/utils.h +118 -3
- data/lib/libv8/v8/src/v8-counters.h +3 -6
- data/lib/libv8/v8/src/v8.cc +34 -27
- data/lib/libv8/v8/src/v8.h +7 -7
- data/lib/libv8/v8/src/v8conversions.cc +129 -0
- data/lib/libv8/v8/src/v8conversions.h +60 -0
- data/lib/libv8/v8/src/v8globals.h +15 -6
- data/lib/libv8/v8/src/v8natives.js +300 -78
- data/lib/libv8/v8/src/v8threads.cc +14 -6
- data/lib/libv8/v8/src/v8threads.h +4 -1
- data/lib/libv8/v8/src/v8utils.cc +360 -0
- data/lib/libv8/v8/src/v8utils.h +17 -66
- data/lib/libv8/v8/src/variables.cc +7 -12
- data/lib/libv8/v8/src/variables.h +12 -10
- data/lib/libv8/v8/src/version.cc +2 -2
- data/lib/libv8/v8/src/vm-state-inl.h +0 -41
- data/lib/libv8/v8/src/vm-state.h +0 -11
- data/lib/libv8/v8/src/weakmap.js +103 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
- data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
- data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
- data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
- data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
- data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
- data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
- data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
- data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
- data/lib/libv8/v8/src/zone.cc +31 -22
- data/lib/libv8/v8/src/zone.h +12 -6
- data/lib/libv8/v8/tools/codemap.js +8 -0
- data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
- data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
- data/lib/libv8/v8/tools/grokdump.py +44 -35
- data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
- data/lib/libv8/v8/tools/js2c.py +83 -52
- data/lib/libv8/v8/tools/linux-tick-processor +4 -6
- data/lib/libv8/v8/tools/ll_prof.py +3 -3
- data/lib/libv8/v8/tools/oom_dump/README +3 -1
- data/lib/libv8/v8/tools/presubmit.py +11 -4
- data/lib/libv8/v8/tools/profile.js +46 -2
- data/lib/libv8/v8/tools/splaytree.js +11 -0
- data/lib/libv8/v8/tools/stats-viewer.py +15 -11
- data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
- data/lib/libv8/v8/tools/test.py +28 -8
- data/lib/libv8/v8/tools/tickprocessor.js +0 -16
- data/lib/libv8/version.rb +1 -1
- data/libv8.gemspec +2 -2
- metadata +31 -19
- data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
- data/lib/libv8/v8/src/json-parser.cc +0 -504
data/lib/libv8/v8/src/contexts.h
CHANGED
|
@@ -44,6 +44,30 @@ enum ContextLookupFlags {
|
|
|
44
44
|
};
|
|
45
45
|
|
|
46
46
|
|
|
47
|
+
// ES5 10.2 defines lexical environments with mutable and immutable bindings.
|
|
48
|
+
// Immutable bindings have two states, initialized and uninitialized, and
|
|
49
|
+
// their state is changed by the InitializeImmutableBinding method.
|
|
50
|
+
//
|
|
51
|
+
// The harmony proposal for block scoped bindings also introduces the
|
|
52
|
+
// uninitialized state for mutable bindings. A 'let' declared variable
|
|
53
|
+
// is a mutable binding that is created uninitalized upon activation of its
|
|
54
|
+
// lexical environment and it is initialized when evaluating its declaration
|
|
55
|
+
// statement. Var declared variables are mutable bindings that are
|
|
56
|
+
// immediately initialized upon creation. The BindingFlags enum represents
|
|
57
|
+
// information if a binding has definitely been initialized. 'const' declared
|
|
58
|
+
// variables are created as uninitialized immutable bindings.
|
|
59
|
+
|
|
60
|
+
// In harmony mode accessing an uninitialized binding produces a reference
|
|
61
|
+
// error.
|
|
62
|
+
enum BindingFlags {
|
|
63
|
+
MUTABLE_IS_INITIALIZED,
|
|
64
|
+
MUTABLE_CHECK_INITIALIZED,
|
|
65
|
+
IMMUTABLE_IS_INITIALIZED,
|
|
66
|
+
IMMUTABLE_CHECK_INITIALIZED,
|
|
67
|
+
MISSING_BINDING
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
|
|
47
71
|
// Heap-allocated activation contexts.
|
|
48
72
|
//
|
|
49
73
|
// Contexts are implemented as FixedArray objects; the Context
|
|
@@ -88,6 +112,8 @@ enum ContextLookupFlags {
|
|
|
88
112
|
V(JS_ARRAY_MAP_INDEX, Map, js_array_map)\
|
|
89
113
|
V(REGEXP_RESULT_MAP_INDEX, Map, regexp_result_map)\
|
|
90
114
|
V(ARGUMENTS_BOILERPLATE_INDEX, JSObject, arguments_boilerplate) \
|
|
115
|
+
V(ALIASED_ARGUMENTS_BOILERPLATE_INDEX, JSObject, \
|
|
116
|
+
aliased_arguments_boilerplate) \
|
|
91
117
|
V(STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX, JSObject, \
|
|
92
118
|
strict_mode_arguments_boilerplate) \
|
|
93
119
|
V(MESSAGE_LISTENERS_INDEX, JSObject, message_listeners) \
|
|
@@ -108,7 +134,9 @@ enum ContextLookupFlags {
|
|
|
108
134
|
V(MAP_CACHE_INDEX, Object, map_cache) \
|
|
109
135
|
V(CONTEXT_DATA_INDEX, Object, data) \
|
|
110
136
|
V(ALLOW_CODE_GEN_FROM_STRINGS_INDEX, Object, allow_code_gen_from_strings) \
|
|
111
|
-
V(
|
|
137
|
+
V(DERIVED_HAS_TRAP_INDEX, JSFunction, derived_has_trap) \
|
|
138
|
+
V(DERIVED_GET_TRAP_INDEX, JSFunction, derived_get_trap) \
|
|
139
|
+
V(DERIVED_SET_TRAP_INDEX, JSFunction, derived_set_trap)
|
|
112
140
|
|
|
113
141
|
// JSFunctions are pairs (context, function code), sometimes also called
|
|
114
142
|
// closures. A Context object is used to represent function contexts and
|
|
@@ -127,13 +155,6 @@ enum ContextLookupFlags {
|
|
|
127
155
|
// statically allocated context slots. The names are needed
|
|
128
156
|
// for dynamic lookups in the presence of 'with' or 'eval'.
|
|
129
157
|
//
|
|
130
|
-
// [ fcontext ] A pointer to the innermost enclosing function context.
|
|
131
|
-
// It is the same for all contexts *allocated* inside a
|
|
132
|
-
// function, and the function context's fcontext points
|
|
133
|
-
// to itself. It is only needed for fast access of the
|
|
134
|
-
// function context (used for declarations, and static
|
|
135
|
-
// context slot access).
|
|
136
|
-
//
|
|
137
158
|
// [ previous ] A pointer to the previous context. It is NULL for
|
|
138
159
|
// function contexts, and non-NULL for 'with' contexts.
|
|
139
160
|
// Used to implement the 'with' statement.
|
|
@@ -155,19 +176,6 @@ enum ContextLookupFlags {
|
|
|
155
176
|
// (via static context addresses) or through 'eval' (dynamic context lookups).
|
|
156
177
|
// Finally, the global context contains additional slots for fast access to
|
|
157
178
|
// global properties.
|
|
158
|
-
//
|
|
159
|
-
// We may be able to simplify the implementation:
|
|
160
|
-
//
|
|
161
|
-
// - We may be able to get rid of 'fcontext': We can always use the fact that
|
|
162
|
-
// previous == NULL for function contexts and so we can search for them. They
|
|
163
|
-
// are only needed when doing dynamic declarations, and the context chains
|
|
164
|
-
// tend to be very very short (depth of nesting of 'with' statements). At
|
|
165
|
-
// the moment we also use it in generated code for context slot accesses -
|
|
166
|
-
// and there we don't want a loop because of code bloat - but we may not
|
|
167
|
-
// need it there after all (see comment in codegen_*.cc).
|
|
168
|
-
//
|
|
169
|
-
// - If we cannot get rid of fcontext, consider making 'previous' never NULL
|
|
170
|
-
// except for the global context. This could simplify Context::Lookup.
|
|
171
179
|
|
|
172
180
|
class Context: public FixedArray {
|
|
173
181
|
public:
|
|
@@ -181,16 +189,22 @@ class Context: public FixedArray {
|
|
|
181
189
|
enum {
|
|
182
190
|
// These slots are in all contexts.
|
|
183
191
|
CLOSURE_INDEX,
|
|
184
|
-
FCONTEXT_INDEX,
|
|
185
192
|
PREVIOUS_INDEX,
|
|
193
|
+
// The extension slot is used for either the global object (in global
|
|
194
|
+
// contexts), eval extension object (function contexts), subject of with
|
|
195
|
+
// (with contexts), or the variable name (catch contexts).
|
|
186
196
|
EXTENSION_INDEX,
|
|
187
197
|
GLOBAL_INDEX,
|
|
188
198
|
MIN_CONTEXT_SLOTS,
|
|
189
199
|
|
|
200
|
+
// This slot holds the thrown value in catch contexts.
|
|
201
|
+
THROWN_OBJECT_INDEX = MIN_CONTEXT_SLOTS,
|
|
202
|
+
|
|
190
203
|
// These slots are only in global contexts.
|
|
191
204
|
GLOBAL_PROXY_INDEX = MIN_CONTEXT_SLOTS,
|
|
192
205
|
SECURITY_TOKEN_INDEX,
|
|
193
206
|
ARGUMENTS_BOILERPLATE_INDEX,
|
|
207
|
+
ALIASED_ARGUMENTS_BOILERPLATE_INDEX,
|
|
194
208
|
STRICT_MODE_ARGUMENTS_BOILERPLATE_INDEX,
|
|
195
209
|
JS_ARRAY_MAP_INDEX,
|
|
196
210
|
REGEXP_RESULT_MAP_INDEX,
|
|
@@ -236,14 +250,16 @@ class Context: public FixedArray {
|
|
|
236
250
|
OPAQUE_REFERENCE_FUNCTION_INDEX,
|
|
237
251
|
CONTEXT_EXTENSION_FUNCTION_INDEX,
|
|
238
252
|
OUT_OF_MEMORY_INDEX,
|
|
239
|
-
MAP_CACHE_INDEX,
|
|
240
253
|
CONTEXT_DATA_INDEX,
|
|
241
254
|
ALLOW_CODE_GEN_FROM_STRINGS_INDEX,
|
|
255
|
+
DERIVED_HAS_TRAP_INDEX,
|
|
242
256
|
DERIVED_GET_TRAP_INDEX,
|
|
257
|
+
DERIVED_SET_TRAP_INDEX,
|
|
243
258
|
|
|
244
259
|
// Properties from here are treated as weak references by the full GC.
|
|
245
260
|
// Scavenge treats them as strong references.
|
|
246
261
|
OPTIMIZED_FUNCTIONS_LIST, // Weak.
|
|
262
|
+
MAP_CACHE_INDEX, // Weak.
|
|
247
263
|
NEXT_CONTEXT_LINK, // Weak.
|
|
248
264
|
|
|
249
265
|
// Total number of slots.
|
|
@@ -256,9 +272,6 @@ class Context: public FixedArray {
|
|
|
256
272
|
JSFunction* closure() { return JSFunction::cast(get(CLOSURE_INDEX)); }
|
|
257
273
|
void set_closure(JSFunction* closure) { set(CLOSURE_INDEX, closure); }
|
|
258
274
|
|
|
259
|
-
Context* fcontext() { return Context::cast(get(FCONTEXT_INDEX)); }
|
|
260
|
-
void set_fcontext(Context* context) { set(FCONTEXT_INDEX, context); }
|
|
261
|
-
|
|
262
275
|
Context* previous() {
|
|
263
276
|
Object* result = unchecked_previous();
|
|
264
277
|
ASSERT(IsBootstrappingOrContext(result));
|
|
@@ -266,9 +279,13 @@ class Context: public FixedArray {
|
|
|
266
279
|
}
|
|
267
280
|
void set_previous(Context* context) { set(PREVIOUS_INDEX, context); }
|
|
268
281
|
|
|
269
|
-
bool has_extension() { return
|
|
270
|
-
|
|
271
|
-
void set_extension(
|
|
282
|
+
bool has_extension() { return extension() != NULL; }
|
|
283
|
+
Object* extension() { return get(EXTENSION_INDEX); }
|
|
284
|
+
void set_extension(Object* object) { set(EXTENSION_INDEX, object); }
|
|
285
|
+
|
|
286
|
+
// Get the context where var declarations will be hoisted to, which
|
|
287
|
+
// may be the context itself.
|
|
288
|
+
Context* declaration_context();
|
|
272
289
|
|
|
273
290
|
GlobalObject* global() {
|
|
274
291
|
Object* result = get(GLOBAL_INDEX);
|
|
@@ -287,8 +304,25 @@ class Context: public FixedArray {
|
|
|
287
304
|
// Compute the global context by traversing the context chain.
|
|
288
305
|
Context* global_context();
|
|
289
306
|
|
|
290
|
-
//
|
|
291
|
-
|
|
307
|
+
// Predicates for context types. IsGlobalContext is defined on Object
|
|
308
|
+
// because we frequently have to know if arbitrary objects are global
|
|
309
|
+
// contexts.
|
|
310
|
+
bool IsFunctionContext() {
|
|
311
|
+
Map* map = this->map();
|
|
312
|
+
return map == map->GetHeap()->function_context_map();
|
|
313
|
+
}
|
|
314
|
+
bool IsCatchContext() {
|
|
315
|
+
Map* map = this->map();
|
|
316
|
+
return map == map->GetHeap()->catch_context_map();
|
|
317
|
+
}
|
|
318
|
+
bool IsWithContext() {
|
|
319
|
+
Map* map = this->map();
|
|
320
|
+
return map == map->GetHeap()->with_context_map();
|
|
321
|
+
}
|
|
322
|
+
bool IsBlockContext() {
|
|
323
|
+
Map* map = this->map();
|
|
324
|
+
return map == map->GetHeap()->block_context_map();
|
|
325
|
+
}
|
|
292
326
|
|
|
293
327
|
// Tells whether the global context is marked with out of memory.
|
|
294
328
|
inline bool has_out_of_memory();
|
|
@@ -341,8 +375,11 @@ class Context: public FixedArray {
|
|
|
341
375
|
// 4) index_ < 0 && result.is_null():
|
|
342
376
|
// there was no context found with the corresponding property.
|
|
343
377
|
// attributes == ABSENT.
|
|
344
|
-
Handle<Object> Lookup(Handle<String> name,
|
|
345
|
-
|
|
378
|
+
Handle<Object> Lookup(Handle<String> name,
|
|
379
|
+
ContextLookupFlags flags,
|
|
380
|
+
int* index_,
|
|
381
|
+
PropertyAttributes* attributes,
|
|
382
|
+
BindingFlags* binding_flags);
|
|
346
383
|
|
|
347
384
|
// Determine if a local variable with the given name exists in a
|
|
348
385
|
// context. Do not consider context extension objects. This is
|
|
@@ -377,7 +414,6 @@ class Context: public FixedArray {
|
|
|
377
414
|
private:
|
|
378
415
|
// Unchecked access to the slots.
|
|
379
416
|
Object* unchecked_previous() { return get(PREVIOUS_INDEX); }
|
|
380
|
-
Object* unchecked_extension() { return get(EXTENSION_INDEX); }
|
|
381
417
|
|
|
382
418
|
#ifdef DEBUG
|
|
383
419
|
// Bootstrapping-aware type checks.
|
|
@@ -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:
|
|
@@ -28,19 +28,26 @@
|
|
|
28
28
|
#ifndef V8_CONVERSIONS_INL_H_
|
|
29
29
|
#define V8_CONVERSIONS_INL_H_
|
|
30
30
|
|
|
31
|
+
#include <limits.h> // Required for INT_MAX etc.
|
|
31
32
|
#include <math.h>
|
|
32
|
-
#include <float.h> //
|
|
33
|
+
#include <float.h> // Required for DBL_MAX and on Win32 for finite()
|
|
33
34
|
#include <stdarg.h>
|
|
34
35
|
|
|
35
36
|
// ----------------------------------------------------------------------------
|
|
36
37
|
// Extra POSIX/ANSI functions for Win32/MSVC.
|
|
37
38
|
|
|
38
39
|
#include "conversions.h"
|
|
40
|
+
#include "strtod.h"
|
|
39
41
|
#include "platform.h"
|
|
40
42
|
|
|
41
43
|
namespace v8 {
|
|
42
44
|
namespace internal {
|
|
43
45
|
|
|
46
|
+
static inline double JunkStringValue() {
|
|
47
|
+
return std::numeric_limits<double>::quiet_NaN();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
|
|
44
51
|
// The fast double-to-unsigned-int conversion routine does not guarantee
|
|
45
52
|
// rounding towards zero, or any reasonable value if the argument is larger
|
|
46
53
|
// than what fits in an unsigned 32-bit integer.
|
|
@@ -77,18 +84,6 @@ static inline double DoubleToInteger(double x) {
|
|
|
77
84
|
}
|
|
78
85
|
|
|
79
86
|
|
|
80
|
-
int32_t NumberToInt32(Object* number) {
|
|
81
|
-
if (number->IsSmi()) return Smi::cast(number)->value();
|
|
82
|
-
return DoubleToInt32(number->Number());
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
uint32_t NumberToUint32(Object* number) {
|
|
87
|
-
if (number->IsSmi()) return Smi::cast(number)->value();
|
|
88
|
-
return DoubleToUint32(number->Number());
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
|
|
92
87
|
int32_t DoubleToInt32(double x) {
|
|
93
88
|
int32_t i = FastD2I(x);
|
|
94
89
|
if (FastI2D(i) == x) return i;
|
|
@@ -101,6 +96,569 @@ int32_t DoubleToInt32(double x) {
|
|
|
101
96
|
}
|
|
102
97
|
|
|
103
98
|
|
|
99
|
+
template <class Iterator, class EndMark>
|
|
100
|
+
static bool SubStringEquals(Iterator* current,
|
|
101
|
+
EndMark end,
|
|
102
|
+
const char* substring) {
|
|
103
|
+
ASSERT(**current == *substring);
|
|
104
|
+
for (substring++; *substring != '\0'; substring++) {
|
|
105
|
+
++*current;
|
|
106
|
+
if (*current == end || **current != *substring) return false;
|
|
107
|
+
}
|
|
108
|
+
++*current;
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
// Returns true if a nonspace character has been found and false if the
|
|
114
|
+
// end was been reached before finding a nonspace character.
|
|
115
|
+
template <class Iterator, class EndMark>
|
|
116
|
+
static inline bool AdvanceToNonspace(UnicodeCache* unicode_cache,
|
|
117
|
+
Iterator* current,
|
|
118
|
+
EndMark end) {
|
|
119
|
+
while (*current != end) {
|
|
120
|
+
if (!unicode_cache->IsWhiteSpace(**current)) return true;
|
|
121
|
+
++*current;
|
|
122
|
+
}
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
// Parsing integers with radix 2, 4, 8, 16, 32. Assumes current != end.
|
|
128
|
+
template <int radix_log_2, class Iterator, class EndMark>
|
|
129
|
+
static double InternalStringToIntDouble(UnicodeCache* unicode_cache,
|
|
130
|
+
Iterator current,
|
|
131
|
+
EndMark end,
|
|
132
|
+
bool negative,
|
|
133
|
+
bool allow_trailing_junk) {
|
|
134
|
+
ASSERT(current != end);
|
|
135
|
+
|
|
136
|
+
// Skip leading 0s.
|
|
137
|
+
while (*current == '0') {
|
|
138
|
+
++current;
|
|
139
|
+
if (current == end) return SignedZero(negative);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
int64_t number = 0;
|
|
143
|
+
int exponent = 0;
|
|
144
|
+
const int radix = (1 << radix_log_2);
|
|
145
|
+
|
|
146
|
+
do {
|
|
147
|
+
int digit;
|
|
148
|
+
if (*current >= '0' && *current <= '9' && *current < '0' + radix) {
|
|
149
|
+
digit = static_cast<char>(*current) - '0';
|
|
150
|
+
} else if (radix > 10 && *current >= 'a' && *current < 'a' + radix - 10) {
|
|
151
|
+
digit = static_cast<char>(*current) - 'a' + 10;
|
|
152
|
+
} else if (radix > 10 && *current >= 'A' && *current < 'A' + radix - 10) {
|
|
153
|
+
digit = static_cast<char>(*current) - 'A' + 10;
|
|
154
|
+
} else {
|
|
155
|
+
if (allow_trailing_junk ||
|
|
156
|
+
!AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
157
|
+
break;
|
|
158
|
+
} else {
|
|
159
|
+
return JunkStringValue();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
number = number * radix + digit;
|
|
164
|
+
int overflow = static_cast<int>(number >> 53);
|
|
165
|
+
if (overflow != 0) {
|
|
166
|
+
// Overflow occurred. Need to determine which direction to round the
|
|
167
|
+
// result.
|
|
168
|
+
int overflow_bits_count = 1;
|
|
169
|
+
while (overflow > 1) {
|
|
170
|
+
overflow_bits_count++;
|
|
171
|
+
overflow >>= 1;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
int dropped_bits_mask = ((1 << overflow_bits_count) - 1);
|
|
175
|
+
int dropped_bits = static_cast<int>(number) & dropped_bits_mask;
|
|
176
|
+
number >>= overflow_bits_count;
|
|
177
|
+
exponent = overflow_bits_count;
|
|
178
|
+
|
|
179
|
+
bool zero_tail = true;
|
|
180
|
+
while (true) {
|
|
181
|
+
++current;
|
|
182
|
+
if (current == end || !isDigit(*current, radix)) break;
|
|
183
|
+
zero_tail = zero_tail && *current == '0';
|
|
184
|
+
exponent += radix_log_2;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
if (!allow_trailing_junk &&
|
|
188
|
+
AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
189
|
+
return JunkStringValue();
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
int middle_value = (1 << (overflow_bits_count - 1));
|
|
193
|
+
if (dropped_bits > middle_value) {
|
|
194
|
+
number++; // Rounding up.
|
|
195
|
+
} else if (dropped_bits == middle_value) {
|
|
196
|
+
// Rounding to even to consistency with decimals: half-way case rounds
|
|
197
|
+
// up if significant part is odd and down otherwise.
|
|
198
|
+
if ((number & 1) != 0 || !zero_tail) {
|
|
199
|
+
number++; // Rounding up.
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Rounding up may cause overflow.
|
|
204
|
+
if ((number & ((int64_t)1 << 53)) != 0) {
|
|
205
|
+
exponent++;
|
|
206
|
+
number >>= 1;
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
}
|
|
210
|
+
++current;
|
|
211
|
+
} while (current != end);
|
|
212
|
+
|
|
213
|
+
ASSERT(number < ((int64_t)1 << 53));
|
|
214
|
+
ASSERT(static_cast<int64_t>(static_cast<double>(number)) == number);
|
|
215
|
+
|
|
216
|
+
if (exponent == 0) {
|
|
217
|
+
if (negative) {
|
|
218
|
+
if (number == 0) return -0.0;
|
|
219
|
+
number = -number;
|
|
220
|
+
}
|
|
221
|
+
return static_cast<double>(number);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
ASSERT(number != 0);
|
|
225
|
+
// The double could be constructed faster from number (mantissa), exponent
|
|
226
|
+
// and sign. Assuming it's a rare case more simple code is used.
|
|
227
|
+
return static_cast<double>(negative ? -number : number) * pow(2.0, exponent);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
template <class Iterator, class EndMark>
|
|
232
|
+
static double InternalStringToInt(UnicodeCache* unicode_cache,
|
|
233
|
+
Iterator current,
|
|
234
|
+
EndMark end,
|
|
235
|
+
int radix) {
|
|
236
|
+
const bool allow_trailing_junk = true;
|
|
237
|
+
const double empty_string_val = JunkStringValue();
|
|
238
|
+
|
|
239
|
+
if (!AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
240
|
+
return empty_string_val;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
bool negative = false;
|
|
244
|
+
bool leading_zero = false;
|
|
245
|
+
|
|
246
|
+
if (*current == '+') {
|
|
247
|
+
// Ignore leading sign; skip following spaces.
|
|
248
|
+
++current;
|
|
249
|
+
if (current == end) {
|
|
250
|
+
return JunkStringValue();
|
|
251
|
+
}
|
|
252
|
+
} else if (*current == '-') {
|
|
253
|
+
++current;
|
|
254
|
+
if (current == end) {
|
|
255
|
+
return JunkStringValue();
|
|
256
|
+
}
|
|
257
|
+
negative = true;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
if (radix == 0) {
|
|
261
|
+
// Radix detection.
|
|
262
|
+
if (*current == '0') {
|
|
263
|
+
++current;
|
|
264
|
+
if (current == end) return SignedZero(negative);
|
|
265
|
+
if (*current == 'x' || *current == 'X') {
|
|
266
|
+
radix = 16;
|
|
267
|
+
++current;
|
|
268
|
+
if (current == end) return JunkStringValue();
|
|
269
|
+
} else {
|
|
270
|
+
radix = 8;
|
|
271
|
+
leading_zero = true;
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
radix = 10;
|
|
275
|
+
}
|
|
276
|
+
} else if (radix == 16) {
|
|
277
|
+
if (*current == '0') {
|
|
278
|
+
// Allow "0x" prefix.
|
|
279
|
+
++current;
|
|
280
|
+
if (current == end) return SignedZero(negative);
|
|
281
|
+
if (*current == 'x' || *current == 'X') {
|
|
282
|
+
++current;
|
|
283
|
+
if (current == end) return JunkStringValue();
|
|
284
|
+
} else {
|
|
285
|
+
leading_zero = true;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
if (radix < 2 || radix > 36) return JunkStringValue();
|
|
291
|
+
|
|
292
|
+
// Skip leading zeros.
|
|
293
|
+
while (*current == '0') {
|
|
294
|
+
leading_zero = true;
|
|
295
|
+
++current;
|
|
296
|
+
if (current == end) return SignedZero(negative);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
if (!leading_zero && !isDigit(*current, radix)) {
|
|
300
|
+
return JunkStringValue();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
if (IsPowerOf2(radix)) {
|
|
304
|
+
switch (radix) {
|
|
305
|
+
case 2:
|
|
306
|
+
return InternalStringToIntDouble<1>(
|
|
307
|
+
unicode_cache, current, end, negative, allow_trailing_junk);
|
|
308
|
+
case 4:
|
|
309
|
+
return InternalStringToIntDouble<2>(
|
|
310
|
+
unicode_cache, current, end, negative, allow_trailing_junk);
|
|
311
|
+
case 8:
|
|
312
|
+
return InternalStringToIntDouble<3>(
|
|
313
|
+
unicode_cache, current, end, negative, allow_trailing_junk);
|
|
314
|
+
|
|
315
|
+
case 16:
|
|
316
|
+
return InternalStringToIntDouble<4>(
|
|
317
|
+
unicode_cache, current, end, negative, allow_trailing_junk);
|
|
318
|
+
|
|
319
|
+
case 32:
|
|
320
|
+
return InternalStringToIntDouble<5>(
|
|
321
|
+
unicode_cache, current, end, negative, allow_trailing_junk);
|
|
322
|
+
default:
|
|
323
|
+
UNREACHABLE();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
if (radix == 10) {
|
|
328
|
+
// Parsing with strtod.
|
|
329
|
+
const int kMaxSignificantDigits = 309; // Doubles are less than 1.8e308.
|
|
330
|
+
// The buffer may contain up to kMaxSignificantDigits + 1 digits and a zero
|
|
331
|
+
// end.
|
|
332
|
+
const int kBufferSize = kMaxSignificantDigits + 2;
|
|
333
|
+
char buffer[kBufferSize];
|
|
334
|
+
int buffer_pos = 0;
|
|
335
|
+
while (*current >= '0' && *current <= '9') {
|
|
336
|
+
if (buffer_pos <= kMaxSignificantDigits) {
|
|
337
|
+
// If the number has more than kMaxSignificantDigits it will be parsed
|
|
338
|
+
// as infinity.
|
|
339
|
+
ASSERT(buffer_pos < kBufferSize);
|
|
340
|
+
buffer[buffer_pos++] = static_cast<char>(*current);
|
|
341
|
+
}
|
|
342
|
+
++current;
|
|
343
|
+
if (current == end) break;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
if (!allow_trailing_junk &&
|
|
347
|
+
AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
348
|
+
return JunkStringValue();
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
ASSERT(buffer_pos < kBufferSize);
|
|
352
|
+
buffer[buffer_pos] = '\0';
|
|
353
|
+
Vector<const char> buffer_vector(buffer, buffer_pos);
|
|
354
|
+
return negative ? -Strtod(buffer_vector, 0) : Strtod(buffer_vector, 0);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
// The following code causes accumulating rounding error for numbers greater
|
|
358
|
+
// than ~2^56. It's explicitly allowed in the spec: "if R is not 2, 4, 8, 10,
|
|
359
|
+
// 16, or 32, then mathInt may be an implementation-dependent approximation to
|
|
360
|
+
// the mathematical integer value" (15.1.2.2).
|
|
361
|
+
|
|
362
|
+
int lim_0 = '0' + (radix < 10 ? radix : 10);
|
|
363
|
+
int lim_a = 'a' + (radix - 10);
|
|
364
|
+
int lim_A = 'A' + (radix - 10);
|
|
365
|
+
|
|
366
|
+
// NOTE: The code for computing the value may seem a bit complex at
|
|
367
|
+
// first glance. It is structured to use 32-bit multiply-and-add
|
|
368
|
+
// loops as long as possible to avoid loosing precision.
|
|
369
|
+
|
|
370
|
+
double v = 0.0;
|
|
371
|
+
bool done = false;
|
|
372
|
+
do {
|
|
373
|
+
// Parse the longest part of the string starting at index j
|
|
374
|
+
// possible while keeping the multiplier, and thus the part
|
|
375
|
+
// itself, within 32 bits.
|
|
376
|
+
unsigned int part = 0, multiplier = 1;
|
|
377
|
+
while (true) {
|
|
378
|
+
int d;
|
|
379
|
+
if (*current >= '0' && *current < lim_0) {
|
|
380
|
+
d = *current - '0';
|
|
381
|
+
} else if (*current >= 'a' && *current < lim_a) {
|
|
382
|
+
d = *current - 'a' + 10;
|
|
383
|
+
} else if (*current >= 'A' && *current < lim_A) {
|
|
384
|
+
d = *current - 'A' + 10;
|
|
385
|
+
} else {
|
|
386
|
+
done = true;
|
|
387
|
+
break;
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Update the value of the part as long as the multiplier fits
|
|
391
|
+
// in 32 bits. When we can't guarantee that the next iteration
|
|
392
|
+
// will not overflow the multiplier, we stop parsing the part
|
|
393
|
+
// by leaving the loop.
|
|
394
|
+
const unsigned int kMaximumMultiplier = 0xffffffffU / 36;
|
|
395
|
+
uint32_t m = multiplier * radix;
|
|
396
|
+
if (m > kMaximumMultiplier) break;
|
|
397
|
+
part = part * radix + d;
|
|
398
|
+
multiplier = m;
|
|
399
|
+
ASSERT(multiplier > part);
|
|
400
|
+
|
|
401
|
+
++current;
|
|
402
|
+
if (current == end) {
|
|
403
|
+
done = true;
|
|
404
|
+
break;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Update the value and skip the part in the string.
|
|
409
|
+
v = v * multiplier + part;
|
|
410
|
+
} while (!done);
|
|
411
|
+
|
|
412
|
+
if (!allow_trailing_junk &&
|
|
413
|
+
AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
414
|
+
return JunkStringValue();
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return negative ? -v : v;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
// Converts a string to a double value. Assumes the Iterator supports
|
|
422
|
+
// the following operations:
|
|
423
|
+
// 1. current == end (other ops are not allowed), current != end.
|
|
424
|
+
// 2. *current - gets the current character in the sequence.
|
|
425
|
+
// 3. ++current (advances the position).
|
|
426
|
+
template <class Iterator, class EndMark>
|
|
427
|
+
static double InternalStringToDouble(UnicodeCache* unicode_cache,
|
|
428
|
+
Iterator current,
|
|
429
|
+
EndMark end,
|
|
430
|
+
int flags,
|
|
431
|
+
double empty_string_val) {
|
|
432
|
+
// To make sure that iterator dereferencing is valid the following
|
|
433
|
+
// convention is used:
|
|
434
|
+
// 1. Each '++current' statement is followed by check for equality to 'end'.
|
|
435
|
+
// 2. If AdvanceToNonspace returned false then current == end.
|
|
436
|
+
// 3. If 'current' becomes be equal to 'end' the function returns or goes to
|
|
437
|
+
// 'parsing_done'.
|
|
438
|
+
// 4. 'current' is not dereferenced after the 'parsing_done' label.
|
|
439
|
+
// 5. Code before 'parsing_done' may rely on 'current != end'.
|
|
440
|
+
if (!AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
441
|
+
return empty_string_val;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
const bool allow_trailing_junk = (flags & ALLOW_TRAILING_JUNK) != 0;
|
|
445
|
+
|
|
446
|
+
// The longest form of simplified number is: "-<significant digits>'.1eXXX\0".
|
|
447
|
+
const int kBufferSize = kMaxSignificantDigits + 10;
|
|
448
|
+
char buffer[kBufferSize]; // NOLINT: size is known at compile time.
|
|
449
|
+
int buffer_pos = 0;
|
|
450
|
+
|
|
451
|
+
// Exponent will be adjusted if insignificant digits of the integer part
|
|
452
|
+
// or insignificant leading zeros of the fractional part are dropped.
|
|
453
|
+
int exponent = 0;
|
|
454
|
+
int significant_digits = 0;
|
|
455
|
+
int insignificant_digits = 0;
|
|
456
|
+
bool nonzero_digit_dropped = false;
|
|
457
|
+
|
|
458
|
+
bool negative = false;
|
|
459
|
+
|
|
460
|
+
if (*current == '+') {
|
|
461
|
+
// Ignore leading sign.
|
|
462
|
+
++current;
|
|
463
|
+
if (current == end) return JunkStringValue();
|
|
464
|
+
} else if (*current == '-') {
|
|
465
|
+
++current;
|
|
466
|
+
if (current == end) return JunkStringValue();
|
|
467
|
+
negative = true;
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
static const char kInfinitySymbol[] = "Infinity";
|
|
471
|
+
if (*current == kInfinitySymbol[0]) {
|
|
472
|
+
if (!SubStringEquals(¤t, end, kInfinitySymbol)) {
|
|
473
|
+
return JunkStringValue();
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (!allow_trailing_junk &&
|
|
477
|
+
AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
478
|
+
return JunkStringValue();
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
ASSERT(buffer_pos == 0);
|
|
482
|
+
return negative ? -V8_INFINITY : V8_INFINITY;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
bool leading_zero = false;
|
|
486
|
+
if (*current == '0') {
|
|
487
|
+
++current;
|
|
488
|
+
if (current == end) return SignedZero(negative);
|
|
489
|
+
|
|
490
|
+
leading_zero = true;
|
|
491
|
+
|
|
492
|
+
// It could be hexadecimal value.
|
|
493
|
+
if ((flags & ALLOW_HEX) && (*current == 'x' || *current == 'X')) {
|
|
494
|
+
++current;
|
|
495
|
+
if (current == end || !isDigit(*current, 16)) {
|
|
496
|
+
return JunkStringValue(); // "0x".
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return InternalStringToIntDouble<4>(unicode_cache,
|
|
500
|
+
current,
|
|
501
|
+
end,
|
|
502
|
+
negative,
|
|
503
|
+
allow_trailing_junk);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
// Ignore leading zeros in the integer part.
|
|
507
|
+
while (*current == '0') {
|
|
508
|
+
++current;
|
|
509
|
+
if (current == end) return SignedZero(negative);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
bool octal = leading_zero && (flags & ALLOW_OCTALS) != 0;
|
|
514
|
+
|
|
515
|
+
// Copy significant digits of the integer part (if any) to the buffer.
|
|
516
|
+
while (*current >= '0' && *current <= '9') {
|
|
517
|
+
if (significant_digits < kMaxSignificantDigits) {
|
|
518
|
+
ASSERT(buffer_pos < kBufferSize);
|
|
519
|
+
buffer[buffer_pos++] = static_cast<char>(*current);
|
|
520
|
+
significant_digits++;
|
|
521
|
+
// Will later check if it's an octal in the buffer.
|
|
522
|
+
} else {
|
|
523
|
+
insignificant_digits++; // Move the digit into the exponential part.
|
|
524
|
+
nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
|
|
525
|
+
}
|
|
526
|
+
octal = octal && *current < '8';
|
|
527
|
+
++current;
|
|
528
|
+
if (current == end) goto parsing_done;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
if (significant_digits == 0) {
|
|
532
|
+
octal = false;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
if (*current == '.') {
|
|
536
|
+
if (octal && !allow_trailing_junk) return JunkStringValue();
|
|
537
|
+
if (octal) goto parsing_done;
|
|
538
|
+
|
|
539
|
+
++current;
|
|
540
|
+
if (current == end) {
|
|
541
|
+
if (significant_digits == 0 && !leading_zero) {
|
|
542
|
+
return JunkStringValue();
|
|
543
|
+
} else {
|
|
544
|
+
goto parsing_done;
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
if (significant_digits == 0) {
|
|
549
|
+
// octal = false;
|
|
550
|
+
// Integer part consists of 0 or is absent. Significant digits start after
|
|
551
|
+
// leading zeros (if any).
|
|
552
|
+
while (*current == '0') {
|
|
553
|
+
++current;
|
|
554
|
+
if (current == end) return SignedZero(negative);
|
|
555
|
+
exponent--; // Move this 0 into the exponent.
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
// There is a fractional part. We don't emit a '.', but adjust the exponent
|
|
560
|
+
// instead.
|
|
561
|
+
while (*current >= '0' && *current <= '9') {
|
|
562
|
+
if (significant_digits < kMaxSignificantDigits) {
|
|
563
|
+
ASSERT(buffer_pos < kBufferSize);
|
|
564
|
+
buffer[buffer_pos++] = static_cast<char>(*current);
|
|
565
|
+
significant_digits++;
|
|
566
|
+
exponent--;
|
|
567
|
+
} else {
|
|
568
|
+
// Ignore insignificant digits in the fractional part.
|
|
569
|
+
nonzero_digit_dropped = nonzero_digit_dropped || *current != '0';
|
|
570
|
+
}
|
|
571
|
+
++current;
|
|
572
|
+
if (current == end) goto parsing_done;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
if (!leading_zero && exponent == 0 && significant_digits == 0) {
|
|
577
|
+
// If leading_zeros is true then the string contains zeros.
|
|
578
|
+
// If exponent < 0 then string was [+-]\.0*...
|
|
579
|
+
// If significant_digits != 0 the string is not equal to 0.
|
|
580
|
+
// Otherwise there are no digits in the string.
|
|
581
|
+
return JunkStringValue();
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// Parse exponential part.
|
|
585
|
+
if (*current == 'e' || *current == 'E') {
|
|
586
|
+
if (octal) return JunkStringValue();
|
|
587
|
+
++current;
|
|
588
|
+
if (current == end) {
|
|
589
|
+
if (allow_trailing_junk) {
|
|
590
|
+
goto parsing_done;
|
|
591
|
+
} else {
|
|
592
|
+
return JunkStringValue();
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
char sign = '+';
|
|
596
|
+
if (*current == '+' || *current == '-') {
|
|
597
|
+
sign = static_cast<char>(*current);
|
|
598
|
+
++current;
|
|
599
|
+
if (current == end) {
|
|
600
|
+
if (allow_trailing_junk) {
|
|
601
|
+
goto parsing_done;
|
|
602
|
+
} else {
|
|
603
|
+
return JunkStringValue();
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
if (current == end || *current < '0' || *current > '9') {
|
|
609
|
+
if (allow_trailing_junk) {
|
|
610
|
+
goto parsing_done;
|
|
611
|
+
} else {
|
|
612
|
+
return JunkStringValue();
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
const int max_exponent = INT_MAX / 2;
|
|
617
|
+
ASSERT(-max_exponent / 2 <= exponent && exponent <= max_exponent / 2);
|
|
618
|
+
int num = 0;
|
|
619
|
+
do {
|
|
620
|
+
// Check overflow.
|
|
621
|
+
int digit = *current - '0';
|
|
622
|
+
if (num >= max_exponent / 10
|
|
623
|
+
&& !(num == max_exponent / 10 && digit <= max_exponent % 10)) {
|
|
624
|
+
num = max_exponent;
|
|
625
|
+
} else {
|
|
626
|
+
num = num * 10 + digit;
|
|
627
|
+
}
|
|
628
|
+
++current;
|
|
629
|
+
} while (current != end && *current >= '0' && *current <= '9');
|
|
630
|
+
|
|
631
|
+
exponent += (sign == '-' ? -num : num);
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
if (!allow_trailing_junk &&
|
|
635
|
+
AdvanceToNonspace(unicode_cache, ¤t, end)) {
|
|
636
|
+
return JunkStringValue();
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
parsing_done:
|
|
640
|
+
exponent += insignificant_digits;
|
|
641
|
+
|
|
642
|
+
if (octal) {
|
|
643
|
+
return InternalStringToIntDouble<3>(unicode_cache,
|
|
644
|
+
buffer,
|
|
645
|
+
buffer + buffer_pos,
|
|
646
|
+
negative,
|
|
647
|
+
allow_trailing_junk);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
if (nonzero_digit_dropped) {
|
|
651
|
+
buffer[buffer_pos++] = '1';
|
|
652
|
+
exponent--;
|
|
653
|
+
}
|
|
654
|
+
|
|
655
|
+
ASSERT(buffer_pos < kBufferSize);
|
|
656
|
+
buffer[buffer_pos] = '\0';
|
|
657
|
+
|
|
658
|
+
double converted = Strtod(Vector<const char>(buffer, buffer_pos), exponent);
|
|
659
|
+
return negative ? -converted : converted;
|
|
660
|
+
}
|
|
661
|
+
|
|
104
662
|
} } // namespace v8::internal
|
|
105
663
|
|
|
106
664
|
#endif // V8_CONVERSIONS_INL_H_
|