libv8 3.3.10.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +8 -0
- data/.gitmodules +3 -0
- data/Gemfile +4 -0
- data/README.md +44 -0
- data/Rakefile +73 -0
- data/ext/libv8/extconf.rb +9 -0
- data/lib/libv8.rb +15 -0
- data/lib/libv8/Makefile +38 -0
- data/lib/libv8/detect_cpu.rb +27 -0
- data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
- data/lib/libv8/scons/CHANGES.txt +5334 -0
- data/lib/libv8/scons/LICENSE.txt +20 -0
- data/lib/libv8/scons/MANIFEST +199 -0
- data/lib/libv8/scons/PKG-INFO +13 -0
- data/lib/libv8/scons/README.txt +243 -0
- data/lib/libv8/scons/RELEASE.txt +98 -0
- data/lib/libv8/scons/engine/SCons/Action.py +1241 -0
- data/lib/libv8/scons/engine/SCons/Builder.py +877 -0
- data/lib/libv8/scons/engine/SCons/CacheDir.py +216 -0
- data/lib/libv8/scons/engine/SCons/Conftest.py +793 -0
- data/lib/libv8/scons/engine/SCons/Debug.py +220 -0
- data/lib/libv8/scons/engine/SCons/Defaults.py +480 -0
- data/lib/libv8/scons/engine/SCons/Environment.py +2318 -0
- data/lib/libv8/scons/engine/SCons/Errors.py +205 -0
- data/lib/libv8/scons/engine/SCons/Executor.py +633 -0
- data/lib/libv8/scons/engine/SCons/Job.py +435 -0
- data/lib/libv8/scons/engine/SCons/Memoize.py +244 -0
- data/lib/libv8/scons/engine/SCons/Node/Alias.py +152 -0
- data/lib/libv8/scons/engine/SCons/Node/FS.py +3142 -0
- data/lib/libv8/scons/engine/SCons/Node/Python.py +128 -0
- data/lib/libv8/scons/engine/SCons/Node/__init__.py +1328 -0
- data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +50 -0
- data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +50 -0
- data/lib/libv8/scons/engine/SCons/Options/ListOption.py +50 -0
- data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +50 -0
- data/lib/libv8/scons/engine/SCons/Options/PathOption.py +76 -0
- data/lib/libv8/scons/engine/SCons/Options/__init__.py +67 -0
- data/lib/libv8/scons/engine/SCons/PathList.py +231 -0
- data/lib/libv8/scons/engine/SCons/Platform/__init__.py +241 -0
- data/lib/libv8/scons/engine/SCons/Platform/aix.py +69 -0
- data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +55 -0
- data/lib/libv8/scons/engine/SCons/Platform/darwin.py +46 -0
- data/lib/libv8/scons/engine/SCons/Platform/hpux.py +46 -0
- data/lib/libv8/scons/engine/SCons/Platform/irix.py +44 -0
- data/lib/libv8/scons/engine/SCons/Platform/os2.py +58 -0
- data/lib/libv8/scons/engine/SCons/Platform/posix.py +263 -0
- data/lib/libv8/scons/engine/SCons/Platform/sunos.py +50 -0
- data/lib/libv8/scons/engine/SCons/Platform/win32.py +385 -0
- data/lib/libv8/scons/engine/SCons/SConf.py +1030 -0
- data/lib/libv8/scons/engine/SCons/SConsign.py +383 -0
- data/lib/libv8/scons/engine/SCons/Scanner/C.py +132 -0
- data/lib/libv8/scons/engine/SCons/Scanner/D.py +73 -0
- data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +109 -0
- data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +316 -0
- data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +48 -0
- data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +384 -0
- data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +101 -0
- data/lib/libv8/scons/engine/SCons/Scanner/RC.py +55 -0
- data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +413 -0
- data/lib/libv8/scons/engine/SCons/Script/Interactive.py +384 -0
- data/lib/libv8/scons/engine/SCons/Script/Main.py +1334 -0
- data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +939 -0
- data/lib/libv8/scons/engine/SCons/Script/SConscript.py +640 -0
- data/lib/libv8/scons/engine/SCons/Script/__init__.py +412 -0
- data/lib/libv8/scons/engine/SCons/Sig.py +63 -0
- data/lib/libv8/scons/engine/SCons/Subst.py +904 -0
- data/lib/libv8/scons/engine/SCons/Taskmaster.py +1017 -0
- data/lib/libv8/scons/engine/SCons/Tool/386asm.py +61 -0
- data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +67 -0
- data/lib/libv8/scons/engine/SCons/Tool/CVS.py +73 -0
- data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +246 -0
- data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +323 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +56 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +61 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +240 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +82 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +391 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +456 -0
- data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +499 -0
- data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +103 -0
- data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +137 -0
- data/lib/libv8/scons/engine/SCons/Tool/RCS.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +71 -0
- data/lib/libv8/scons/engine/SCons/Tool/__init__.py +681 -0
- data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +82 -0
- data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +74 -0
- data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +80 -0
- data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +76 -0
- data/lib/libv8/scons/engine/SCons/Tool/applelink.py +71 -0
- data/lib/libv8/scons/engine/SCons/Tool/ar.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/as.py +78 -0
- data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +81 -0
- data/lib/libv8/scons/engine/SCons/Tool/c++.py +99 -0
- data/lib/libv8/scons/engine/SCons/Tool/cc.py +102 -0
- data/lib/libv8/scons/engine/SCons/Tool/cvf.py +58 -0
- data/lib/libv8/scons/engine/SCons/Tool/default.py +50 -0
- data/lib/libv8/scons/engine/SCons/Tool/dmd.py +223 -0
- data/lib/libv8/scons/engine/SCons/Tool/dvi.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +124 -0
- data/lib/libv8/scons/engine/SCons/Tool/dvips.py +94 -0
- data/lib/libv8/scons/engine/SCons/Tool/f77.py +62 -0
- data/lib/libv8/scons/engine/SCons/Tool/f90.py +62 -0
- data/lib/libv8/scons/engine/SCons/Tool/f95.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +98 -0
- data/lib/libv8/scons/engine/SCons/Tool/fortran.py +62 -0
- data/lib/libv8/scons/engine/SCons/Tool/g++.py +90 -0
- data/lib/libv8/scons/engine/SCons/Tool/g77.py +73 -0
- data/lib/libv8/scons/engine/SCons/Tool/gas.py +53 -0
- data/lib/libv8/scons/engine/SCons/Tool/gcc.py +80 -0
- data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/gs.py +81 -0
- data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +84 -0
- data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +53 -0
- data/lib/libv8/scons/engine/SCons/Tool/hplink.py +77 -0
- data/lib/libv8/scons/engine/SCons/Tool/icc.py +59 -0
- data/lib/libv8/scons/engine/SCons/Tool/icl.py +52 -0
- data/lib/libv8/scons/engine/SCons/Tool/ifl.py +72 -0
- data/lib/libv8/scons/engine/SCons/Tool/ifort.py +88 -0
- data/lib/libv8/scons/engine/SCons/Tool/ilink.py +59 -0
- data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +60 -0
- data/lib/libv8/scons/engine/SCons/Tool/install.py +229 -0
- data/lib/libv8/scons/engine/SCons/Tool/intelc.py +482 -0
- data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +67 -0
- data/lib/libv8/scons/engine/SCons/Tool/jar.py +110 -0
- data/lib/libv8/scons/engine/SCons/Tool/javac.py +230 -0
- data/lib/libv8/scons/engine/SCons/Tool/javah.py +137 -0
- data/lib/libv8/scons/engine/SCons/Tool/latex.py +79 -0
- data/lib/libv8/scons/engine/SCons/Tool/lex.py +97 -0
- data/lib/libv8/scons/engine/SCons/Tool/link.py +121 -0
- data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +112 -0
- data/lib/libv8/scons/engine/SCons/Tool/m4.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/masm.py +77 -0
- data/lib/libv8/scons/engine/SCons/Tool/midl.py +88 -0
- data/lib/libv8/scons/engine/SCons/Tool/mingw.py +158 -0
- data/lib/libv8/scons/engine/SCons/Tool/mslib.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/mslink.py +266 -0
- data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +50 -0
- data/lib/libv8/scons/engine/SCons/Tool/msvc.py +268 -0
- data/lib/libv8/scons/engine/SCons/Tool/msvs.py +1388 -0
- data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +207 -0
- data/lib/libv8/scons/engine/SCons/Tool/mwld.py +107 -0
- data/lib/libv8/scons/engine/SCons/Tool/nasm.py +72 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +312 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +185 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +527 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +365 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +43 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +43 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +43 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +44 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +44 -0
- data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +44 -0
- data/lib/libv8/scons/engine/SCons/Tool/pdf.py +78 -0
- data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +83 -0
- data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +108 -0
- data/lib/libv8/scons/engine/SCons/Tool/qt.py +336 -0
- data/lib/libv8/scons/engine/SCons/Tool/rmic.py +120 -0
- data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +70 -0
- data/lib/libv8/scons/engine/SCons/Tool/rpm.py +132 -0
- data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +68 -0
- data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +58 -0
- data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +53 -0
- data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunar.py +67 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +142 -0
- data/lib/libv8/scons/engine/SCons/Tool/suncc.py +58 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +63 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +64 -0
- data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +77 -0
- data/lib/libv8/scons/engine/SCons/Tool/swig.py +182 -0
- data/lib/libv8/scons/engine/SCons/Tool/tar.py +73 -0
- data/lib/libv8/scons/engine/SCons/Tool/tex.py +813 -0
- data/lib/libv8/scons/engine/SCons/Tool/textfile.py +175 -0
- data/lib/libv8/scons/engine/SCons/Tool/tlib.py +53 -0
- data/lib/libv8/scons/engine/SCons/Tool/wix.py +99 -0
- data/lib/libv8/scons/engine/SCons/Tool/yacc.py +130 -0
- data/lib/libv8/scons/engine/SCons/Tool/zip.py +99 -0
- data/lib/libv8/scons/engine/SCons/Util.py +1492 -0
- data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +89 -0
- data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +103 -0
- data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +135 -0
- data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +106 -0
- data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +147 -0
- data/lib/libv8/scons/engine/SCons/Variables/__init__.py +312 -0
- data/lib/libv8/scons/engine/SCons/Warnings.py +246 -0
- data/lib/libv8/scons/engine/SCons/__init__.py +49 -0
- data/lib/libv8/scons/engine/SCons/compat/__init__.py +237 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +150 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +45 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +45 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +76 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +45 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_sets.py +563 -0
- data/lib/libv8/scons/engine/SCons/compat/_scons_subprocess.py +1281 -0
- data/lib/libv8/scons/engine/SCons/cpp.py +589 -0
- data/lib/libv8/scons/engine/SCons/dblite.py +251 -0
- data/lib/libv8/scons/engine/SCons/exitfuncs.py +77 -0
- data/lib/libv8/scons/os_spawnv_fix.diff +83 -0
- data/lib/libv8/scons/scons-time.1 +1017 -0
- data/lib/libv8/scons/scons.1 +15219 -0
- data/lib/libv8/scons/sconsign.1 +208 -0
- data/lib/libv8/scons/script/scons +196 -0
- data/lib/libv8/scons/script/scons-time +1544 -0
- data/lib/libv8/scons/script/scons.bat +31 -0
- data/lib/libv8/scons/script/sconsign +513 -0
- data/lib/libv8/scons/setup.cfg +6 -0
- data/lib/libv8/scons/setup.py +425 -0
- data/lib/libv8/v8/.gitignore +35 -0
- data/lib/libv8/v8/AUTHORS +44 -0
- data/lib/libv8/v8/ChangeLog +2839 -0
- data/lib/libv8/v8/LICENSE +52 -0
- data/lib/libv8/v8/LICENSE.strongtalk +29 -0
- data/lib/libv8/v8/LICENSE.v8 +26 -0
- data/lib/libv8/v8/LICENSE.valgrind +45 -0
- data/lib/libv8/v8/SConstruct +1478 -0
- data/lib/libv8/v8/build/README.txt +49 -0
- data/lib/libv8/v8/build/all.gyp +18 -0
- data/lib/libv8/v8/build/armu.gypi +32 -0
- data/lib/libv8/v8/build/common.gypi +144 -0
- data/lib/libv8/v8/build/gyp_v8 +145 -0
- data/lib/libv8/v8/include/v8-debug.h +395 -0
- data/lib/libv8/v8/include/v8-preparser.h +117 -0
- data/lib/libv8/v8/include/v8-profiler.h +505 -0
- data/lib/libv8/v8/include/v8-testing.h +104 -0
- data/lib/libv8/v8/include/v8.h +4124 -0
- data/lib/libv8/v8/include/v8stdint.h +53 -0
- data/lib/libv8/v8/preparser/SConscript +38 -0
- data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
- data/lib/libv8/v8/src/SConscript +368 -0
- data/lib/libv8/v8/src/accessors.cc +767 -0
- data/lib/libv8/v8/src/accessors.h +123 -0
- data/lib/libv8/v8/src/allocation-inl.h +49 -0
- data/lib/libv8/v8/src/allocation.cc +122 -0
- data/lib/libv8/v8/src/allocation.h +143 -0
- data/lib/libv8/v8/src/api.cc +5845 -0
- data/lib/libv8/v8/src/api.h +574 -0
- data/lib/libv8/v8/src/apinatives.js +110 -0
- data/lib/libv8/v8/src/apiutils.h +73 -0
- data/lib/libv8/v8/src/arguments.h +118 -0
- data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
- data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
- data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
- data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
- data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
- data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
- data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
- data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
- data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
- data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
- data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
- data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
- data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
- data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
- data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
- data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
- data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
- data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
- data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
- data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
- data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
- data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
- data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
- data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
- data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
- data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
- data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
- data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
- data/lib/libv8/v8/src/array.js +1366 -0
- data/lib/libv8/v8/src/assembler.cc +1207 -0
- data/lib/libv8/v8/src/assembler.h +858 -0
- data/lib/libv8/v8/src/ast-inl.h +112 -0
- data/lib/libv8/v8/src/ast.cc +1146 -0
- data/lib/libv8/v8/src/ast.h +2188 -0
- data/lib/libv8/v8/src/atomicops.h +167 -0
- data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
- data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
- data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
- data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
- data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
- data/lib/libv8/v8/src/bignum.cc +768 -0
- data/lib/libv8/v8/src/bignum.h +140 -0
- data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
- data/lib/libv8/v8/src/bootstrapper.h +188 -0
- data/lib/libv8/v8/src/builtins.cc +1707 -0
- data/lib/libv8/v8/src/builtins.h +371 -0
- data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
- data/lib/libv8/v8/src/cached-powers.cc +177 -0
- data/lib/libv8/v8/src/cached-powers.h +65 -0
- data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
- data/lib/libv8/v8/src/char-predicates.h +67 -0
- data/lib/libv8/v8/src/checks.cc +110 -0
- data/lib/libv8/v8/src/checks.h +296 -0
- data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
- data/lib/libv8/v8/src/circular-queue.cc +122 -0
- data/lib/libv8/v8/src/circular-queue.h +103 -0
- data/lib/libv8/v8/src/code-stubs.cc +267 -0
- data/lib/libv8/v8/src/code-stubs.h +1011 -0
- data/lib/libv8/v8/src/code.h +70 -0
- data/lib/libv8/v8/src/codegen.cc +231 -0
- data/lib/libv8/v8/src/codegen.h +84 -0
- data/lib/libv8/v8/src/compilation-cache.cc +540 -0
- data/lib/libv8/v8/src/compilation-cache.h +287 -0
- data/lib/libv8/v8/src/compiler.cc +786 -0
- data/lib/libv8/v8/src/compiler.h +312 -0
- data/lib/libv8/v8/src/contexts.cc +347 -0
- data/lib/libv8/v8/src/contexts.h +391 -0
- data/lib/libv8/v8/src/conversions-inl.h +106 -0
- data/lib/libv8/v8/src/conversions.cc +1131 -0
- data/lib/libv8/v8/src/conversions.h +135 -0
- data/lib/libv8/v8/src/counters.cc +93 -0
- data/lib/libv8/v8/src/counters.h +254 -0
- data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
- data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
- data/lib/libv8/v8/src/cpu-profiler.h +302 -0
- data/lib/libv8/v8/src/cpu.h +69 -0
- data/lib/libv8/v8/src/d8-debug.cc +367 -0
- data/lib/libv8/v8/src/d8-debug.h +158 -0
- data/lib/libv8/v8/src/d8-posix.cc +695 -0
- data/lib/libv8/v8/src/d8-readline.cc +130 -0
- data/lib/libv8/v8/src/d8-windows.cc +42 -0
- data/lib/libv8/v8/src/d8.cc +803 -0
- data/lib/libv8/v8/src/d8.gyp +91 -0
- data/lib/libv8/v8/src/d8.h +235 -0
- data/lib/libv8/v8/src/d8.js +2798 -0
- data/lib/libv8/v8/src/data-flow.cc +66 -0
- data/lib/libv8/v8/src/data-flow.h +205 -0
- data/lib/libv8/v8/src/date.js +1103 -0
- data/lib/libv8/v8/src/dateparser-inl.h +127 -0
- data/lib/libv8/v8/src/dateparser.cc +178 -0
- data/lib/libv8/v8/src/dateparser.h +266 -0
- data/lib/libv8/v8/src/debug-agent.cc +447 -0
- data/lib/libv8/v8/src/debug-agent.h +129 -0
- data/lib/libv8/v8/src/debug-debugger.js +2569 -0
- data/lib/libv8/v8/src/debug.cc +3165 -0
- data/lib/libv8/v8/src/debug.h +1057 -0
- data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
- data/lib/libv8/v8/src/deoptimizer.h +602 -0
- data/lib/libv8/v8/src/disasm.h +80 -0
- data/lib/libv8/v8/src/disassembler.cc +343 -0
- data/lib/libv8/v8/src/disassembler.h +58 -0
- data/lib/libv8/v8/src/diy-fp.cc +58 -0
- data/lib/libv8/v8/src/diy-fp.h +117 -0
- data/lib/libv8/v8/src/double.h +238 -0
- data/lib/libv8/v8/src/dtoa.cc +103 -0
- data/lib/libv8/v8/src/dtoa.h +85 -0
- data/lib/libv8/v8/src/execution.cc +849 -0
- data/lib/libv8/v8/src/execution.h +297 -0
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
- data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
- data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
- data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
- data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
- data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
- data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
- data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
- data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
- data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
- data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
- data/lib/libv8/v8/src/factory.cc +1222 -0
- data/lib/libv8/v8/src/factory.h +442 -0
- data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
- data/lib/libv8/v8/src/fast-dtoa.h +83 -0
- data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
- data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
- data/lib/libv8/v8/src/flag-definitions.h +560 -0
- data/lib/libv8/v8/src/flags.cc +551 -0
- data/lib/libv8/v8/src/flags.h +79 -0
- data/lib/libv8/v8/src/frames-inl.h +247 -0
- data/lib/libv8/v8/src/frames.cc +1243 -0
- data/lib/libv8/v8/src/frames.h +870 -0
- data/lib/libv8/v8/src/full-codegen.cc +1374 -0
- data/lib/libv8/v8/src/full-codegen.h +771 -0
- data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
- data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
- data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
- data/lib/libv8/v8/src/gdb-jit.h +143 -0
- data/lib/libv8/v8/src/global-handles.cc +665 -0
- data/lib/libv8/v8/src/global-handles.h +284 -0
- data/lib/libv8/v8/src/globals.h +325 -0
- data/lib/libv8/v8/src/handles-inl.h +177 -0
- data/lib/libv8/v8/src/handles.cc +987 -0
- data/lib/libv8/v8/src/handles.h +382 -0
- data/lib/libv8/v8/src/hashmap.cc +230 -0
- data/lib/libv8/v8/src/hashmap.h +123 -0
- data/lib/libv8/v8/src/heap-inl.h +704 -0
- data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
- data/lib/libv8/v8/src/heap-profiler.h +397 -0
- data/lib/libv8/v8/src/heap.cc +5930 -0
- data/lib/libv8/v8/src/heap.h +2268 -0
- data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
- data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
- data/lib/libv8/v8/src/hydrogen.cc +6239 -0
- data/lib/libv8/v8/src/hydrogen.h +1202 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
- data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
- data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
- data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
- data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
- data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
- data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
- data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
- data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
- data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
- data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
- data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
- data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
- data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
- data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
- data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
- data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
- data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
- data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
- data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
- data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
- data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
- data/lib/libv8/v8/src/ic-inl.h +130 -0
- data/lib/libv8/v8/src/ic.cc +2577 -0
- data/lib/libv8/v8/src/ic.h +736 -0
- data/lib/libv8/v8/src/inspector.cc +63 -0
- data/lib/libv8/v8/src/inspector.h +62 -0
- data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
- data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
- data/lib/libv8/v8/src/isolate-inl.h +50 -0
- data/lib/libv8/v8/src/isolate.cc +1869 -0
- data/lib/libv8/v8/src/isolate.h +1382 -0
- data/lib/libv8/v8/src/json-parser.cc +504 -0
- data/lib/libv8/v8/src/json-parser.h +161 -0
- data/lib/libv8/v8/src/json.js +342 -0
- data/lib/libv8/v8/src/jsregexp.cc +5385 -0
- data/lib/libv8/v8/src/jsregexp.h +1492 -0
- data/lib/libv8/v8/src/list-inl.h +212 -0
- data/lib/libv8/v8/src/list.h +174 -0
- data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
- data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
- data/lib/libv8/v8/src/lithium-allocator.h +630 -0
- data/lib/libv8/v8/src/lithium.cc +190 -0
- data/lib/libv8/v8/src/lithium.h +597 -0
- data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
- data/lib/libv8/v8/src/liveedit.cc +1691 -0
- data/lib/libv8/v8/src/liveedit.h +180 -0
- data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
- data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
- data/lib/libv8/v8/src/liveobjectlist.h +322 -0
- data/lib/libv8/v8/src/log-inl.h +59 -0
- data/lib/libv8/v8/src/log-utils.cc +428 -0
- data/lib/libv8/v8/src/log-utils.h +231 -0
- data/lib/libv8/v8/src/log.cc +1993 -0
- data/lib/libv8/v8/src/log.h +476 -0
- data/lib/libv8/v8/src/macro-assembler.h +120 -0
- data/lib/libv8/v8/src/macros.py +178 -0
- data/lib/libv8/v8/src/mark-compact.cc +3143 -0
- data/lib/libv8/v8/src/mark-compact.h +506 -0
- data/lib/libv8/v8/src/math.js +264 -0
- data/lib/libv8/v8/src/messages.cc +179 -0
- data/lib/libv8/v8/src/messages.h +113 -0
- data/lib/libv8/v8/src/messages.js +1096 -0
- data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
- data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
- data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
- data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
- data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
- data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
- data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
- data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
- data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
- data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
- data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
- data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
- data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
- data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
- data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
- data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
- data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
- data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
- data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
- data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
- data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
- data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
- data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
- data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
- data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
- data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
- data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
- data/lib/libv8/v8/src/mksnapshot.cc +328 -0
- data/lib/libv8/v8/src/natives.h +64 -0
- data/lib/libv8/v8/src/objects-debug.cc +738 -0
- data/lib/libv8/v8/src/objects-inl.h +4323 -0
- data/lib/libv8/v8/src/objects-printer.cc +829 -0
- data/lib/libv8/v8/src/objects-visiting.cc +148 -0
- data/lib/libv8/v8/src/objects-visiting.h +424 -0
- data/lib/libv8/v8/src/objects.cc +10585 -0
- data/lib/libv8/v8/src/objects.h +6838 -0
- data/lib/libv8/v8/src/parser.cc +4997 -0
- data/lib/libv8/v8/src/parser.h +765 -0
- data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
- data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
- data/lib/libv8/v8/src/platform-linux.cc +1149 -0
- data/lib/libv8/v8/src/platform-macos.cc +830 -0
- data/lib/libv8/v8/src/platform-nullos.cc +479 -0
- data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
- data/lib/libv8/v8/src/platform-posix.cc +424 -0
- data/lib/libv8/v8/src/platform-solaris.cc +762 -0
- data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
- data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
- data/lib/libv8/v8/src/platform-tls.h +50 -0
- data/lib/libv8/v8/src/platform-win32.cc +2021 -0
- data/lib/libv8/v8/src/platform.h +667 -0
- data/lib/libv8/v8/src/preparse-data-format.h +62 -0
- data/lib/libv8/v8/src/preparse-data.cc +183 -0
- data/lib/libv8/v8/src/preparse-data.h +225 -0
- data/lib/libv8/v8/src/preparser-api.cc +220 -0
- data/lib/libv8/v8/src/preparser.cc +1450 -0
- data/lib/libv8/v8/src/preparser.h +493 -0
- data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
- data/lib/libv8/v8/src/prettyprinter.h +223 -0
- data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
- data/lib/libv8/v8/src/profile-generator.cc +3098 -0
- data/lib/libv8/v8/src/profile-generator.h +1126 -0
- data/lib/libv8/v8/src/property.cc +105 -0
- data/lib/libv8/v8/src/property.h +365 -0
- data/lib/libv8/v8/src/proxy.js +83 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
- data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
- data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
- data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
- data/lib/libv8/v8/src/regexp-stack.cc +111 -0
- data/lib/libv8/v8/src/regexp-stack.h +147 -0
- data/lib/libv8/v8/src/regexp.js +483 -0
- data/lib/libv8/v8/src/rewriter.cc +360 -0
- data/lib/libv8/v8/src/rewriter.h +50 -0
- data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
- data/lib/libv8/v8/src/runtime-profiler.h +201 -0
- data/lib/libv8/v8/src/runtime.cc +12227 -0
- data/lib/libv8/v8/src/runtime.h +652 -0
- data/lib/libv8/v8/src/runtime.js +649 -0
- data/lib/libv8/v8/src/safepoint-table.cc +256 -0
- data/lib/libv8/v8/src/safepoint-table.h +270 -0
- data/lib/libv8/v8/src/scanner-base.cc +952 -0
- data/lib/libv8/v8/src/scanner-base.h +670 -0
- data/lib/libv8/v8/src/scanner.cc +345 -0
- data/lib/libv8/v8/src/scanner.h +146 -0
- data/lib/libv8/v8/src/scopeinfo.cc +646 -0
- data/lib/libv8/v8/src/scopeinfo.h +254 -0
- data/lib/libv8/v8/src/scopes.cc +1150 -0
- data/lib/libv8/v8/src/scopes.h +507 -0
- data/lib/libv8/v8/src/serialize.cc +1574 -0
- data/lib/libv8/v8/src/serialize.h +589 -0
- data/lib/libv8/v8/src/shell.h +55 -0
- data/lib/libv8/v8/src/simulator.h +43 -0
- data/lib/libv8/v8/src/small-pointer-list.h +163 -0
- data/lib/libv8/v8/src/smart-pointer.h +109 -0
- data/lib/libv8/v8/src/snapshot-common.cc +83 -0
- data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
- data/lib/libv8/v8/src/snapshot.h +91 -0
- data/lib/libv8/v8/src/spaces-inl.h +529 -0
- data/lib/libv8/v8/src/spaces.cc +3145 -0
- data/lib/libv8/v8/src/spaces.h +2369 -0
- data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
- data/lib/libv8/v8/src/splay-tree.h +205 -0
- data/lib/libv8/v8/src/string-search.cc +41 -0
- data/lib/libv8/v8/src/string-search.h +568 -0
- data/lib/libv8/v8/src/string-stream.cc +592 -0
- data/lib/libv8/v8/src/string-stream.h +191 -0
- data/lib/libv8/v8/src/string.js +994 -0
- data/lib/libv8/v8/src/strtod.cc +440 -0
- data/lib/libv8/v8/src/strtod.h +40 -0
- data/lib/libv8/v8/src/stub-cache.cc +1965 -0
- data/lib/libv8/v8/src/stub-cache.h +924 -0
- data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
- data/lib/libv8/v8/src/token.cc +63 -0
- data/lib/libv8/v8/src/token.h +288 -0
- data/lib/libv8/v8/src/type-info.cc +507 -0
- data/lib/libv8/v8/src/type-info.h +272 -0
- data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
- data/lib/libv8/v8/src/unbound-queue.h +69 -0
- data/lib/libv8/v8/src/unicode-inl.h +238 -0
- data/lib/libv8/v8/src/unicode.cc +1624 -0
- data/lib/libv8/v8/src/unicode.h +280 -0
- data/lib/libv8/v8/src/uri.js +408 -0
- data/lib/libv8/v8/src/utils-inl.h +48 -0
- data/lib/libv8/v8/src/utils.cc +371 -0
- data/lib/libv8/v8/src/utils.h +800 -0
- data/lib/libv8/v8/src/v8-counters.cc +62 -0
- data/lib/libv8/v8/src/v8-counters.h +314 -0
- data/lib/libv8/v8/src/v8.cc +213 -0
- data/lib/libv8/v8/src/v8.h +131 -0
- data/lib/libv8/v8/src/v8checks.h +64 -0
- data/lib/libv8/v8/src/v8dll-main.cc +44 -0
- data/lib/libv8/v8/src/v8globals.h +512 -0
- data/lib/libv8/v8/src/v8memory.h +82 -0
- data/lib/libv8/v8/src/v8natives.js +1310 -0
- data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
- data/lib/libv8/v8/src/v8threads.cc +464 -0
- data/lib/libv8/v8/src/v8threads.h +165 -0
- data/lib/libv8/v8/src/v8utils.h +319 -0
- data/lib/libv8/v8/src/variables.cc +114 -0
- data/lib/libv8/v8/src/variables.h +167 -0
- data/lib/libv8/v8/src/version.cc +116 -0
- data/lib/libv8/v8/src/version.h +68 -0
- data/lib/libv8/v8/src/vm-state-inl.h +138 -0
- data/lib/libv8/v8/src/vm-state.h +71 -0
- data/lib/libv8/v8/src/win32-headers.h +96 -0
- data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
- data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
- data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
- data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
- data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
- data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
- data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
- data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
- data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
- data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
- data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
- data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
- data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
- data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
- data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
- data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
- data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
- data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
- data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
- data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
- data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
- data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
- data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
- data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
- data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
- data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
- data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
- data/lib/libv8/v8/src/zone-inl.h +140 -0
- data/lib/libv8/v8/src/zone.cc +196 -0
- data/lib/libv8/v8/src/zone.h +240 -0
- data/lib/libv8/v8/tools/codemap.js +265 -0
- data/lib/libv8/v8/tools/consarray.js +93 -0
- data/lib/libv8/v8/tools/csvparser.js +78 -0
- data/lib/libv8/v8/tools/disasm.py +92 -0
- data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
- data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
- data/lib/libv8/v8/tools/gcmole/README +62 -0
- data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
- data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
- data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
- data/lib/libv8/v8/tools/grokdump.py +841 -0
- data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
- data/lib/libv8/v8/tools/js2c.py +364 -0
- data/lib/libv8/v8/tools/jsmin.py +280 -0
- data/lib/libv8/v8/tools/linux-tick-processor +35 -0
- data/lib/libv8/v8/tools/ll_prof.py +942 -0
- data/lib/libv8/v8/tools/logreader.js +185 -0
- data/lib/libv8/v8/tools/mac-nm +18 -0
- data/lib/libv8/v8/tools/mac-tick-processor +6 -0
- data/lib/libv8/v8/tools/oom_dump/README +31 -0
- data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
- data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
- data/lib/libv8/v8/tools/presubmit.py +305 -0
- data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
- data/lib/libv8/v8/tools/profile.js +751 -0
- data/lib/libv8/v8/tools/profile_view.js +219 -0
- data/lib/libv8/v8/tools/run-valgrind.py +77 -0
- data/lib/libv8/v8/tools/splaytree.js +316 -0
- data/lib/libv8/v8/tools/stats-viewer.py +468 -0
- data/lib/libv8/v8/tools/test.py +1510 -0
- data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
- data/lib/libv8/v8/tools/tickprocessor.js +877 -0
- data/lib/libv8/v8/tools/utils.py +96 -0
- data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
- data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
- data/lib/libv8/version.rb +4 -0
- data/libv8.gemspec +31 -0
- metadata +800 -0
@@ -0,0 +1,442 @@
|
|
1
|
+
// Copyright 2010 the V8 project authors. All rights reserved.
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
3
|
+
// modification, are permitted provided that the following conditions are
|
4
|
+
// met:
|
5
|
+
//
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
9
|
+
// copyright notice, this list of conditions and the following
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
11
|
+
// with the distribution.
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
13
|
+
// contributors may be used to endorse or promote products derived
|
14
|
+
// from this software without specific prior written permission.
|
15
|
+
//
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
|
28
|
+
#ifndef V8_FACTORY_H_
|
29
|
+
#define V8_FACTORY_H_
|
30
|
+
|
31
|
+
#include "globals.h"
|
32
|
+
#include "handles.h"
|
33
|
+
#include "heap.h"
|
34
|
+
|
35
|
+
namespace v8 {
|
36
|
+
namespace internal {
|
37
|
+
|
38
|
+
// Interface for handle based allocation.
|
39
|
+
|
40
|
+
class Factory {
|
41
|
+
public:
|
42
|
+
// Allocate a new fixed array with undefined entries.
|
43
|
+
Handle<FixedArray> NewFixedArray(
|
44
|
+
int size,
|
45
|
+
PretenureFlag pretenure = NOT_TENURED);
|
46
|
+
|
47
|
+
// Allocate a new fixed array with non-existing entries (the hole).
|
48
|
+
Handle<FixedArray> NewFixedArrayWithHoles(
|
49
|
+
int size,
|
50
|
+
PretenureFlag pretenure = NOT_TENURED);
|
51
|
+
|
52
|
+
Handle<NumberDictionary> NewNumberDictionary(int at_least_space_for);
|
53
|
+
|
54
|
+
Handle<StringDictionary> NewStringDictionary(int at_least_space_for);
|
55
|
+
|
56
|
+
Handle<DescriptorArray> NewDescriptorArray(int number_of_descriptors);
|
57
|
+
Handle<DeoptimizationInputData> NewDeoptimizationInputData(
|
58
|
+
int deopt_entry_count,
|
59
|
+
PretenureFlag pretenure);
|
60
|
+
Handle<DeoptimizationOutputData> NewDeoptimizationOutputData(
|
61
|
+
int deopt_entry_count,
|
62
|
+
PretenureFlag pretenure);
|
63
|
+
|
64
|
+
Handle<String> LookupSymbol(Vector<const char> str);
|
65
|
+
Handle<String> LookupSymbol(Handle<String> str);
|
66
|
+
Handle<String> LookupAsciiSymbol(Vector<const char> str);
|
67
|
+
Handle<String> LookupAsciiSymbol(Handle<SeqAsciiString>,
|
68
|
+
int from,
|
69
|
+
int length);
|
70
|
+
Handle<String> LookupTwoByteSymbol(Vector<const uc16> str);
|
71
|
+
Handle<String> LookupAsciiSymbol(const char* str) {
|
72
|
+
return LookupSymbol(CStrVector(str));
|
73
|
+
}
|
74
|
+
|
75
|
+
|
76
|
+
// String creation functions. Most of the string creation functions take
|
77
|
+
// a Heap::PretenureFlag argument to optionally request that they be
|
78
|
+
// allocated in the old generation. The pretenure flag defaults to
|
79
|
+
// DONT_TENURE.
|
80
|
+
//
|
81
|
+
// Creates a new String object. There are two String encodings: ASCII and
|
82
|
+
// two byte. One should choose between the three string factory functions
|
83
|
+
// based on the encoding of the string buffer that the string is
|
84
|
+
// initialized from.
|
85
|
+
// - ...FromAscii initializes the string from a buffer that is ASCII
|
86
|
+
// encoded (it does not check that the buffer is ASCII encoded) and
|
87
|
+
// the result will be ASCII encoded.
|
88
|
+
// - ...FromUtf8 initializes the string from a buffer that is UTF-8
|
89
|
+
// encoded. If the characters are all single-byte characters, the
|
90
|
+
// result will be ASCII encoded, otherwise it will converted to two
|
91
|
+
// byte.
|
92
|
+
// - ...FromTwoByte initializes the string from a buffer that is two
|
93
|
+
// byte encoded. If the characters are all single-byte characters,
|
94
|
+
// the result will be converted to ASCII, otherwise it will be left as
|
95
|
+
// two byte.
|
96
|
+
//
|
97
|
+
// ASCII strings are pretenured when used as keys in the SourceCodeCache.
|
98
|
+
Handle<String> NewStringFromAscii(
|
99
|
+
Vector<const char> str,
|
100
|
+
PretenureFlag pretenure = NOT_TENURED);
|
101
|
+
|
102
|
+
// UTF8 strings are pretenured when used for regexp literal patterns and
|
103
|
+
// flags in the parser.
|
104
|
+
Handle<String> NewStringFromUtf8(
|
105
|
+
Vector<const char> str,
|
106
|
+
PretenureFlag pretenure = NOT_TENURED);
|
107
|
+
|
108
|
+
Handle<String> NewStringFromTwoByte(
|
109
|
+
Vector<const uc16> str,
|
110
|
+
PretenureFlag pretenure = NOT_TENURED);
|
111
|
+
|
112
|
+
// Allocates and partially initializes an ASCII or TwoByte String. The
|
113
|
+
// characters of the string are uninitialized. Currently used in regexp code
|
114
|
+
// only, where they are pretenured.
|
115
|
+
Handle<String> NewRawAsciiString(
|
116
|
+
int length,
|
117
|
+
PretenureFlag pretenure = NOT_TENURED);
|
118
|
+
Handle<String> NewRawTwoByteString(
|
119
|
+
int length,
|
120
|
+
PretenureFlag pretenure = NOT_TENURED);
|
121
|
+
|
122
|
+
// Create a new cons string object which consists of a pair of strings.
|
123
|
+
Handle<String> NewConsString(Handle<String> first,
|
124
|
+
Handle<String> second);
|
125
|
+
|
126
|
+
// Create a new string object which holds a substring of a string.
|
127
|
+
Handle<String> NewSubString(Handle<String> str,
|
128
|
+
int begin,
|
129
|
+
int end);
|
130
|
+
|
131
|
+
// Creates a new external String object. There are two String encodings
|
132
|
+
// in the system: ASCII and two byte. Unlike other String types, it does
|
133
|
+
// not make sense to have a UTF-8 factory function for external strings,
|
134
|
+
// because we cannot change the underlying buffer.
|
135
|
+
Handle<String> NewExternalStringFromAscii(
|
136
|
+
ExternalAsciiString::Resource* resource);
|
137
|
+
Handle<String> NewExternalStringFromTwoByte(
|
138
|
+
ExternalTwoByteString::Resource* resource);
|
139
|
+
|
140
|
+
// Create a global (but otherwise uninitialized) context.
|
141
|
+
Handle<Context> NewGlobalContext();
|
142
|
+
|
143
|
+
// Create a function context.
|
144
|
+
Handle<Context> NewFunctionContext(int length,
|
145
|
+
Handle<JSFunction> closure);
|
146
|
+
|
147
|
+
// Create a 'with' context.
|
148
|
+
Handle<Context> NewWithContext(Handle<Context> previous,
|
149
|
+
Handle<JSObject> extension,
|
150
|
+
bool is_catch_context);
|
151
|
+
|
152
|
+
// Return the Symbol matching the passed in string.
|
153
|
+
Handle<String> SymbolFromString(Handle<String> value);
|
154
|
+
|
155
|
+
// Allocate a new struct. The struct is pretenured (allocated directly in
|
156
|
+
// the old generation).
|
157
|
+
Handle<Struct> NewStruct(InstanceType type);
|
158
|
+
|
159
|
+
Handle<AccessorInfo> NewAccessorInfo();
|
160
|
+
|
161
|
+
Handle<Script> NewScript(Handle<String> source);
|
162
|
+
|
163
|
+
// Foreign objects are pretenured when allocated by the bootstrapper.
|
164
|
+
Handle<Foreign> NewForeign(Address addr,
|
165
|
+
PretenureFlag pretenure = NOT_TENURED);
|
166
|
+
|
167
|
+
// Allocate a new foreign object. The foreign is pretenured (allocated
|
168
|
+
// directly in the old generation).
|
169
|
+
Handle<Foreign> NewForeign(const AccessorDescriptor* foreign);
|
170
|
+
|
171
|
+
Handle<ByteArray> NewByteArray(int length,
|
172
|
+
PretenureFlag pretenure = NOT_TENURED);
|
173
|
+
|
174
|
+
Handle<ExternalArray> NewExternalArray(
|
175
|
+
int length,
|
176
|
+
ExternalArrayType array_type,
|
177
|
+
void* external_pointer,
|
178
|
+
PretenureFlag pretenure = NOT_TENURED);
|
179
|
+
|
180
|
+
Handle<JSGlobalPropertyCell> NewJSGlobalPropertyCell(
|
181
|
+
Handle<Object> value);
|
182
|
+
|
183
|
+
Handle<Map> NewMap(InstanceType type, int instance_size);
|
184
|
+
|
185
|
+
Handle<JSObject> NewFunctionPrototype(Handle<JSFunction> function);
|
186
|
+
|
187
|
+
Handle<Map> CopyMapDropDescriptors(Handle<Map> map);
|
188
|
+
|
189
|
+
// Copy the map adding more inobject properties if possible without
|
190
|
+
// overflowing the instance size.
|
191
|
+
Handle<Map> CopyMap(Handle<Map> map, int extra_inobject_props);
|
192
|
+
|
193
|
+
Handle<Map> CopyMapDropTransitions(Handle<Map> map);
|
194
|
+
|
195
|
+
Handle<Map> GetFastElementsMap(Handle<Map> map);
|
196
|
+
|
197
|
+
Handle<Map> GetSlowElementsMap(Handle<Map> map);
|
198
|
+
|
199
|
+
Handle<Map> GetExternalArrayElementsMap(Handle<Map> map,
|
200
|
+
ExternalArrayType array_type,
|
201
|
+
bool safe_to_add_transition);
|
202
|
+
|
203
|
+
Handle<FixedArray> CopyFixedArray(Handle<FixedArray> array);
|
204
|
+
|
205
|
+
// Numbers (eg, literals) are pretenured by the parser.
|
206
|
+
Handle<Object> NewNumber(double value,
|
207
|
+
PretenureFlag pretenure = NOT_TENURED);
|
208
|
+
|
209
|
+
Handle<Object> NewNumberFromInt(int value);
|
210
|
+
Handle<Object> NewNumberFromUint(uint32_t value);
|
211
|
+
|
212
|
+
// These objects are used by the api to create env-independent data
|
213
|
+
// structures in the heap.
|
214
|
+
Handle<JSObject> NewNeanderObject();
|
215
|
+
|
216
|
+
Handle<JSObject> NewArgumentsObject(Handle<Object> callee, int length);
|
217
|
+
|
218
|
+
// JS objects are pretenured when allocated by the bootstrapper and
|
219
|
+
// runtime.
|
220
|
+
Handle<JSObject> NewJSObject(Handle<JSFunction> constructor,
|
221
|
+
PretenureFlag pretenure = NOT_TENURED);
|
222
|
+
|
223
|
+
// Global objects are pretenured.
|
224
|
+
Handle<GlobalObject> NewGlobalObject(Handle<JSFunction> constructor);
|
225
|
+
|
226
|
+
// JS objects are pretenured when allocated by the bootstrapper and
|
227
|
+
// runtime.
|
228
|
+
Handle<JSObject> NewJSObjectFromMap(Handle<Map> map);
|
229
|
+
|
230
|
+
// JS arrays are pretenured when allocated by the parser.
|
231
|
+
Handle<JSArray> NewJSArray(int capacity,
|
232
|
+
PretenureFlag pretenure = NOT_TENURED);
|
233
|
+
|
234
|
+
Handle<JSArray> NewJSArrayWithElements(
|
235
|
+
Handle<FixedArray> elements,
|
236
|
+
PretenureFlag pretenure = NOT_TENURED);
|
237
|
+
|
238
|
+
Handle<JSProxy> NewJSProxy(Handle<Object> handler, Handle<Object> prototype);
|
239
|
+
|
240
|
+
Handle<JSFunction> NewFunction(Handle<String> name,
|
241
|
+
Handle<Object> prototype);
|
242
|
+
|
243
|
+
Handle<JSFunction> NewFunctionWithoutPrototype(
|
244
|
+
Handle<String> name,
|
245
|
+
StrictModeFlag strict_mode);
|
246
|
+
|
247
|
+
Handle<JSFunction> NewFunction(Handle<Object> super, bool is_global);
|
248
|
+
|
249
|
+
Handle<JSFunction> BaseNewFunctionFromSharedFunctionInfo(
|
250
|
+
Handle<SharedFunctionInfo> function_info,
|
251
|
+
Handle<Map> function_map,
|
252
|
+
PretenureFlag pretenure);
|
253
|
+
|
254
|
+
Handle<JSFunction> NewFunctionFromSharedFunctionInfo(
|
255
|
+
Handle<SharedFunctionInfo> function_info,
|
256
|
+
Handle<Context> context,
|
257
|
+
PretenureFlag pretenure = TENURED);
|
258
|
+
|
259
|
+
Handle<Code> NewCode(const CodeDesc& desc,
|
260
|
+
Code::Flags flags,
|
261
|
+
Handle<Object> self_reference,
|
262
|
+
bool immovable = false);
|
263
|
+
|
264
|
+
Handle<Code> CopyCode(Handle<Code> code);
|
265
|
+
|
266
|
+
Handle<Code> CopyCode(Handle<Code> code, Vector<byte> reloc_info);
|
267
|
+
|
268
|
+
Handle<Object> ToObject(Handle<Object> object);
|
269
|
+
Handle<Object> ToObject(Handle<Object> object,
|
270
|
+
Handle<Context> global_context);
|
271
|
+
|
272
|
+
// Interface for creating error objects.
|
273
|
+
|
274
|
+
Handle<Object> NewError(const char* maker, const char* type,
|
275
|
+
Handle<JSArray> args);
|
276
|
+
Handle<Object> NewError(const char* maker, const char* type,
|
277
|
+
Vector< Handle<Object> > args);
|
278
|
+
Handle<Object> NewError(const char* type,
|
279
|
+
Vector< Handle<Object> > args);
|
280
|
+
Handle<Object> NewError(Handle<String> message);
|
281
|
+
Handle<Object> NewError(const char* constructor,
|
282
|
+
Handle<String> message);
|
283
|
+
|
284
|
+
Handle<Object> NewTypeError(const char* type,
|
285
|
+
Vector< Handle<Object> > args);
|
286
|
+
Handle<Object> NewTypeError(Handle<String> message);
|
287
|
+
|
288
|
+
Handle<Object> NewRangeError(const char* type,
|
289
|
+
Vector< Handle<Object> > args);
|
290
|
+
Handle<Object> NewRangeError(Handle<String> message);
|
291
|
+
|
292
|
+
Handle<Object> NewSyntaxError(const char* type, Handle<JSArray> args);
|
293
|
+
Handle<Object> NewSyntaxError(Handle<String> message);
|
294
|
+
|
295
|
+
Handle<Object> NewReferenceError(const char* type,
|
296
|
+
Vector< Handle<Object> > args);
|
297
|
+
Handle<Object> NewReferenceError(Handle<String> message);
|
298
|
+
|
299
|
+
Handle<Object> NewEvalError(const char* type,
|
300
|
+
Vector< Handle<Object> > args);
|
301
|
+
|
302
|
+
|
303
|
+
Handle<JSFunction> NewFunction(Handle<String> name,
|
304
|
+
InstanceType type,
|
305
|
+
int instance_size,
|
306
|
+
Handle<Code> code,
|
307
|
+
bool force_initial_map);
|
308
|
+
|
309
|
+
Handle<JSFunction> NewFunction(Handle<Map> function_map,
|
310
|
+
Handle<SharedFunctionInfo> shared, Handle<Object> prototype);
|
311
|
+
|
312
|
+
|
313
|
+
Handle<JSFunction> NewFunctionWithPrototype(Handle<String> name,
|
314
|
+
InstanceType type,
|
315
|
+
int instance_size,
|
316
|
+
Handle<JSObject> prototype,
|
317
|
+
Handle<Code> code,
|
318
|
+
bool force_initial_map);
|
319
|
+
|
320
|
+
Handle<JSFunction> NewFunctionWithoutPrototype(Handle<String> name,
|
321
|
+
Handle<Code> code);
|
322
|
+
|
323
|
+
Handle<DescriptorArray> CopyAppendForeignDescriptor(
|
324
|
+
Handle<DescriptorArray> array,
|
325
|
+
Handle<String> key,
|
326
|
+
Handle<Object> value,
|
327
|
+
PropertyAttributes attributes);
|
328
|
+
|
329
|
+
Handle<String> NumberToString(Handle<Object> number);
|
330
|
+
|
331
|
+
enum ApiInstanceType {
|
332
|
+
JavaScriptObject,
|
333
|
+
InnerGlobalObject,
|
334
|
+
OuterGlobalObject
|
335
|
+
};
|
336
|
+
|
337
|
+
Handle<JSFunction> CreateApiFunction(
|
338
|
+
Handle<FunctionTemplateInfo> data,
|
339
|
+
ApiInstanceType type = JavaScriptObject);
|
340
|
+
|
341
|
+
Handle<JSFunction> InstallMembers(Handle<JSFunction> function);
|
342
|
+
|
343
|
+
// Installs interceptors on the instance. 'desc' is a function template,
|
344
|
+
// and instance is an object instance created by the function of this
|
345
|
+
// function template.
|
346
|
+
void ConfigureInstance(Handle<FunctionTemplateInfo> desc,
|
347
|
+
Handle<JSObject> instance,
|
348
|
+
bool* pending_exception);
|
349
|
+
|
350
|
+
#define ROOT_ACCESSOR(type, name, camel_name) \
|
351
|
+
inline Handle<type> name() { \
|
352
|
+
return Handle<type>(BitCast<type**>( \
|
353
|
+
&isolate()->heap()->roots_[Heap::k##camel_name##RootIndex])); \
|
354
|
+
}
|
355
|
+
ROOT_LIST(ROOT_ACCESSOR)
|
356
|
+
#undef ROOT_ACCESSOR_ACCESSOR
|
357
|
+
|
358
|
+
#define SYMBOL_ACCESSOR(name, str) \
|
359
|
+
inline Handle<String> name() { \
|
360
|
+
return Handle<String>(BitCast<String**>( \
|
361
|
+
&isolate()->heap()->roots_[Heap::k##name##RootIndex])); \
|
362
|
+
}
|
363
|
+
SYMBOL_LIST(SYMBOL_ACCESSOR)
|
364
|
+
#undef SYMBOL_ACCESSOR
|
365
|
+
|
366
|
+
Handle<String> hidden_symbol() {
|
367
|
+
return Handle<String>(&isolate()->heap()->hidden_symbol_);
|
368
|
+
}
|
369
|
+
|
370
|
+
Handle<SharedFunctionInfo> NewSharedFunctionInfo(
|
371
|
+
Handle<String> name,
|
372
|
+
int number_of_literals,
|
373
|
+
Handle<Code> code,
|
374
|
+
Handle<SerializedScopeInfo> scope_info);
|
375
|
+
Handle<SharedFunctionInfo> NewSharedFunctionInfo(Handle<String> name);
|
376
|
+
|
377
|
+
Handle<JSMessageObject> NewJSMessageObject(
|
378
|
+
Handle<String> type,
|
379
|
+
Handle<JSArray> arguments,
|
380
|
+
int start_position,
|
381
|
+
int end_position,
|
382
|
+
Handle<Object> script,
|
383
|
+
Handle<Object> stack_trace,
|
384
|
+
Handle<Object> stack_frames);
|
385
|
+
|
386
|
+
Handle<NumberDictionary> DictionaryAtNumberPut(
|
387
|
+
Handle<NumberDictionary>,
|
388
|
+
uint32_t key,
|
389
|
+
Handle<Object> value);
|
390
|
+
|
391
|
+
#ifdef ENABLE_DEBUGGER_SUPPORT
|
392
|
+
Handle<DebugInfo> NewDebugInfo(Handle<SharedFunctionInfo> shared);
|
393
|
+
#endif
|
394
|
+
|
395
|
+
// Return a map using the map cache in the global context.
|
396
|
+
// The key the an ordered set of property names.
|
397
|
+
Handle<Map> ObjectLiteralMapFromCache(Handle<Context> context,
|
398
|
+
Handle<FixedArray> keys);
|
399
|
+
|
400
|
+
// Creates a new FixedArray that holds the data associated with the
|
401
|
+
// atom regexp and stores it in the regexp.
|
402
|
+
void SetRegExpAtomData(Handle<JSRegExp> regexp,
|
403
|
+
JSRegExp::Type type,
|
404
|
+
Handle<String> source,
|
405
|
+
JSRegExp::Flags flags,
|
406
|
+
Handle<Object> match_pattern);
|
407
|
+
|
408
|
+
// Creates a new FixedArray that holds the data associated with the
|
409
|
+
// irregexp regexp and stores it in the regexp.
|
410
|
+
void SetRegExpIrregexpData(Handle<JSRegExp> regexp,
|
411
|
+
JSRegExp::Type type,
|
412
|
+
Handle<String> source,
|
413
|
+
JSRegExp::Flags flags,
|
414
|
+
int capture_count);
|
415
|
+
|
416
|
+
private:
|
417
|
+
Isolate* isolate() { return reinterpret_cast<Isolate*>(this); }
|
418
|
+
|
419
|
+
Handle<JSFunction> NewFunctionHelper(Handle<String> name,
|
420
|
+
Handle<Object> prototype);
|
421
|
+
|
422
|
+
Handle<JSFunction> NewFunctionWithoutPrototypeHelper(
|
423
|
+
Handle<String> name,
|
424
|
+
StrictModeFlag strict_mode);
|
425
|
+
|
426
|
+
Handle<DescriptorArray> CopyAppendCallbackDescriptors(
|
427
|
+
Handle<DescriptorArray> array,
|
428
|
+
Handle<Object> descriptors);
|
429
|
+
|
430
|
+
// Create a new map cache.
|
431
|
+
Handle<MapCache> NewMapCache(int at_least_space_for);
|
432
|
+
|
433
|
+
// Update the map cache in the global context with (keys, map)
|
434
|
+
Handle<MapCache> AddToMapCache(Handle<Context> context,
|
435
|
+
Handle<FixedArray> keys,
|
436
|
+
Handle<Map> map);
|
437
|
+
};
|
438
|
+
|
439
|
+
|
440
|
+
} } // namespace v8::internal
|
441
|
+
|
442
|
+
#endif // V8_FACTORY_H_
|
@@ -0,0 +1,736 @@
|
|
1
|
+
// Copyright 2010 the V8 project authors. All rights reserved.
|
2
|
+
// Redistribution and use in source and binary forms, with or without
|
3
|
+
// modification, are permitted provided that the following conditions are
|
4
|
+
// met:
|
5
|
+
//
|
6
|
+
// * Redistributions of source code must retain the above copyright
|
7
|
+
// notice, this list of conditions and the following disclaimer.
|
8
|
+
// * Redistributions in binary form must reproduce the above
|
9
|
+
// copyright notice, this list of conditions and the following
|
10
|
+
// disclaimer in the documentation and/or other materials provided
|
11
|
+
// with the distribution.
|
12
|
+
// * Neither the name of Google Inc. nor the names of its
|
13
|
+
// contributors may be used to endorse or promote products derived
|
14
|
+
// from this software without specific prior written permission.
|
15
|
+
//
|
16
|
+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
17
|
+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
18
|
+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
19
|
+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
20
|
+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21
|
+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22
|
+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
23
|
+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
24
|
+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
25
|
+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
26
|
+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
27
|
+
|
28
|
+
#include "v8.h"
|
29
|
+
|
30
|
+
#include "fast-dtoa.h"
|
31
|
+
|
32
|
+
#include "cached-powers.h"
|
33
|
+
#include "diy-fp.h"
|
34
|
+
#include "double.h"
|
35
|
+
|
36
|
+
namespace v8 {
|
37
|
+
namespace internal {
|
38
|
+
|
39
|
+
// The minimal and maximal target exponent define the range of w's binary
|
40
|
+
// exponent, where 'w' is the result of multiplying the input by a cached power
|
41
|
+
// of ten.
|
42
|
+
//
|
43
|
+
// A different range might be chosen on a different platform, to optimize digit
|
44
|
+
// generation, but a smaller range requires more powers of ten to be cached.
|
45
|
+
static const int kMinimalTargetExponent = -60;
|
46
|
+
static const int kMaximalTargetExponent = -32;
|
47
|
+
|
48
|
+
|
49
|
+
// Adjusts the last digit of the generated number, and screens out generated
|
50
|
+
// solutions that may be inaccurate. A solution may be inaccurate if it is
|
51
|
+
// outside the safe interval, or if we ctannot prove that it is closer to the
|
52
|
+
// input than a neighboring representation of the same length.
|
53
|
+
//
|
54
|
+
// Input: * buffer containing the digits of too_high / 10^kappa
|
55
|
+
// * the buffer's length
|
56
|
+
// * distance_too_high_w == (too_high - w).f() * unit
|
57
|
+
// * unsafe_interval == (too_high - too_low).f() * unit
|
58
|
+
// * rest = (too_high - buffer * 10^kappa).f() * unit
|
59
|
+
// * ten_kappa = 10^kappa * unit
|
60
|
+
// * unit = the common multiplier
|
61
|
+
// Output: returns true if the buffer is guaranteed to contain the closest
|
62
|
+
// representable number to the input.
|
63
|
+
// Modifies the generated digits in the buffer to approach (round towards) w.
|
64
|
+
static bool RoundWeed(Vector<char> buffer,
|
65
|
+
int length,
|
66
|
+
uint64_t distance_too_high_w,
|
67
|
+
uint64_t unsafe_interval,
|
68
|
+
uint64_t rest,
|
69
|
+
uint64_t ten_kappa,
|
70
|
+
uint64_t unit) {
|
71
|
+
uint64_t small_distance = distance_too_high_w - unit;
|
72
|
+
uint64_t big_distance = distance_too_high_w + unit;
|
73
|
+
// Let w_low = too_high - big_distance, and
|
74
|
+
// w_high = too_high - small_distance.
|
75
|
+
// Note: w_low < w < w_high
|
76
|
+
//
|
77
|
+
// The real w (* unit) must lie somewhere inside the interval
|
78
|
+
// ]w_low; w_high[ (often written as "(w_low; w_high)")
|
79
|
+
|
80
|
+
// Basically the buffer currently contains a number in the unsafe interval
|
81
|
+
// ]too_low; too_high[ with too_low < w < too_high
|
82
|
+
//
|
83
|
+
// too_high - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
84
|
+
// ^v 1 unit ^ ^ ^ ^
|
85
|
+
// boundary_high --------------------- . . . .
|
86
|
+
// ^v 1 unit . . . .
|
87
|
+
// - - - - - - - - - - - - - - - - - - - + - - + - - - - - - . .
|
88
|
+
// . . ^ . .
|
89
|
+
// . big_distance . . .
|
90
|
+
// . . . . rest
|
91
|
+
// small_distance . . . .
|
92
|
+
// v . . . .
|
93
|
+
// w_high - - - - - - - - - - - - - - - - - - . . . .
|
94
|
+
// ^v 1 unit . . . .
|
95
|
+
// w ---------------------------------------- . . . .
|
96
|
+
// ^v 1 unit v . . .
|
97
|
+
// w_low - - - - - - - - - - - - - - - - - - - - - . . .
|
98
|
+
// . . v
|
99
|
+
// buffer --------------------------------------------------+-------+--------
|
100
|
+
// . .
|
101
|
+
// safe_interval .
|
102
|
+
// v .
|
103
|
+
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - .
|
104
|
+
// ^v 1 unit .
|
105
|
+
// boundary_low ------------------------- unsafe_interval
|
106
|
+
// ^v 1 unit v
|
107
|
+
// too_low - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
108
|
+
//
|
109
|
+
//
|
110
|
+
// Note that the value of buffer could lie anywhere inside the range too_low
|
111
|
+
// to too_high.
|
112
|
+
//
|
113
|
+
// boundary_low, boundary_high and w are approximations of the real boundaries
|
114
|
+
// and v (the input number). They are guaranteed to be precise up to one unit.
|
115
|
+
// In fact the error is guaranteed to be strictly less than one unit.
|
116
|
+
//
|
117
|
+
// Anything that lies outside the unsafe interval is guaranteed not to round
|
118
|
+
// to v when read again.
|
119
|
+
// Anything that lies inside the safe interval is guaranteed to round to v
|
120
|
+
// when read again.
|
121
|
+
// If the number inside the buffer lies inside the unsafe interval but not
|
122
|
+
// inside the safe interval then we simply do not know and bail out (returning
|
123
|
+
// false).
|
124
|
+
//
|
125
|
+
// Similarly we have to take into account the imprecision of 'w' when finding
|
126
|
+
// the closest representation of 'w'. If we have two potential
|
127
|
+
// representations, and one is closer to both w_low and w_high, then we know
|
128
|
+
// it is closer to the actual value v.
|
129
|
+
//
|
130
|
+
// By generating the digits of too_high we got the largest (closest to
|
131
|
+
// too_high) buffer that is still in the unsafe interval. In the case where
|
132
|
+
// w_high < buffer < too_high we try to decrement the buffer.
|
133
|
+
// This way the buffer approaches (rounds towards) w.
|
134
|
+
// There are 3 conditions that stop the decrementation process:
|
135
|
+
// 1) the buffer is already below w_high
|
136
|
+
// 2) decrementing the buffer would make it leave the unsafe interval
|
137
|
+
// 3) decrementing the buffer would yield a number below w_high and farther
|
138
|
+
// away than the current number. In other words:
|
139
|
+
// (buffer{-1} < w_high) && w_high - buffer{-1} > buffer - w_high
|
140
|
+
// Instead of using the buffer directly we use its distance to too_high.
|
141
|
+
// Conceptually rest ~= too_high - buffer
|
142
|
+
// We need to do the following tests in this order to avoid over- and
|
143
|
+
// underflows.
|
144
|
+
ASSERT(rest <= unsafe_interval);
|
145
|
+
while (rest < small_distance && // Negated condition 1
|
146
|
+
unsafe_interval - rest >= ten_kappa && // Negated condition 2
|
147
|
+
(rest + ten_kappa < small_distance || // buffer{-1} > w_high
|
148
|
+
small_distance - rest >= rest + ten_kappa - small_distance)) {
|
149
|
+
buffer[length - 1]--;
|
150
|
+
rest += ten_kappa;
|
151
|
+
}
|
152
|
+
|
153
|
+
// We have approached w+ as much as possible. We now test if approaching w-
|
154
|
+
// would require changing the buffer. If yes, then we have two possible
|
155
|
+
// representations close to w, but we cannot decide which one is closer.
|
156
|
+
if (rest < big_distance &&
|
157
|
+
unsafe_interval - rest >= ten_kappa &&
|
158
|
+
(rest + ten_kappa < big_distance ||
|
159
|
+
big_distance - rest > rest + ten_kappa - big_distance)) {
|
160
|
+
return false;
|
161
|
+
}
|
162
|
+
|
163
|
+
// Weeding test.
|
164
|
+
// The safe interval is [too_low + 2 ulp; too_high - 2 ulp]
|
165
|
+
// Since too_low = too_high - unsafe_interval this is equivalent to
|
166
|
+
// [too_high - unsafe_interval + 4 ulp; too_high - 2 ulp]
|
167
|
+
// Conceptually we have: rest ~= too_high - buffer
|
168
|
+
return (2 * unit <= rest) && (rest <= unsafe_interval - 4 * unit);
|
169
|
+
}
|
170
|
+
|
171
|
+
|
172
|
+
// Rounds the buffer upwards if the result is closer to v by possibly adding
|
173
|
+
// 1 to the buffer. If the precision of the calculation is not sufficient to
|
174
|
+
// round correctly, return false.
|
175
|
+
// The rounding might shift the whole buffer in which case the kappa is
|
176
|
+
// adjusted. For example "99", kappa = 3 might become "10", kappa = 4.
|
177
|
+
//
|
178
|
+
// If 2*rest > ten_kappa then the buffer needs to be round up.
|
179
|
+
// rest can have an error of +/- 1 unit. This function accounts for the
|
180
|
+
// imprecision and returns false, if the rounding direction cannot be
|
181
|
+
// unambiguously determined.
|
182
|
+
//
|
183
|
+
// Precondition: rest < ten_kappa.
|
184
|
+
static bool RoundWeedCounted(Vector<char> buffer,
|
185
|
+
int length,
|
186
|
+
uint64_t rest,
|
187
|
+
uint64_t ten_kappa,
|
188
|
+
uint64_t unit,
|
189
|
+
int* kappa) {
|
190
|
+
ASSERT(rest < ten_kappa);
|
191
|
+
// The following tests are done in a specific order to avoid overflows. They
|
192
|
+
// will work correctly with any uint64 values of rest < ten_kappa and unit.
|
193
|
+
//
|
194
|
+
// If the unit is too big, then we don't know which way to round. For example
|
195
|
+
// a unit of 50 means that the real number lies within rest +/- 50. If
|
196
|
+
// 10^kappa == 40 then there is no way to tell which way to round.
|
197
|
+
if (unit >= ten_kappa) return false;
|
198
|
+
// Even if unit is just half the size of 10^kappa we are already completely
|
199
|
+
// lost. (And after the previous test we know that the expression will not
|
200
|
+
// over/underflow.)
|
201
|
+
if (ten_kappa - unit <= unit) return false;
|
202
|
+
// If 2 * (rest + unit) <= 10^kappa we can safely round down.
|
203
|
+
if ((ten_kappa - rest > rest) && (ten_kappa - 2 * rest >= 2 * unit)) {
|
204
|
+
return true;
|
205
|
+
}
|
206
|
+
// If 2 * (rest - unit) >= 10^kappa, then we can safely round up.
|
207
|
+
if ((rest > unit) && (ten_kappa - (rest - unit) <= (rest - unit))) {
|
208
|
+
// Increment the last digit recursively until we find a non '9' digit.
|
209
|
+
buffer[length - 1]++;
|
210
|
+
for (int i = length - 1; i > 0; --i) {
|
211
|
+
if (buffer[i] != '0' + 10) break;
|
212
|
+
buffer[i] = '0';
|
213
|
+
buffer[i - 1]++;
|
214
|
+
}
|
215
|
+
// If the first digit is now '0'+ 10 we had a buffer with all '9's. With the
|
216
|
+
// exception of the first digit all digits are now '0'. Simply switch the
|
217
|
+
// first digit to '1' and adjust the kappa. Example: "99" becomes "10" and
|
218
|
+
// the power (the kappa) is increased.
|
219
|
+
if (buffer[0] == '0' + 10) {
|
220
|
+
buffer[0] = '1';
|
221
|
+
(*kappa) += 1;
|
222
|
+
}
|
223
|
+
return true;
|
224
|
+
}
|
225
|
+
return false;
|
226
|
+
}
|
227
|
+
|
228
|
+
|
229
|
+
static const uint32_t kTen4 = 10000;
|
230
|
+
static const uint32_t kTen5 = 100000;
|
231
|
+
static const uint32_t kTen6 = 1000000;
|
232
|
+
static const uint32_t kTen7 = 10000000;
|
233
|
+
static const uint32_t kTen8 = 100000000;
|
234
|
+
static const uint32_t kTen9 = 1000000000;
|
235
|
+
|
236
|
+
// Returns the biggest power of ten that is less than or equal than the given
|
237
|
+
// number. We furthermore receive the maximum number of bits 'number' has.
|
238
|
+
// If number_bits == 0 then 0^-1 is returned
|
239
|
+
// The number of bits must be <= 32.
|
240
|
+
// Precondition: number < (1 << (number_bits + 1)).
|
241
|
+
static void BiggestPowerTen(uint32_t number,
|
242
|
+
int number_bits,
|
243
|
+
uint32_t* power,
|
244
|
+
int* exponent) {
|
245
|
+
switch (number_bits) {
|
246
|
+
case 32:
|
247
|
+
case 31:
|
248
|
+
case 30:
|
249
|
+
if (kTen9 <= number) {
|
250
|
+
*power = kTen9;
|
251
|
+
*exponent = 9;
|
252
|
+
break;
|
253
|
+
} // else fallthrough
|
254
|
+
case 29:
|
255
|
+
case 28:
|
256
|
+
case 27:
|
257
|
+
if (kTen8 <= number) {
|
258
|
+
*power = kTen8;
|
259
|
+
*exponent = 8;
|
260
|
+
break;
|
261
|
+
} // else fallthrough
|
262
|
+
case 26:
|
263
|
+
case 25:
|
264
|
+
case 24:
|
265
|
+
if (kTen7 <= number) {
|
266
|
+
*power = kTen7;
|
267
|
+
*exponent = 7;
|
268
|
+
break;
|
269
|
+
} // else fallthrough
|
270
|
+
case 23:
|
271
|
+
case 22:
|
272
|
+
case 21:
|
273
|
+
case 20:
|
274
|
+
if (kTen6 <= number) {
|
275
|
+
*power = kTen6;
|
276
|
+
*exponent = 6;
|
277
|
+
break;
|
278
|
+
} // else fallthrough
|
279
|
+
case 19:
|
280
|
+
case 18:
|
281
|
+
case 17:
|
282
|
+
if (kTen5 <= number) {
|
283
|
+
*power = kTen5;
|
284
|
+
*exponent = 5;
|
285
|
+
break;
|
286
|
+
} // else fallthrough
|
287
|
+
case 16:
|
288
|
+
case 15:
|
289
|
+
case 14:
|
290
|
+
if (kTen4 <= number) {
|
291
|
+
*power = kTen4;
|
292
|
+
*exponent = 4;
|
293
|
+
break;
|
294
|
+
} // else fallthrough
|
295
|
+
case 13:
|
296
|
+
case 12:
|
297
|
+
case 11:
|
298
|
+
case 10:
|
299
|
+
if (1000 <= number) {
|
300
|
+
*power = 1000;
|
301
|
+
*exponent = 3;
|
302
|
+
break;
|
303
|
+
} // else fallthrough
|
304
|
+
case 9:
|
305
|
+
case 8:
|
306
|
+
case 7:
|
307
|
+
if (100 <= number) {
|
308
|
+
*power = 100;
|
309
|
+
*exponent = 2;
|
310
|
+
break;
|
311
|
+
} // else fallthrough
|
312
|
+
case 6:
|
313
|
+
case 5:
|
314
|
+
case 4:
|
315
|
+
if (10 <= number) {
|
316
|
+
*power = 10;
|
317
|
+
*exponent = 1;
|
318
|
+
break;
|
319
|
+
} // else fallthrough
|
320
|
+
case 3:
|
321
|
+
case 2:
|
322
|
+
case 1:
|
323
|
+
if (1 <= number) {
|
324
|
+
*power = 1;
|
325
|
+
*exponent = 0;
|
326
|
+
break;
|
327
|
+
} // else fallthrough
|
328
|
+
case 0:
|
329
|
+
*power = 0;
|
330
|
+
*exponent = -1;
|
331
|
+
break;
|
332
|
+
default:
|
333
|
+
// Following assignments are here to silence compiler warnings.
|
334
|
+
*power = 0;
|
335
|
+
*exponent = 0;
|
336
|
+
UNREACHABLE();
|
337
|
+
}
|
338
|
+
}
|
339
|
+
|
340
|
+
|
341
|
+
// Generates the digits of input number w.
|
342
|
+
// w is a floating-point number (DiyFp), consisting of a significand and an
|
343
|
+
// exponent. Its exponent is bounded by kMinimalTargetExponent and
|
344
|
+
// kMaximalTargetExponent.
|
345
|
+
// Hence -60 <= w.e() <= -32.
|
346
|
+
//
|
347
|
+
// Returns false if it fails, in which case the generated digits in the buffer
|
348
|
+
// should not be used.
|
349
|
+
// Preconditions:
|
350
|
+
// * low, w and high are correct up to 1 ulp (unit in the last place). That
|
351
|
+
// is, their error must be less than a unit of their last digits.
|
352
|
+
// * low.e() == w.e() == high.e()
|
353
|
+
// * low < w < high, and taking into account their error: low~ <= high~
|
354
|
+
// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
|
355
|
+
// Postconditions: returns false if procedure fails.
|
356
|
+
// otherwise:
|
357
|
+
// * buffer is not null-terminated, but len contains the number of digits.
|
358
|
+
// * buffer contains the shortest possible decimal digit-sequence
|
359
|
+
// such that LOW < buffer * 10^kappa < HIGH, where LOW and HIGH are the
|
360
|
+
// correct values of low and high (without their error).
|
361
|
+
// * if more than one decimal representation gives the minimal number of
|
362
|
+
// decimal digits then the one closest to W (where W is the correct value
|
363
|
+
// of w) is chosen.
|
364
|
+
// Remark: this procedure takes into account the imprecision of its input
|
365
|
+
// numbers. If the precision is not enough to guarantee all the postconditions
|
366
|
+
// then false is returned. This usually happens rarely (~0.5%).
|
367
|
+
//
|
368
|
+
// Say, for the sake of example, that
|
369
|
+
// w.e() == -48, and w.f() == 0x1234567890abcdef
|
370
|
+
// w's value can be computed by w.f() * 2^w.e()
|
371
|
+
// We can obtain w's integral digits by simply shifting w.f() by -w.e().
|
372
|
+
// -> w's integral part is 0x1234
|
373
|
+
// w's fractional part is therefore 0x567890abcdef.
|
374
|
+
// Printing w's integral part is easy (simply print 0x1234 in decimal).
|
375
|
+
// In order to print its fraction we repeatedly multiply the fraction by 10 and
|
376
|
+
// get each digit. Example the first digit after the point would be computed by
|
377
|
+
// (0x567890abcdef * 10) >> 48. -> 3
|
378
|
+
// The whole thing becomes slightly more complicated because we want to stop
|
379
|
+
// once we have enough digits. That is, once the digits inside the buffer
|
380
|
+
// represent 'w' we can stop. Everything inside the interval low - high
|
381
|
+
// represents w. However we have to pay attention to low, high and w's
|
382
|
+
// imprecision.
|
383
|
+
static bool DigitGen(DiyFp low,
|
384
|
+
DiyFp w,
|
385
|
+
DiyFp high,
|
386
|
+
Vector<char> buffer,
|
387
|
+
int* length,
|
388
|
+
int* kappa) {
|
389
|
+
ASSERT(low.e() == w.e() && w.e() == high.e());
|
390
|
+
ASSERT(low.f() + 1 <= high.f() - 1);
|
391
|
+
ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
|
392
|
+
// low, w and high are imprecise, but by less than one ulp (unit in the last
|
393
|
+
// place).
|
394
|
+
// If we remove (resp. add) 1 ulp from low (resp. high) we are certain that
|
395
|
+
// the new numbers are outside of the interval we want the final
|
396
|
+
// representation to lie in.
|
397
|
+
// Inversely adding (resp. removing) 1 ulp from low (resp. high) would yield
|
398
|
+
// numbers that are certain to lie in the interval. We will use this fact
|
399
|
+
// later on.
|
400
|
+
// We will now start by generating the digits within the uncertain
|
401
|
+
// interval. Later we will weed out representations that lie outside the safe
|
402
|
+
// interval and thus _might_ lie outside the correct interval.
|
403
|
+
uint64_t unit = 1;
|
404
|
+
DiyFp too_low = DiyFp(low.f() - unit, low.e());
|
405
|
+
DiyFp too_high = DiyFp(high.f() + unit, high.e());
|
406
|
+
// too_low and too_high are guaranteed to lie outside the interval we want the
|
407
|
+
// generated number in.
|
408
|
+
DiyFp unsafe_interval = DiyFp::Minus(too_high, too_low);
|
409
|
+
// We now cut the input number into two parts: the integral digits and the
|
410
|
+
// fractionals. We will not write any decimal separator though, but adapt
|
411
|
+
// kappa instead.
|
412
|
+
// Reminder: we are currently computing the digits (stored inside the buffer)
|
413
|
+
// such that: too_low < buffer * 10^kappa < too_high
|
414
|
+
// We use too_high for the digit_generation and stop as soon as possible.
|
415
|
+
// If we stop early we effectively round down.
|
416
|
+
DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
|
417
|
+
// Division by one is a shift.
|
418
|
+
uint32_t integrals = static_cast<uint32_t>(too_high.f() >> -one.e());
|
419
|
+
// Modulo by one is an and.
|
420
|
+
uint64_t fractionals = too_high.f() & (one.f() - 1);
|
421
|
+
uint32_t divisor;
|
422
|
+
int divisor_exponent;
|
423
|
+
BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
|
424
|
+
&divisor, &divisor_exponent);
|
425
|
+
*kappa = divisor_exponent + 1;
|
426
|
+
*length = 0;
|
427
|
+
// Loop invariant: buffer = too_high / 10^kappa (integer division)
|
428
|
+
// The invariant holds for the first iteration: kappa has been initialized
|
429
|
+
// with the divisor exponent + 1. And the divisor is the biggest power of ten
|
430
|
+
// that is smaller than integrals.
|
431
|
+
while (*kappa > 0) {
|
432
|
+
int digit = integrals / divisor;
|
433
|
+
buffer[*length] = '0' + digit;
|
434
|
+
(*length)++;
|
435
|
+
integrals %= divisor;
|
436
|
+
(*kappa)--;
|
437
|
+
// Note that kappa now equals the exponent of the divisor and that the
|
438
|
+
// invariant thus holds again.
|
439
|
+
uint64_t rest =
|
440
|
+
(static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
|
441
|
+
// Invariant: too_high = buffer * 10^kappa + DiyFp(rest, one.e())
|
442
|
+
// Reminder: unsafe_interval.e() == one.e()
|
443
|
+
if (rest < unsafe_interval.f()) {
|
444
|
+
// Rounding down (by not emitting the remaining digits) yields a number
|
445
|
+
// that lies within the unsafe interval.
|
446
|
+
return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f(),
|
447
|
+
unsafe_interval.f(), rest,
|
448
|
+
static_cast<uint64_t>(divisor) << -one.e(), unit);
|
449
|
+
}
|
450
|
+
divisor /= 10;
|
451
|
+
}
|
452
|
+
|
453
|
+
// The integrals have been generated. We are at the point of the decimal
|
454
|
+
// separator. In the following loop we simply multiply the remaining digits by
|
455
|
+
// 10 and divide by one. We just need to pay attention to multiply associated
|
456
|
+
// data (like the interval or 'unit'), too.
|
457
|
+
// Note that the multiplication by 10 does not overflow, because w.e >= -60
|
458
|
+
// and thus one.e >= -60.
|
459
|
+
ASSERT(one.e() >= -60);
|
460
|
+
ASSERT(fractionals < one.f());
|
461
|
+
ASSERT(V8_2PART_UINT64_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
|
462
|
+
while (true) {
|
463
|
+
fractionals *= 10;
|
464
|
+
unit *= 10;
|
465
|
+
unsafe_interval.set_f(unsafe_interval.f() * 10);
|
466
|
+
// Integer division by one.
|
467
|
+
int digit = static_cast<int>(fractionals >> -one.e());
|
468
|
+
buffer[*length] = '0' + digit;
|
469
|
+
(*length)++;
|
470
|
+
fractionals &= one.f() - 1; // Modulo by one.
|
471
|
+
(*kappa)--;
|
472
|
+
if (fractionals < unsafe_interval.f()) {
|
473
|
+
return RoundWeed(buffer, *length, DiyFp::Minus(too_high, w).f() * unit,
|
474
|
+
unsafe_interval.f(), fractionals, one.f(), unit);
|
475
|
+
}
|
476
|
+
}
|
477
|
+
}
|
478
|
+
|
479
|
+
|
480
|
+
|
481
|
+
// Generates (at most) requested_digits of input number w.
|
482
|
+
// w is a floating-point number (DiyFp), consisting of a significand and an
|
483
|
+
// exponent. Its exponent is bounded by kMinimalTargetExponent and
|
484
|
+
// kMaximalTargetExponent.
|
485
|
+
// Hence -60 <= w.e() <= -32.
|
486
|
+
//
|
487
|
+
// Returns false if it fails, in which case the generated digits in the buffer
|
488
|
+
// should not be used.
|
489
|
+
// Preconditions:
|
490
|
+
// * w is correct up to 1 ulp (unit in the last place). That
|
491
|
+
// is, its error must be strictly less than a unit of its last digit.
|
492
|
+
// * kMinimalTargetExponent <= w.e() <= kMaximalTargetExponent
|
493
|
+
//
|
494
|
+
// Postconditions: returns false if procedure fails.
|
495
|
+
// otherwise:
|
496
|
+
// * buffer is not null-terminated, but length contains the number of
|
497
|
+
// digits.
|
498
|
+
// * the representation in buffer is the most precise representation of
|
499
|
+
// requested_digits digits.
|
500
|
+
// * buffer contains at most requested_digits digits of w. If there are less
|
501
|
+
// than requested_digits digits then some trailing '0's have been removed.
|
502
|
+
// * kappa is such that
|
503
|
+
// w = buffer * 10^kappa + eps with |eps| < 10^kappa / 2.
|
504
|
+
//
|
505
|
+
// Remark: This procedure takes into account the imprecision of its input
|
506
|
+
// numbers. If the precision is not enough to guarantee all the postconditions
|
507
|
+
// then false is returned. This usually happens rarely, but the failure-rate
|
508
|
+
// increases with higher requested_digits.
|
509
|
+
static bool DigitGenCounted(DiyFp w,
|
510
|
+
int requested_digits,
|
511
|
+
Vector<char> buffer,
|
512
|
+
int* length,
|
513
|
+
int* kappa) {
|
514
|
+
ASSERT(kMinimalTargetExponent <= w.e() && w.e() <= kMaximalTargetExponent);
|
515
|
+
ASSERT(kMinimalTargetExponent >= -60);
|
516
|
+
ASSERT(kMaximalTargetExponent <= -32);
|
517
|
+
// w is assumed to have an error less than 1 unit. Whenever w is scaled we
|
518
|
+
// also scale its error.
|
519
|
+
uint64_t w_error = 1;
|
520
|
+
// We cut the input number into two parts: the integral digits and the
|
521
|
+
// fractional digits. We don't emit any decimal separator, but adapt kappa
|
522
|
+
// instead. Example: instead of writing "1.2" we put "12" into the buffer and
|
523
|
+
// increase kappa by 1.
|
524
|
+
DiyFp one = DiyFp(static_cast<uint64_t>(1) << -w.e(), w.e());
|
525
|
+
// Division by one is a shift.
|
526
|
+
uint32_t integrals = static_cast<uint32_t>(w.f() >> -one.e());
|
527
|
+
// Modulo by one is an and.
|
528
|
+
uint64_t fractionals = w.f() & (one.f() - 1);
|
529
|
+
uint32_t divisor;
|
530
|
+
int divisor_exponent;
|
531
|
+
BiggestPowerTen(integrals, DiyFp::kSignificandSize - (-one.e()),
|
532
|
+
&divisor, &divisor_exponent);
|
533
|
+
*kappa = divisor_exponent + 1;
|
534
|
+
*length = 0;
|
535
|
+
|
536
|
+
// Loop invariant: buffer = w / 10^kappa (integer division)
|
537
|
+
// The invariant holds for the first iteration: kappa has been initialized
|
538
|
+
// with the divisor exponent + 1. And the divisor is the biggest power of ten
|
539
|
+
// that is smaller than 'integrals'.
|
540
|
+
while (*kappa > 0) {
|
541
|
+
int digit = integrals / divisor;
|
542
|
+
buffer[*length] = '0' + digit;
|
543
|
+
(*length)++;
|
544
|
+
requested_digits--;
|
545
|
+
integrals %= divisor;
|
546
|
+
(*kappa)--;
|
547
|
+
// Note that kappa now equals the exponent of the divisor and that the
|
548
|
+
// invariant thus holds again.
|
549
|
+
if (requested_digits == 0) break;
|
550
|
+
divisor /= 10;
|
551
|
+
}
|
552
|
+
|
553
|
+
if (requested_digits == 0) {
|
554
|
+
uint64_t rest =
|
555
|
+
(static_cast<uint64_t>(integrals) << -one.e()) + fractionals;
|
556
|
+
return RoundWeedCounted(buffer, *length, rest,
|
557
|
+
static_cast<uint64_t>(divisor) << -one.e(), w_error,
|
558
|
+
kappa);
|
559
|
+
}
|
560
|
+
|
561
|
+
// The integrals have been generated. We are at the point of the decimal
|
562
|
+
// separator. In the following loop we simply multiply the remaining digits by
|
563
|
+
// 10 and divide by one. We just need to pay attention to multiply associated
|
564
|
+
// data (the 'unit'), too.
|
565
|
+
// Note that the multiplication by 10 does not overflow, because w.e >= -60
|
566
|
+
// and thus one.e >= -60.
|
567
|
+
ASSERT(one.e() >= -60);
|
568
|
+
ASSERT(fractionals < one.f());
|
569
|
+
ASSERT(V8_2PART_UINT64_C(0xFFFFFFFF, FFFFFFFF) / 10 >= one.f());
|
570
|
+
while (requested_digits > 0 && fractionals > w_error) {
|
571
|
+
fractionals *= 10;
|
572
|
+
w_error *= 10;
|
573
|
+
// Integer division by one.
|
574
|
+
int digit = static_cast<int>(fractionals >> -one.e());
|
575
|
+
buffer[*length] = '0' + digit;
|
576
|
+
(*length)++;
|
577
|
+
requested_digits--;
|
578
|
+
fractionals &= one.f() - 1; // Modulo by one.
|
579
|
+
(*kappa)--;
|
580
|
+
}
|
581
|
+
if (requested_digits != 0) return false;
|
582
|
+
return RoundWeedCounted(buffer, *length, fractionals, one.f(), w_error,
|
583
|
+
kappa);
|
584
|
+
}
|
585
|
+
|
586
|
+
|
587
|
+
// Provides a decimal representation of v.
|
588
|
+
// Returns true if it succeeds, otherwise the result cannot be trusted.
|
589
|
+
// There will be *length digits inside the buffer (not null-terminated).
|
590
|
+
// If the function returns true then
|
591
|
+
// v == (double) (buffer * 10^decimal_exponent).
|
592
|
+
// The digits in the buffer are the shortest representation possible: no
|
593
|
+
// 0.09999999999999999 instead of 0.1. The shorter representation will even be
|
594
|
+
// chosen even if the longer one would be closer to v.
|
595
|
+
// The last digit will be closest to the actual v. That is, even if several
|
596
|
+
// digits might correctly yield 'v' when read again, the closest will be
|
597
|
+
// computed.
|
598
|
+
static bool Grisu3(double v,
|
599
|
+
Vector<char> buffer,
|
600
|
+
int* length,
|
601
|
+
int* decimal_exponent) {
|
602
|
+
DiyFp w = Double(v).AsNormalizedDiyFp();
|
603
|
+
// boundary_minus and boundary_plus are the boundaries between v and its
|
604
|
+
// closest floating-point neighbors. Any number strictly between
|
605
|
+
// boundary_minus and boundary_plus will round to v when convert to a double.
|
606
|
+
// Grisu3 will never output representations that lie exactly on a boundary.
|
607
|
+
DiyFp boundary_minus, boundary_plus;
|
608
|
+
Double(v).NormalizedBoundaries(&boundary_minus, &boundary_plus);
|
609
|
+
ASSERT(boundary_plus.e() == w.e());
|
610
|
+
DiyFp ten_mk; // Cached power of ten: 10^-k
|
611
|
+
int mk; // -k
|
612
|
+
int ten_mk_minimal_binary_exponent =
|
613
|
+
kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
|
614
|
+
int ten_mk_maximal_binary_exponent =
|
615
|
+
kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
|
616
|
+
PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
|
617
|
+
ten_mk_minimal_binary_exponent,
|
618
|
+
ten_mk_maximal_binary_exponent,
|
619
|
+
&ten_mk, &mk);
|
620
|
+
ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
|
621
|
+
DiyFp::kSignificandSize) &&
|
622
|
+
(kMaximalTargetExponent >= w.e() + ten_mk.e() +
|
623
|
+
DiyFp::kSignificandSize));
|
624
|
+
// Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
|
625
|
+
// 64 bit significand and ten_mk is thus only precise up to 64 bits.
|
626
|
+
|
627
|
+
// The DiyFp::Times procedure rounds its result, and ten_mk is approximated
|
628
|
+
// too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
|
629
|
+
// off by a small amount.
|
630
|
+
// In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
|
631
|
+
// In other words: let f = scaled_w.f() and e = scaled_w.e(), then
|
632
|
+
// (f-1) * 2^e < w*10^k < (f+1) * 2^e
|
633
|
+
DiyFp scaled_w = DiyFp::Times(w, ten_mk);
|
634
|
+
ASSERT(scaled_w.e() ==
|
635
|
+
boundary_plus.e() + ten_mk.e() + DiyFp::kSignificandSize);
|
636
|
+
// In theory it would be possible to avoid some recomputations by computing
|
637
|
+
// the difference between w and boundary_minus/plus (a power of 2) and to
|
638
|
+
// compute scaled_boundary_minus/plus by subtracting/adding from
|
639
|
+
// scaled_w. However the code becomes much less readable and the speed
|
640
|
+
// enhancements are not terriffic.
|
641
|
+
DiyFp scaled_boundary_minus = DiyFp::Times(boundary_minus, ten_mk);
|
642
|
+
DiyFp scaled_boundary_plus = DiyFp::Times(boundary_plus, ten_mk);
|
643
|
+
|
644
|
+
// DigitGen will generate the digits of scaled_w. Therefore we have
|
645
|
+
// v == (double) (scaled_w * 10^-mk).
|
646
|
+
// Set decimal_exponent == -mk and pass it to DigitGen. If scaled_w is not an
|
647
|
+
// integer than it will be updated. For instance if scaled_w == 1.23 then
|
648
|
+
// the buffer will be filled with "123" und the decimal_exponent will be
|
649
|
+
// decreased by 2.
|
650
|
+
int kappa;
|
651
|
+
bool result = DigitGen(scaled_boundary_minus, scaled_w, scaled_boundary_plus,
|
652
|
+
buffer, length, &kappa);
|
653
|
+
*decimal_exponent = -mk + kappa;
|
654
|
+
return result;
|
655
|
+
}
|
656
|
+
|
657
|
+
|
658
|
+
// The "counted" version of grisu3 (see above) only generates requested_digits
|
659
|
+
// number of digits. This version does not generate the shortest representation,
|
660
|
+
// and with enough requested digits 0.1 will at some point print as 0.9999999...
|
661
|
+
// Grisu3 is too imprecise for real halfway cases (1.5 will not work) and
|
662
|
+
// therefore the rounding strategy for halfway cases is irrelevant.
|
663
|
+
static bool Grisu3Counted(double v,
|
664
|
+
int requested_digits,
|
665
|
+
Vector<char> buffer,
|
666
|
+
int* length,
|
667
|
+
int* decimal_exponent) {
|
668
|
+
DiyFp w = Double(v).AsNormalizedDiyFp();
|
669
|
+
DiyFp ten_mk; // Cached power of ten: 10^-k
|
670
|
+
int mk; // -k
|
671
|
+
int ten_mk_minimal_binary_exponent =
|
672
|
+
kMinimalTargetExponent - (w.e() + DiyFp::kSignificandSize);
|
673
|
+
int ten_mk_maximal_binary_exponent =
|
674
|
+
kMaximalTargetExponent - (w.e() + DiyFp::kSignificandSize);
|
675
|
+
PowersOfTenCache::GetCachedPowerForBinaryExponentRange(
|
676
|
+
ten_mk_minimal_binary_exponent,
|
677
|
+
ten_mk_maximal_binary_exponent,
|
678
|
+
&ten_mk, &mk);
|
679
|
+
ASSERT((kMinimalTargetExponent <= w.e() + ten_mk.e() +
|
680
|
+
DiyFp::kSignificandSize) &&
|
681
|
+
(kMaximalTargetExponent >= w.e() + ten_mk.e() +
|
682
|
+
DiyFp::kSignificandSize));
|
683
|
+
// Note that ten_mk is only an approximation of 10^-k. A DiyFp only contains a
|
684
|
+
// 64 bit significand and ten_mk is thus only precise up to 64 bits.
|
685
|
+
|
686
|
+
// The DiyFp::Times procedure rounds its result, and ten_mk is approximated
|
687
|
+
// too. The variable scaled_w (as well as scaled_boundary_minus/plus) are now
|
688
|
+
// off by a small amount.
|
689
|
+
// In fact: scaled_w - w*10^k < 1ulp (unit in the last place) of scaled_w.
|
690
|
+
// In other words: let f = scaled_w.f() and e = scaled_w.e(), then
|
691
|
+
// (f-1) * 2^e < w*10^k < (f+1) * 2^e
|
692
|
+
DiyFp scaled_w = DiyFp::Times(w, ten_mk);
|
693
|
+
|
694
|
+
// We now have (double) (scaled_w * 10^-mk).
|
695
|
+
// DigitGen will generate the first requested_digits digits of scaled_w and
|
696
|
+
// return together with a kappa such that scaled_w ~= buffer * 10^kappa. (It
|
697
|
+
// will not always be exactly the same since DigitGenCounted only produces a
|
698
|
+
// limited number of digits.)
|
699
|
+
int kappa;
|
700
|
+
bool result = DigitGenCounted(scaled_w, requested_digits,
|
701
|
+
buffer, length, &kappa);
|
702
|
+
*decimal_exponent = -mk + kappa;
|
703
|
+
return result;
|
704
|
+
}
|
705
|
+
|
706
|
+
|
707
|
+
bool FastDtoa(double v,
|
708
|
+
FastDtoaMode mode,
|
709
|
+
int requested_digits,
|
710
|
+
Vector<char> buffer,
|
711
|
+
int* length,
|
712
|
+
int* decimal_point) {
|
713
|
+
ASSERT(v > 0);
|
714
|
+
ASSERT(!Double(v).IsSpecial());
|
715
|
+
|
716
|
+
bool result = false;
|
717
|
+
int decimal_exponent = 0;
|
718
|
+
switch (mode) {
|
719
|
+
case FAST_DTOA_SHORTEST:
|
720
|
+
result = Grisu3(v, buffer, length, &decimal_exponent);
|
721
|
+
break;
|
722
|
+
case FAST_DTOA_PRECISION:
|
723
|
+
result = Grisu3Counted(v, requested_digits,
|
724
|
+
buffer, length, &decimal_exponent);
|
725
|
+
break;
|
726
|
+
default:
|
727
|
+
UNREACHABLE();
|
728
|
+
}
|
729
|
+
if (result) {
|
730
|
+
*decimal_point = *length + decimal_exponent;
|
731
|
+
buffer[*length] = '\0';
|
732
|
+
}
|
733
|
+
return result;
|
734
|
+
}
|
735
|
+
|
736
|
+
} } // namespace v8::internal
|