libv8 3.3.10.2
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/.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,220 @@
|
|
1
|
+
// Copyright 2011 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 "../include/v8-preparser.h"
|
29
|
+
|
30
|
+
#include "globals.h"
|
31
|
+
#include "checks.h"
|
32
|
+
#include "allocation.h"
|
33
|
+
#include "utils.h"
|
34
|
+
#include "list.h"
|
35
|
+
#include "scanner-base.h"
|
36
|
+
#include "preparse-data-format.h"
|
37
|
+
#include "preparse-data.h"
|
38
|
+
#include "preparser.h"
|
39
|
+
|
40
|
+
namespace v8 {
|
41
|
+
namespace internal {
|
42
|
+
|
43
|
+
// UTF16Buffer based on a v8::UnicodeInputStream.
|
44
|
+
class InputStreamUTF16Buffer : public UC16CharacterStream {
|
45
|
+
public:
|
46
|
+
/* The InputStreamUTF16Buffer maintains an internal buffer
|
47
|
+
* that is filled in chunks from the UC16CharacterStream.
|
48
|
+
* It also maintains unlimited pushback capability, but optimized
|
49
|
+
* for small pushbacks.
|
50
|
+
* The pushback_buffer_ pointer points to the limit of pushbacks
|
51
|
+
* in the current buffer. There is room for a few pushback'ed chars before
|
52
|
+
* the buffer containing the most recently read chunk. If this is overflowed,
|
53
|
+
* an external buffer is allocated/reused to hold further pushbacks, and
|
54
|
+
* pushback_buffer_ and buffer_cursor_/buffer_end_ now points to the
|
55
|
+
* new buffer. When this buffer is read to the end again, the cursor is
|
56
|
+
* switched back to the internal buffer
|
57
|
+
*/
|
58
|
+
explicit InputStreamUTF16Buffer(v8::UnicodeInputStream* stream)
|
59
|
+
: UC16CharacterStream(),
|
60
|
+
stream_(stream),
|
61
|
+
pushback_buffer_(buffer_),
|
62
|
+
pushback_buffer_end_cache_(NULL),
|
63
|
+
pushback_buffer_backing_(NULL),
|
64
|
+
pushback_buffer_backing_size_(0) {
|
65
|
+
buffer_cursor_ = buffer_end_ = buffer_ + kPushBackSize;
|
66
|
+
}
|
67
|
+
|
68
|
+
virtual ~InputStreamUTF16Buffer() {
|
69
|
+
if (pushback_buffer_backing_ != NULL) {
|
70
|
+
DeleteArray(pushback_buffer_backing_);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
virtual void PushBack(uc32 ch) {
|
75
|
+
ASSERT(pos_ > 0);
|
76
|
+
if (ch == kEndOfInput) {
|
77
|
+
pos_--;
|
78
|
+
return;
|
79
|
+
}
|
80
|
+
if (buffer_cursor_ <= pushback_buffer_) {
|
81
|
+
// No more room in the current buffer to do pushbacks.
|
82
|
+
if (pushback_buffer_end_cache_ == NULL) {
|
83
|
+
// We have overflowed the pushback space at the beginning of buffer_.
|
84
|
+
// Switch to using a separate allocated pushback buffer.
|
85
|
+
if (pushback_buffer_backing_ == NULL) {
|
86
|
+
// Allocate a buffer the first time we need it.
|
87
|
+
pushback_buffer_backing_ = NewArray<uc16>(kPushBackSize);
|
88
|
+
pushback_buffer_backing_size_ = kPushBackSize;
|
89
|
+
}
|
90
|
+
pushback_buffer_ = pushback_buffer_backing_;
|
91
|
+
pushback_buffer_end_cache_ = buffer_end_;
|
92
|
+
buffer_end_ = pushback_buffer_backing_ + pushback_buffer_backing_size_;
|
93
|
+
buffer_cursor_ = buffer_end_ - 1;
|
94
|
+
} else {
|
95
|
+
// Hit the bottom of the allocated pushback buffer.
|
96
|
+
// Double the buffer and continue.
|
97
|
+
uc16* new_buffer = NewArray<uc16>(pushback_buffer_backing_size_ * 2);
|
98
|
+
memcpy(new_buffer + pushback_buffer_backing_size_,
|
99
|
+
pushback_buffer_backing_,
|
100
|
+
pushback_buffer_backing_size_);
|
101
|
+
DeleteArray(pushback_buffer_backing_);
|
102
|
+
buffer_cursor_ = new_buffer + pushback_buffer_backing_size_;
|
103
|
+
pushback_buffer_backing_ = pushback_buffer_ = new_buffer;
|
104
|
+
buffer_end_ = pushback_buffer_backing_ + pushback_buffer_backing_size_;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
pushback_buffer_[buffer_cursor_ - pushback_buffer_- 1] =
|
108
|
+
static_cast<uc16>(ch);
|
109
|
+
pos_--;
|
110
|
+
}
|
111
|
+
|
112
|
+
protected:
|
113
|
+
virtual bool ReadBlock() {
|
114
|
+
if (pushback_buffer_end_cache_ != NULL) {
|
115
|
+
buffer_cursor_ = buffer_;
|
116
|
+
buffer_end_ = pushback_buffer_end_cache_;
|
117
|
+
pushback_buffer_end_cache_ = NULL;
|
118
|
+
return buffer_end_ > buffer_cursor_;
|
119
|
+
}
|
120
|
+
// Copy the top of the buffer into the pushback area.
|
121
|
+
int32_t value;
|
122
|
+
uc16* buffer_start = buffer_ + kPushBackSize;
|
123
|
+
buffer_cursor_ = buffer_end_ = buffer_start;
|
124
|
+
while ((value = stream_->Next()) >= 0) {
|
125
|
+
if (value > static_cast<int32_t>(unibrow::Utf8::kMaxThreeByteChar)) {
|
126
|
+
value = unibrow::Utf8::kBadChar;
|
127
|
+
}
|
128
|
+
// buffer_end_ is a const pointer, but buffer_ is writable.
|
129
|
+
buffer_start[buffer_end_++ - buffer_start] = static_cast<uc16>(value);
|
130
|
+
if (buffer_end_ == buffer_ + kPushBackSize + kBufferSize) break;
|
131
|
+
}
|
132
|
+
return buffer_end_ > buffer_start;
|
133
|
+
}
|
134
|
+
|
135
|
+
virtual unsigned SlowSeekForward(unsigned pos) {
|
136
|
+
// Seeking in the input is not used by preparsing.
|
137
|
+
// It's only used by the real parser based on preparser data.
|
138
|
+
UNIMPLEMENTED();
|
139
|
+
return 0;
|
140
|
+
}
|
141
|
+
|
142
|
+
private:
|
143
|
+
static const unsigned kBufferSize = 512;
|
144
|
+
static const unsigned kPushBackSize = 16;
|
145
|
+
v8::UnicodeInputStream* const stream_;
|
146
|
+
// Buffer holding first kPushBackSize characters of pushback buffer,
|
147
|
+
// then kBufferSize chars of read-ahead.
|
148
|
+
// The pushback buffer is only used if pushing back characters past
|
149
|
+
// the start of a block.
|
150
|
+
uc16 buffer_[kPushBackSize + kBufferSize];
|
151
|
+
// Limit of pushbacks before new allocation is necessary.
|
152
|
+
uc16* pushback_buffer_;
|
153
|
+
// Only if that pushback buffer at the start of buffer_ isn't sufficient
|
154
|
+
// is the following used.
|
155
|
+
const uc16* pushback_buffer_end_cache_;
|
156
|
+
uc16* pushback_buffer_backing_;
|
157
|
+
unsigned pushback_buffer_backing_size_;
|
158
|
+
};
|
159
|
+
|
160
|
+
|
161
|
+
class StandAloneJavaScriptScanner : public JavaScriptScanner {
|
162
|
+
public:
|
163
|
+
explicit StandAloneJavaScriptScanner(UnicodeCache* unicode_cache)
|
164
|
+
: JavaScriptScanner(unicode_cache) { }
|
165
|
+
|
166
|
+
void Initialize(UC16CharacterStream* source) {
|
167
|
+
source_ = source;
|
168
|
+
Init();
|
169
|
+
// Skip initial whitespace allowing HTML comment ends just like
|
170
|
+
// after a newline and scan first token.
|
171
|
+
has_line_terminator_before_next_ = true;
|
172
|
+
SkipWhiteSpace();
|
173
|
+
Scan();
|
174
|
+
}
|
175
|
+
};
|
176
|
+
|
177
|
+
|
178
|
+
// Functions declared by allocation.h and implemented in both api.cc (for v8)
|
179
|
+
// or here (for a stand-alone preparser).
|
180
|
+
|
181
|
+
void FatalProcessOutOfMemory(const char* reason) {
|
182
|
+
V8_Fatal(__FILE__, __LINE__, reason);
|
183
|
+
}
|
184
|
+
|
185
|
+
bool EnableSlowAsserts() { return true; }
|
186
|
+
|
187
|
+
} // namespace internal.
|
188
|
+
|
189
|
+
|
190
|
+
UnicodeInputStream::~UnicodeInputStream() { }
|
191
|
+
|
192
|
+
|
193
|
+
PreParserData Preparse(UnicodeInputStream* input, size_t max_stack) {
|
194
|
+
internal::InputStreamUTF16Buffer buffer(input);
|
195
|
+
uintptr_t stack_limit = reinterpret_cast<uintptr_t>(&buffer) - max_stack;
|
196
|
+
internal::UnicodeCache unicode_cache;
|
197
|
+
internal::StandAloneJavaScriptScanner scanner(&unicode_cache);
|
198
|
+
scanner.Initialize(&buffer);
|
199
|
+
internal::CompleteParserRecorder recorder;
|
200
|
+
preparser::PreParser::PreParseResult result =
|
201
|
+
preparser::PreParser::PreParseProgram(&scanner,
|
202
|
+
&recorder,
|
203
|
+
true,
|
204
|
+
stack_limit);
|
205
|
+
if (result == preparser::PreParser::kPreParseStackOverflow) {
|
206
|
+
return PreParserData::StackOverflow();
|
207
|
+
}
|
208
|
+
internal::Vector<unsigned> pre_data = recorder.ExtractData();
|
209
|
+
size_t size = pre_data.length() * sizeof(pre_data[0]);
|
210
|
+
unsigned char* data = reinterpret_cast<unsigned char*>(pre_data.start());
|
211
|
+
return PreParserData(size, data);
|
212
|
+
}
|
213
|
+
|
214
|
+
} // namespace v8.
|
215
|
+
|
216
|
+
|
217
|
+
// Used by ASSERT macros and other immediate exits.
|
218
|
+
extern "C" void V8_Fatal(const char* file, int line, const char* format, ...) {
|
219
|
+
exit(EXIT_FAILURE);
|
220
|
+
}
|
@@ -0,0 +1,1450 @@
|
|
1
|
+
// Copyright 2011 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 "../include/v8stdint.h"
|
29
|
+
#include "unicode.h"
|
30
|
+
#include "globals.h"
|
31
|
+
#include "checks.h"
|
32
|
+
#include "allocation.h"
|
33
|
+
#include "utils.h"
|
34
|
+
#include "list.h"
|
35
|
+
|
36
|
+
#include "scanner-base.h"
|
37
|
+
#include "preparse-data-format.h"
|
38
|
+
#include "preparse-data.h"
|
39
|
+
#include "preparser.h"
|
40
|
+
|
41
|
+
namespace v8 {
|
42
|
+
namespace preparser {
|
43
|
+
|
44
|
+
// Preparsing checks a JavaScript program and emits preparse-data that helps
|
45
|
+
// a later parsing to be faster.
|
46
|
+
// See preparser-data.h for the data.
|
47
|
+
|
48
|
+
// The PreParser checks that the syntax follows the grammar for JavaScript,
|
49
|
+
// and collects some information about the program along the way.
|
50
|
+
// The grammar check is only performed in order to understand the program
|
51
|
+
// sufficiently to deduce some information about it, that can be used
|
52
|
+
// to speed up later parsing. Finding errors is not the goal of pre-parsing,
|
53
|
+
// rather it is to speed up properly written and correct programs.
|
54
|
+
// That means that contextual checks (like a label being declared where
|
55
|
+
// it is used) are generally omitted.
|
56
|
+
|
57
|
+
namespace i = ::v8::internal;
|
58
|
+
|
59
|
+
void PreParser::ReportUnexpectedToken(i::Token::Value token) {
|
60
|
+
// We don't report stack overflows here, to avoid increasing the
|
61
|
+
// stack depth even further. Instead we report it after parsing is
|
62
|
+
// over, in ParseProgram.
|
63
|
+
if (token == i::Token::ILLEGAL && stack_overflow_) {
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
i::JavaScriptScanner::Location source_location = scanner_->location();
|
67
|
+
|
68
|
+
// Four of the tokens are treated specially
|
69
|
+
switch (token) {
|
70
|
+
case i::Token::EOS:
|
71
|
+
return ReportMessageAt(source_location.beg_pos, source_location.end_pos,
|
72
|
+
"unexpected_eos", NULL);
|
73
|
+
case i::Token::NUMBER:
|
74
|
+
return ReportMessageAt(source_location.beg_pos, source_location.end_pos,
|
75
|
+
"unexpected_token_number", NULL);
|
76
|
+
case i::Token::STRING:
|
77
|
+
return ReportMessageAt(source_location.beg_pos, source_location.end_pos,
|
78
|
+
"unexpected_token_string", NULL);
|
79
|
+
case i::Token::IDENTIFIER:
|
80
|
+
case i::Token::FUTURE_RESERVED_WORD:
|
81
|
+
return ReportMessageAt(source_location.beg_pos, source_location.end_pos,
|
82
|
+
"unexpected_token_identifier", NULL);
|
83
|
+
default:
|
84
|
+
const char* name = i::Token::String(token);
|
85
|
+
ReportMessageAt(source_location.beg_pos, source_location.end_pos,
|
86
|
+
"unexpected_token", name);
|
87
|
+
}
|
88
|
+
}
|
89
|
+
|
90
|
+
|
91
|
+
// Checks whether octal literal last seen is between beg_pos and end_pos.
|
92
|
+
// If so, reports an error.
|
93
|
+
void PreParser::CheckOctalLiteral(int beg_pos, int end_pos, bool* ok) {
|
94
|
+
i::Scanner::Location octal = scanner_->octal_position();
|
95
|
+
if (beg_pos <= octal.beg_pos && octal.end_pos <= end_pos) {
|
96
|
+
ReportMessageAt(octal.beg_pos, octal.end_pos, "strict_octal_literal", NULL);
|
97
|
+
scanner_->clear_octal_position();
|
98
|
+
*ok = false;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
|
103
|
+
#define CHECK_OK ok); \
|
104
|
+
if (!*ok) return kUnknownSourceElements; \
|
105
|
+
((void)0
|
106
|
+
#define DUMMY ) // to make indentation work
|
107
|
+
#undef DUMMY
|
108
|
+
|
109
|
+
|
110
|
+
PreParser::SourceElements PreParser::ParseSourceElements(int end_token,
|
111
|
+
bool* ok) {
|
112
|
+
// SourceElements ::
|
113
|
+
// (Statement)* <end_token>
|
114
|
+
|
115
|
+
bool allow_directive_prologue = true;
|
116
|
+
while (peek() != end_token) {
|
117
|
+
Statement statement = ParseStatement(CHECK_OK);
|
118
|
+
if (allow_directive_prologue) {
|
119
|
+
if (statement.IsUseStrictLiteral()) {
|
120
|
+
set_strict_mode();
|
121
|
+
} else if (!statement.IsStringLiteral()) {
|
122
|
+
allow_directive_prologue = false;
|
123
|
+
}
|
124
|
+
}
|
125
|
+
}
|
126
|
+
return kUnknownSourceElements;
|
127
|
+
}
|
128
|
+
|
129
|
+
|
130
|
+
#undef CHECK_OK
|
131
|
+
#define CHECK_OK ok); \
|
132
|
+
if (!*ok) return Statement::Default(); \
|
133
|
+
((void)0
|
134
|
+
#define DUMMY ) // to make indentation work
|
135
|
+
#undef DUMMY
|
136
|
+
|
137
|
+
|
138
|
+
PreParser::Statement PreParser::ParseStatement(bool* ok) {
|
139
|
+
// Statement ::
|
140
|
+
// Block
|
141
|
+
// VariableStatement
|
142
|
+
// EmptyStatement
|
143
|
+
// ExpressionStatement
|
144
|
+
// IfStatement
|
145
|
+
// IterationStatement
|
146
|
+
// ContinueStatement
|
147
|
+
// BreakStatement
|
148
|
+
// ReturnStatement
|
149
|
+
// WithStatement
|
150
|
+
// LabelledStatement
|
151
|
+
// SwitchStatement
|
152
|
+
// ThrowStatement
|
153
|
+
// TryStatement
|
154
|
+
// DebuggerStatement
|
155
|
+
|
156
|
+
// Note: Since labels can only be used by 'break' and 'continue'
|
157
|
+
// statements, which themselves are only valid within blocks,
|
158
|
+
// iterations or 'switch' statements (i.e., BreakableStatements),
|
159
|
+
// labels can be simply ignored in all other cases; except for
|
160
|
+
// trivial labeled break statements 'label: break label' which is
|
161
|
+
// parsed into an empty statement.
|
162
|
+
|
163
|
+
// Keep the source position of the statement
|
164
|
+
switch (peek()) {
|
165
|
+
case i::Token::LBRACE:
|
166
|
+
return ParseBlock(ok);
|
167
|
+
|
168
|
+
case i::Token::CONST:
|
169
|
+
case i::Token::VAR:
|
170
|
+
return ParseVariableStatement(ok);
|
171
|
+
|
172
|
+
case i::Token::SEMICOLON:
|
173
|
+
Next();
|
174
|
+
return Statement::Default();
|
175
|
+
|
176
|
+
case i::Token::IF:
|
177
|
+
return ParseIfStatement(ok);
|
178
|
+
|
179
|
+
case i::Token::DO:
|
180
|
+
return ParseDoWhileStatement(ok);
|
181
|
+
|
182
|
+
case i::Token::WHILE:
|
183
|
+
return ParseWhileStatement(ok);
|
184
|
+
|
185
|
+
case i::Token::FOR:
|
186
|
+
return ParseForStatement(ok);
|
187
|
+
|
188
|
+
case i::Token::CONTINUE:
|
189
|
+
return ParseContinueStatement(ok);
|
190
|
+
|
191
|
+
case i::Token::BREAK:
|
192
|
+
return ParseBreakStatement(ok);
|
193
|
+
|
194
|
+
case i::Token::RETURN:
|
195
|
+
return ParseReturnStatement(ok);
|
196
|
+
|
197
|
+
case i::Token::WITH:
|
198
|
+
return ParseWithStatement(ok);
|
199
|
+
|
200
|
+
case i::Token::SWITCH:
|
201
|
+
return ParseSwitchStatement(ok);
|
202
|
+
|
203
|
+
case i::Token::THROW:
|
204
|
+
return ParseThrowStatement(ok);
|
205
|
+
|
206
|
+
case i::Token::TRY:
|
207
|
+
return ParseTryStatement(ok);
|
208
|
+
|
209
|
+
case i::Token::FUNCTION:
|
210
|
+
return ParseFunctionDeclaration(ok);
|
211
|
+
|
212
|
+
case i::Token::NATIVE:
|
213
|
+
return ParseNativeDeclaration(ok);
|
214
|
+
|
215
|
+
case i::Token::DEBUGGER:
|
216
|
+
return ParseDebuggerStatement(ok);
|
217
|
+
|
218
|
+
default:
|
219
|
+
return ParseExpressionOrLabelledStatement(ok);
|
220
|
+
}
|
221
|
+
}
|
222
|
+
|
223
|
+
|
224
|
+
PreParser::Statement PreParser::ParseFunctionDeclaration(bool* ok) {
|
225
|
+
// FunctionDeclaration ::
|
226
|
+
// 'function' Identifier '(' FormalParameterListopt ')' '{' FunctionBody '}'
|
227
|
+
Expect(i::Token::FUNCTION, CHECK_OK);
|
228
|
+
|
229
|
+
Identifier identifier = ParseIdentifier(CHECK_OK);
|
230
|
+
i::Scanner::Location location = scanner_->location();
|
231
|
+
|
232
|
+
Expression function_value = ParseFunctionLiteral(CHECK_OK);
|
233
|
+
|
234
|
+
if (function_value.IsStrictFunction() &&
|
235
|
+
!identifier.IsValidStrictVariable()) {
|
236
|
+
// Strict mode violation, using either reserved word or eval/arguments
|
237
|
+
// as name of strict function.
|
238
|
+
const char* type = "strict_function_name";
|
239
|
+
if (identifier.IsFutureReserved()) {
|
240
|
+
type = "strict_reserved_word";
|
241
|
+
}
|
242
|
+
ReportMessageAt(location.beg_pos, location.end_pos, type, NULL);
|
243
|
+
*ok = false;
|
244
|
+
}
|
245
|
+
return Statement::FunctionDeclaration();
|
246
|
+
}
|
247
|
+
|
248
|
+
|
249
|
+
// Language extension which is only enabled for source files loaded
|
250
|
+
// through the API's extension mechanism. A native function
|
251
|
+
// declaration is resolved by looking up the function through a
|
252
|
+
// callback provided by the extension.
|
253
|
+
PreParser::Statement PreParser::ParseNativeDeclaration(bool* ok) {
|
254
|
+
Expect(i::Token::NATIVE, CHECK_OK);
|
255
|
+
Expect(i::Token::FUNCTION, CHECK_OK);
|
256
|
+
ParseIdentifier(CHECK_OK);
|
257
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
258
|
+
bool done = (peek() == i::Token::RPAREN);
|
259
|
+
while (!done) {
|
260
|
+
ParseIdentifier(CHECK_OK);
|
261
|
+
done = (peek() == i::Token::RPAREN);
|
262
|
+
if (!done) {
|
263
|
+
Expect(i::Token::COMMA, CHECK_OK);
|
264
|
+
}
|
265
|
+
}
|
266
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
267
|
+
Expect(i::Token::SEMICOLON, CHECK_OK);
|
268
|
+
return Statement::Default();
|
269
|
+
}
|
270
|
+
|
271
|
+
|
272
|
+
PreParser::Statement PreParser::ParseBlock(bool* ok) {
|
273
|
+
// Block ::
|
274
|
+
// '{' Statement* '}'
|
275
|
+
|
276
|
+
// Note that a Block does not introduce a new execution scope!
|
277
|
+
// (ECMA-262, 3rd, 12.2)
|
278
|
+
//
|
279
|
+
Expect(i::Token::LBRACE, CHECK_OK);
|
280
|
+
while (peek() != i::Token::RBRACE) {
|
281
|
+
i::Scanner::Location start_location = scanner_->peek_location();
|
282
|
+
Statement statement = ParseStatement(CHECK_OK);
|
283
|
+
i::Scanner::Location end_location = scanner_->location();
|
284
|
+
if (strict_mode() && statement.IsFunctionDeclaration()) {
|
285
|
+
ReportMessageAt(start_location.beg_pos, end_location.end_pos,
|
286
|
+
"strict_function", NULL);
|
287
|
+
*ok = false;
|
288
|
+
return Statement::Default();
|
289
|
+
}
|
290
|
+
}
|
291
|
+
Expect(i::Token::RBRACE, ok);
|
292
|
+
return Statement::Default();
|
293
|
+
}
|
294
|
+
|
295
|
+
|
296
|
+
PreParser::Statement PreParser::ParseVariableStatement(bool* ok) {
|
297
|
+
// VariableStatement ::
|
298
|
+
// VariableDeclarations ';'
|
299
|
+
|
300
|
+
Statement result = ParseVariableDeclarations(true, NULL, CHECK_OK);
|
301
|
+
ExpectSemicolon(CHECK_OK);
|
302
|
+
return result;
|
303
|
+
}
|
304
|
+
|
305
|
+
|
306
|
+
// If the variable declaration declares exactly one non-const
|
307
|
+
// variable, then *var is set to that variable. In all other cases,
|
308
|
+
// *var is untouched; in particular, it is the caller's responsibility
|
309
|
+
// to initialize it properly. This mechanism is also used for the parsing
|
310
|
+
// of 'for-in' loops.
|
311
|
+
PreParser::Statement PreParser::ParseVariableDeclarations(bool accept_IN,
|
312
|
+
int* num_decl,
|
313
|
+
bool* ok) {
|
314
|
+
// VariableDeclarations ::
|
315
|
+
// ('var' | 'const') (Identifier ('=' AssignmentExpression)?)+[',']
|
316
|
+
|
317
|
+
if (peek() == i::Token::VAR) {
|
318
|
+
Consume(i::Token::VAR);
|
319
|
+
} else if (peek() == i::Token::CONST) {
|
320
|
+
if (strict_mode()) {
|
321
|
+
i::Scanner::Location location = scanner_->peek_location();
|
322
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
323
|
+
"strict_const", NULL);
|
324
|
+
*ok = false;
|
325
|
+
return Statement::Default();
|
326
|
+
}
|
327
|
+
Consume(i::Token::CONST);
|
328
|
+
} else {
|
329
|
+
*ok = false;
|
330
|
+
return Statement::Default();
|
331
|
+
}
|
332
|
+
|
333
|
+
// The scope of a variable/const declared anywhere inside a function
|
334
|
+
// is the entire function (ECMA-262, 3rd, 10.1.3, and 12.2). .
|
335
|
+
int nvars = 0; // the number of variables declared
|
336
|
+
do {
|
337
|
+
// Parse variable name.
|
338
|
+
if (nvars > 0) Consume(i::Token::COMMA);
|
339
|
+
Identifier identifier = ParseIdentifier(CHECK_OK);
|
340
|
+
if (strict_mode() && !identifier.IsValidStrictVariable()) {
|
341
|
+
StrictModeIdentifierViolation(scanner_->location(),
|
342
|
+
"strict_var_name",
|
343
|
+
identifier,
|
344
|
+
ok);
|
345
|
+
return Statement::Default();
|
346
|
+
}
|
347
|
+
nvars++;
|
348
|
+
if (peek() == i::Token::ASSIGN) {
|
349
|
+
Expect(i::Token::ASSIGN, CHECK_OK);
|
350
|
+
ParseAssignmentExpression(accept_IN, CHECK_OK);
|
351
|
+
}
|
352
|
+
} while (peek() == i::Token::COMMA);
|
353
|
+
|
354
|
+
if (num_decl != NULL) *num_decl = nvars;
|
355
|
+
return Statement::Default();
|
356
|
+
}
|
357
|
+
|
358
|
+
|
359
|
+
PreParser::Statement PreParser::ParseExpressionOrLabelledStatement(bool* ok) {
|
360
|
+
// ExpressionStatement | LabelledStatement ::
|
361
|
+
// Expression ';'
|
362
|
+
// Identifier ':' Statement
|
363
|
+
|
364
|
+
Expression expr = ParseExpression(true, CHECK_OK);
|
365
|
+
if (peek() == i::Token::COLON && expr.IsRawIdentifier()) {
|
366
|
+
if (!strict_mode() || !expr.AsIdentifier().IsFutureReserved()) {
|
367
|
+
Consume(i::Token::COLON);
|
368
|
+
i::Scanner::Location start_location = scanner_->peek_location();
|
369
|
+
Statement statement = ParseStatement(CHECK_OK);
|
370
|
+
if (strict_mode() && statement.IsFunctionDeclaration()) {
|
371
|
+
i::Scanner::Location end_location = scanner_->location();
|
372
|
+
ReportMessageAt(start_location.beg_pos, end_location.end_pos,
|
373
|
+
"strict_function", NULL);
|
374
|
+
*ok = false;
|
375
|
+
}
|
376
|
+
return Statement::Default();
|
377
|
+
}
|
378
|
+
}
|
379
|
+
// Parsed expression statement.
|
380
|
+
ExpectSemicolon(CHECK_OK);
|
381
|
+
return Statement::ExpressionStatement(expr);
|
382
|
+
}
|
383
|
+
|
384
|
+
|
385
|
+
PreParser::Statement PreParser::ParseIfStatement(bool* ok) {
|
386
|
+
// IfStatement ::
|
387
|
+
// 'if' '(' Expression ')' Statement ('else' Statement)?
|
388
|
+
|
389
|
+
Expect(i::Token::IF, CHECK_OK);
|
390
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
391
|
+
ParseExpression(true, CHECK_OK);
|
392
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
393
|
+
ParseStatement(CHECK_OK);
|
394
|
+
if (peek() == i::Token::ELSE) {
|
395
|
+
Next();
|
396
|
+
ParseStatement(CHECK_OK);
|
397
|
+
}
|
398
|
+
return Statement::Default();
|
399
|
+
}
|
400
|
+
|
401
|
+
|
402
|
+
PreParser::Statement PreParser::ParseContinueStatement(bool* ok) {
|
403
|
+
// ContinueStatement ::
|
404
|
+
// 'continue' [no line terminator] Identifier? ';'
|
405
|
+
|
406
|
+
Expect(i::Token::CONTINUE, CHECK_OK);
|
407
|
+
i::Token::Value tok = peek();
|
408
|
+
if (!scanner_->has_line_terminator_before_next() &&
|
409
|
+
tok != i::Token::SEMICOLON &&
|
410
|
+
tok != i::Token::RBRACE &&
|
411
|
+
tok != i::Token::EOS) {
|
412
|
+
ParseIdentifier(CHECK_OK);
|
413
|
+
}
|
414
|
+
ExpectSemicolon(CHECK_OK);
|
415
|
+
return Statement::Default();
|
416
|
+
}
|
417
|
+
|
418
|
+
|
419
|
+
PreParser::Statement PreParser::ParseBreakStatement(bool* ok) {
|
420
|
+
// BreakStatement ::
|
421
|
+
// 'break' [no line terminator] Identifier? ';'
|
422
|
+
|
423
|
+
Expect(i::Token::BREAK, CHECK_OK);
|
424
|
+
i::Token::Value tok = peek();
|
425
|
+
if (!scanner_->has_line_terminator_before_next() &&
|
426
|
+
tok != i::Token::SEMICOLON &&
|
427
|
+
tok != i::Token::RBRACE &&
|
428
|
+
tok != i::Token::EOS) {
|
429
|
+
ParseIdentifier(CHECK_OK);
|
430
|
+
}
|
431
|
+
ExpectSemicolon(CHECK_OK);
|
432
|
+
return Statement::Default();
|
433
|
+
}
|
434
|
+
|
435
|
+
|
436
|
+
PreParser::Statement PreParser::ParseReturnStatement(bool* ok) {
|
437
|
+
// ReturnStatement ::
|
438
|
+
// 'return' [no line terminator] Expression? ';'
|
439
|
+
|
440
|
+
// Consume the return token. It is necessary to do the before
|
441
|
+
// reporting any errors on it, because of the way errors are
|
442
|
+
// reported (underlining).
|
443
|
+
Expect(i::Token::RETURN, CHECK_OK);
|
444
|
+
|
445
|
+
// An ECMAScript program is considered syntactically incorrect if it
|
446
|
+
// contains a return statement that is not within the body of a
|
447
|
+
// function. See ECMA-262, section 12.9, page 67.
|
448
|
+
// This is not handled during preparsing.
|
449
|
+
|
450
|
+
i::Token::Value tok = peek();
|
451
|
+
if (!scanner_->has_line_terminator_before_next() &&
|
452
|
+
tok != i::Token::SEMICOLON &&
|
453
|
+
tok != i::Token::RBRACE &&
|
454
|
+
tok != i::Token::EOS) {
|
455
|
+
ParseExpression(true, CHECK_OK);
|
456
|
+
}
|
457
|
+
ExpectSemicolon(CHECK_OK);
|
458
|
+
return Statement::Default();
|
459
|
+
}
|
460
|
+
|
461
|
+
|
462
|
+
PreParser::Statement PreParser::ParseWithStatement(bool* ok) {
|
463
|
+
// WithStatement ::
|
464
|
+
// 'with' '(' Expression ')' Statement
|
465
|
+
Expect(i::Token::WITH, CHECK_OK);
|
466
|
+
if (strict_mode()) {
|
467
|
+
i::Scanner::Location location = scanner_->location();
|
468
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
469
|
+
"strict_mode_with", NULL);
|
470
|
+
*ok = false;
|
471
|
+
return Statement::Default();
|
472
|
+
}
|
473
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
474
|
+
ParseExpression(true, CHECK_OK);
|
475
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
476
|
+
|
477
|
+
scope_->EnterWith();
|
478
|
+
ParseStatement(CHECK_OK);
|
479
|
+
scope_->LeaveWith();
|
480
|
+
return Statement::Default();
|
481
|
+
}
|
482
|
+
|
483
|
+
|
484
|
+
PreParser::Statement PreParser::ParseSwitchStatement(bool* ok) {
|
485
|
+
// SwitchStatement ::
|
486
|
+
// 'switch' '(' Expression ')' '{' CaseClause* '}'
|
487
|
+
|
488
|
+
Expect(i::Token::SWITCH, CHECK_OK);
|
489
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
490
|
+
ParseExpression(true, CHECK_OK);
|
491
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
492
|
+
|
493
|
+
Expect(i::Token::LBRACE, CHECK_OK);
|
494
|
+
i::Token::Value token = peek();
|
495
|
+
while (token != i::Token::RBRACE) {
|
496
|
+
if (token == i::Token::CASE) {
|
497
|
+
Expect(i::Token::CASE, CHECK_OK);
|
498
|
+
ParseExpression(true, CHECK_OK);
|
499
|
+
Expect(i::Token::COLON, CHECK_OK);
|
500
|
+
} else if (token == i::Token::DEFAULT) {
|
501
|
+
Expect(i::Token::DEFAULT, CHECK_OK);
|
502
|
+
Expect(i::Token::COLON, CHECK_OK);
|
503
|
+
} else {
|
504
|
+
i::Scanner::Location start_location = scanner_->peek_location();
|
505
|
+
Statement statement = ParseStatement(CHECK_OK);
|
506
|
+
if (strict_mode() && statement.IsFunctionDeclaration()) {
|
507
|
+
i::Scanner::Location end_location = scanner_->location();
|
508
|
+
ReportMessageAt(start_location.beg_pos, end_location.end_pos,
|
509
|
+
"strict_function", NULL);
|
510
|
+
*ok = false;
|
511
|
+
return Statement::Default();
|
512
|
+
}
|
513
|
+
}
|
514
|
+
token = peek();
|
515
|
+
}
|
516
|
+
Expect(i::Token::RBRACE, ok);
|
517
|
+
return Statement::Default();
|
518
|
+
}
|
519
|
+
|
520
|
+
|
521
|
+
PreParser::Statement PreParser::ParseDoWhileStatement(bool* ok) {
|
522
|
+
// DoStatement ::
|
523
|
+
// 'do' Statement 'while' '(' Expression ')' ';'
|
524
|
+
|
525
|
+
Expect(i::Token::DO, CHECK_OK);
|
526
|
+
ParseStatement(CHECK_OK);
|
527
|
+
Expect(i::Token::WHILE, CHECK_OK);
|
528
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
529
|
+
ParseExpression(true, CHECK_OK);
|
530
|
+
Expect(i::Token::RPAREN, ok);
|
531
|
+
return Statement::Default();
|
532
|
+
}
|
533
|
+
|
534
|
+
|
535
|
+
PreParser::Statement PreParser::ParseWhileStatement(bool* ok) {
|
536
|
+
// WhileStatement ::
|
537
|
+
// 'while' '(' Expression ')' Statement
|
538
|
+
|
539
|
+
Expect(i::Token::WHILE, CHECK_OK);
|
540
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
541
|
+
ParseExpression(true, CHECK_OK);
|
542
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
543
|
+
ParseStatement(ok);
|
544
|
+
return Statement::Default();
|
545
|
+
}
|
546
|
+
|
547
|
+
|
548
|
+
PreParser::Statement PreParser::ParseForStatement(bool* ok) {
|
549
|
+
// ForStatement ::
|
550
|
+
// 'for' '(' Expression? ';' Expression? ';' Expression? ')' Statement
|
551
|
+
|
552
|
+
Expect(i::Token::FOR, CHECK_OK);
|
553
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
554
|
+
if (peek() != i::Token::SEMICOLON) {
|
555
|
+
if (peek() == i::Token::VAR || peek() == i::Token::CONST) {
|
556
|
+
int decl_count;
|
557
|
+
ParseVariableDeclarations(false, &decl_count, CHECK_OK);
|
558
|
+
if (peek() == i::Token::IN && decl_count == 1) {
|
559
|
+
Expect(i::Token::IN, CHECK_OK);
|
560
|
+
ParseExpression(true, CHECK_OK);
|
561
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
562
|
+
|
563
|
+
ParseStatement(CHECK_OK);
|
564
|
+
return Statement::Default();
|
565
|
+
}
|
566
|
+
} else {
|
567
|
+
ParseExpression(false, CHECK_OK);
|
568
|
+
if (peek() == i::Token::IN) {
|
569
|
+
Expect(i::Token::IN, CHECK_OK);
|
570
|
+
ParseExpression(true, CHECK_OK);
|
571
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
572
|
+
|
573
|
+
ParseStatement(CHECK_OK);
|
574
|
+
return Statement::Default();
|
575
|
+
}
|
576
|
+
}
|
577
|
+
}
|
578
|
+
|
579
|
+
// Parsed initializer at this point.
|
580
|
+
Expect(i::Token::SEMICOLON, CHECK_OK);
|
581
|
+
|
582
|
+
if (peek() != i::Token::SEMICOLON) {
|
583
|
+
ParseExpression(true, CHECK_OK);
|
584
|
+
}
|
585
|
+
Expect(i::Token::SEMICOLON, CHECK_OK);
|
586
|
+
|
587
|
+
if (peek() != i::Token::RPAREN) {
|
588
|
+
ParseExpression(true, CHECK_OK);
|
589
|
+
}
|
590
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
591
|
+
|
592
|
+
ParseStatement(ok);
|
593
|
+
return Statement::Default();
|
594
|
+
}
|
595
|
+
|
596
|
+
|
597
|
+
PreParser::Statement PreParser::ParseThrowStatement(bool* ok) {
|
598
|
+
// ThrowStatement ::
|
599
|
+
// 'throw' [no line terminator] Expression ';'
|
600
|
+
|
601
|
+
Expect(i::Token::THROW, CHECK_OK);
|
602
|
+
if (scanner_->has_line_terminator_before_next()) {
|
603
|
+
i::JavaScriptScanner::Location pos = scanner_->location();
|
604
|
+
ReportMessageAt(pos.beg_pos, pos.end_pos,
|
605
|
+
"newline_after_throw", NULL);
|
606
|
+
*ok = false;
|
607
|
+
return Statement::Default();
|
608
|
+
}
|
609
|
+
ParseExpression(true, CHECK_OK);
|
610
|
+
ExpectSemicolon(ok);
|
611
|
+
return Statement::Default();
|
612
|
+
}
|
613
|
+
|
614
|
+
|
615
|
+
PreParser::Statement PreParser::ParseTryStatement(bool* ok) {
|
616
|
+
// TryStatement ::
|
617
|
+
// 'try' Block Catch
|
618
|
+
// 'try' Block Finally
|
619
|
+
// 'try' Block Catch Finally
|
620
|
+
//
|
621
|
+
// Catch ::
|
622
|
+
// 'catch' '(' Identifier ')' Block
|
623
|
+
//
|
624
|
+
// Finally ::
|
625
|
+
// 'finally' Block
|
626
|
+
|
627
|
+
// In preparsing, allow any number of catch/finally blocks, including zero
|
628
|
+
// of both.
|
629
|
+
|
630
|
+
Expect(i::Token::TRY, CHECK_OK);
|
631
|
+
|
632
|
+
ParseBlock(CHECK_OK);
|
633
|
+
|
634
|
+
bool catch_or_finally_seen = false;
|
635
|
+
if (peek() == i::Token::CATCH) {
|
636
|
+
Consume(i::Token::CATCH);
|
637
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
638
|
+
Identifier id = ParseIdentifier(CHECK_OK);
|
639
|
+
if (strict_mode() && !id.IsValidStrictVariable()) {
|
640
|
+
StrictModeIdentifierViolation(scanner_->location(),
|
641
|
+
"strict_catch_variable",
|
642
|
+
id,
|
643
|
+
ok);
|
644
|
+
return Statement::Default();
|
645
|
+
}
|
646
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
647
|
+
scope_->EnterWith();
|
648
|
+
ParseBlock(ok);
|
649
|
+
scope_->LeaveWith();
|
650
|
+
if (!*ok) Statement::Default();
|
651
|
+
catch_or_finally_seen = true;
|
652
|
+
}
|
653
|
+
if (peek() == i::Token::FINALLY) {
|
654
|
+
Consume(i::Token::FINALLY);
|
655
|
+
ParseBlock(CHECK_OK);
|
656
|
+
catch_or_finally_seen = true;
|
657
|
+
}
|
658
|
+
if (!catch_or_finally_seen) {
|
659
|
+
*ok = false;
|
660
|
+
}
|
661
|
+
return Statement::Default();
|
662
|
+
}
|
663
|
+
|
664
|
+
|
665
|
+
PreParser::Statement PreParser::ParseDebuggerStatement(bool* ok) {
|
666
|
+
// In ECMA-262 'debugger' is defined as a reserved keyword. In some browser
|
667
|
+
// contexts this is used as a statement which invokes the debugger as if a
|
668
|
+
// break point is present.
|
669
|
+
// DebuggerStatement ::
|
670
|
+
// 'debugger' ';'
|
671
|
+
|
672
|
+
Expect(i::Token::DEBUGGER, CHECK_OK);
|
673
|
+
ExpectSemicolon(ok);
|
674
|
+
return Statement::Default();
|
675
|
+
}
|
676
|
+
|
677
|
+
|
678
|
+
#undef CHECK_OK
|
679
|
+
#define CHECK_OK ok); \
|
680
|
+
if (!*ok) return Expression::Default(); \
|
681
|
+
((void)0
|
682
|
+
#define DUMMY ) // to make indentation work
|
683
|
+
#undef DUMMY
|
684
|
+
|
685
|
+
|
686
|
+
// Precedence = 1
|
687
|
+
PreParser::Expression PreParser::ParseExpression(bool accept_IN, bool* ok) {
|
688
|
+
// Expression ::
|
689
|
+
// AssignmentExpression
|
690
|
+
// Expression ',' AssignmentExpression
|
691
|
+
|
692
|
+
Expression result = ParseAssignmentExpression(accept_IN, CHECK_OK);
|
693
|
+
while (peek() == i::Token::COMMA) {
|
694
|
+
Expect(i::Token::COMMA, CHECK_OK);
|
695
|
+
ParseAssignmentExpression(accept_IN, CHECK_OK);
|
696
|
+
result = Expression::Default();
|
697
|
+
}
|
698
|
+
return result;
|
699
|
+
}
|
700
|
+
|
701
|
+
|
702
|
+
// Precedence = 2
|
703
|
+
PreParser::Expression PreParser::ParseAssignmentExpression(bool accept_IN,
|
704
|
+
bool* ok) {
|
705
|
+
// AssignmentExpression ::
|
706
|
+
// ConditionalExpression
|
707
|
+
// LeftHandSideExpression AssignmentOperator AssignmentExpression
|
708
|
+
|
709
|
+
i::Scanner::Location before = scanner_->peek_location();
|
710
|
+
Expression expression = ParseConditionalExpression(accept_IN, CHECK_OK);
|
711
|
+
|
712
|
+
if (!i::Token::IsAssignmentOp(peek())) {
|
713
|
+
// Parsed conditional expression only (no assignment).
|
714
|
+
return expression;
|
715
|
+
}
|
716
|
+
|
717
|
+
if (strict_mode() && expression.IsIdentifier() &&
|
718
|
+
expression.AsIdentifier().IsEvalOrArguments()) {
|
719
|
+
i::Scanner::Location after = scanner_->location();
|
720
|
+
ReportMessageAt(before.beg_pos, after.end_pos,
|
721
|
+
"strict_lhs_assignment", NULL);
|
722
|
+
*ok = false;
|
723
|
+
return Expression::Default();
|
724
|
+
}
|
725
|
+
|
726
|
+
i::Token::Value op = Next(); // Get assignment operator.
|
727
|
+
ParseAssignmentExpression(accept_IN, CHECK_OK);
|
728
|
+
|
729
|
+
if ((op == i::Token::ASSIGN) && expression.IsThisProperty()) {
|
730
|
+
scope_->AddProperty();
|
731
|
+
}
|
732
|
+
|
733
|
+
return Expression::Default();
|
734
|
+
}
|
735
|
+
|
736
|
+
|
737
|
+
// Precedence = 3
|
738
|
+
PreParser::Expression PreParser::ParseConditionalExpression(bool accept_IN,
|
739
|
+
bool* ok) {
|
740
|
+
// ConditionalExpression ::
|
741
|
+
// LogicalOrExpression
|
742
|
+
// LogicalOrExpression '?' AssignmentExpression ':' AssignmentExpression
|
743
|
+
|
744
|
+
// We start using the binary expression parser for prec >= 4 only!
|
745
|
+
Expression expression = ParseBinaryExpression(4, accept_IN, CHECK_OK);
|
746
|
+
if (peek() != i::Token::CONDITIONAL) return expression;
|
747
|
+
Consume(i::Token::CONDITIONAL);
|
748
|
+
// In parsing the first assignment expression in conditional
|
749
|
+
// expressions we always accept the 'in' keyword; see ECMA-262,
|
750
|
+
// section 11.12, page 58.
|
751
|
+
ParseAssignmentExpression(true, CHECK_OK);
|
752
|
+
Expect(i::Token::COLON, CHECK_OK);
|
753
|
+
ParseAssignmentExpression(accept_IN, CHECK_OK);
|
754
|
+
return Expression::Default();
|
755
|
+
}
|
756
|
+
|
757
|
+
|
758
|
+
int PreParser::Precedence(i::Token::Value tok, bool accept_IN) {
|
759
|
+
if (tok == i::Token::IN && !accept_IN)
|
760
|
+
return 0; // 0 precedence will terminate binary expression parsing
|
761
|
+
|
762
|
+
return i::Token::Precedence(tok);
|
763
|
+
}
|
764
|
+
|
765
|
+
|
766
|
+
// Precedence >= 4
|
767
|
+
PreParser::Expression PreParser::ParseBinaryExpression(int prec,
|
768
|
+
bool accept_IN,
|
769
|
+
bool* ok) {
|
770
|
+
Expression result = ParseUnaryExpression(CHECK_OK);
|
771
|
+
for (int prec1 = Precedence(peek(), accept_IN); prec1 >= prec; prec1--) {
|
772
|
+
// prec1 >= 4
|
773
|
+
while (Precedence(peek(), accept_IN) == prec1) {
|
774
|
+
Next();
|
775
|
+
ParseBinaryExpression(prec1 + 1, accept_IN, CHECK_OK);
|
776
|
+
result = Expression::Default();
|
777
|
+
}
|
778
|
+
}
|
779
|
+
return result;
|
780
|
+
}
|
781
|
+
|
782
|
+
|
783
|
+
PreParser::Expression PreParser::ParseUnaryExpression(bool* ok) {
|
784
|
+
// UnaryExpression ::
|
785
|
+
// PostfixExpression
|
786
|
+
// 'delete' UnaryExpression
|
787
|
+
// 'void' UnaryExpression
|
788
|
+
// 'typeof' UnaryExpression
|
789
|
+
// '++' UnaryExpression
|
790
|
+
// '--' UnaryExpression
|
791
|
+
// '+' UnaryExpression
|
792
|
+
// '-' UnaryExpression
|
793
|
+
// '~' UnaryExpression
|
794
|
+
// '!' UnaryExpression
|
795
|
+
|
796
|
+
i::Token::Value op = peek();
|
797
|
+
if (i::Token::IsUnaryOp(op)) {
|
798
|
+
op = Next();
|
799
|
+
ParseUnaryExpression(ok);
|
800
|
+
return Expression::Default();
|
801
|
+
} else if (i::Token::IsCountOp(op)) {
|
802
|
+
op = Next();
|
803
|
+
i::Scanner::Location before = scanner_->peek_location();
|
804
|
+
Expression expression = ParseUnaryExpression(CHECK_OK);
|
805
|
+
if (strict_mode() && expression.IsIdentifier() &&
|
806
|
+
expression.AsIdentifier().IsEvalOrArguments()) {
|
807
|
+
i::Scanner::Location after = scanner_->location();
|
808
|
+
ReportMessageAt(before.beg_pos, after.end_pos,
|
809
|
+
"strict_lhs_prefix", NULL);
|
810
|
+
*ok = false;
|
811
|
+
}
|
812
|
+
return Expression::Default();
|
813
|
+
} else {
|
814
|
+
return ParsePostfixExpression(ok);
|
815
|
+
}
|
816
|
+
}
|
817
|
+
|
818
|
+
|
819
|
+
PreParser::Expression PreParser::ParsePostfixExpression(bool* ok) {
|
820
|
+
// PostfixExpression ::
|
821
|
+
// LeftHandSideExpression ('++' | '--')?
|
822
|
+
|
823
|
+
i::Scanner::Location before = scanner_->peek_location();
|
824
|
+
Expression expression = ParseLeftHandSideExpression(CHECK_OK);
|
825
|
+
if (!scanner_->has_line_terminator_before_next() &&
|
826
|
+
i::Token::IsCountOp(peek())) {
|
827
|
+
if (strict_mode() && expression.IsIdentifier() &&
|
828
|
+
expression.AsIdentifier().IsEvalOrArguments()) {
|
829
|
+
i::Scanner::Location after = scanner_->location();
|
830
|
+
ReportMessageAt(before.beg_pos, after.end_pos,
|
831
|
+
"strict_lhs_postfix", NULL);
|
832
|
+
*ok = false;
|
833
|
+
return Expression::Default();
|
834
|
+
}
|
835
|
+
Next();
|
836
|
+
return Expression::Default();
|
837
|
+
}
|
838
|
+
return expression;
|
839
|
+
}
|
840
|
+
|
841
|
+
|
842
|
+
PreParser::Expression PreParser::ParseLeftHandSideExpression(bool* ok) {
|
843
|
+
// LeftHandSideExpression ::
|
844
|
+
// (NewExpression | MemberExpression) ...
|
845
|
+
|
846
|
+
Expression result = Expression::Default();
|
847
|
+
if (peek() == i::Token::NEW) {
|
848
|
+
result = ParseNewExpression(CHECK_OK);
|
849
|
+
} else {
|
850
|
+
result = ParseMemberExpression(CHECK_OK);
|
851
|
+
}
|
852
|
+
|
853
|
+
while (true) {
|
854
|
+
switch (peek()) {
|
855
|
+
case i::Token::LBRACK: {
|
856
|
+
Consume(i::Token::LBRACK);
|
857
|
+
ParseExpression(true, CHECK_OK);
|
858
|
+
Expect(i::Token::RBRACK, CHECK_OK);
|
859
|
+
if (result.IsThis()) {
|
860
|
+
result = Expression::ThisProperty();
|
861
|
+
} else {
|
862
|
+
result = Expression::Default();
|
863
|
+
}
|
864
|
+
break;
|
865
|
+
}
|
866
|
+
|
867
|
+
case i::Token::LPAREN: {
|
868
|
+
ParseArguments(CHECK_OK);
|
869
|
+
result = Expression::Default();
|
870
|
+
break;
|
871
|
+
}
|
872
|
+
|
873
|
+
case i::Token::PERIOD: {
|
874
|
+
Consume(i::Token::PERIOD);
|
875
|
+
ParseIdentifierName(CHECK_OK);
|
876
|
+
if (result.IsThis()) {
|
877
|
+
result = Expression::ThisProperty();
|
878
|
+
} else {
|
879
|
+
result = Expression::Default();
|
880
|
+
}
|
881
|
+
break;
|
882
|
+
}
|
883
|
+
|
884
|
+
default:
|
885
|
+
return result;
|
886
|
+
}
|
887
|
+
}
|
888
|
+
}
|
889
|
+
|
890
|
+
|
891
|
+
PreParser::Expression PreParser::ParseNewExpression(bool* ok) {
|
892
|
+
// NewExpression ::
|
893
|
+
// ('new')+ MemberExpression
|
894
|
+
|
895
|
+
// The grammar for new expressions is pretty warped. The keyword
|
896
|
+
// 'new' can either be a part of the new expression (where it isn't
|
897
|
+
// followed by an argument list) or a part of the member expression,
|
898
|
+
// where it must be followed by an argument list. To accommodate
|
899
|
+
// this, we parse the 'new' keywords greedily and keep track of how
|
900
|
+
// many we have parsed. This information is then passed on to the
|
901
|
+
// member expression parser, which is only allowed to match argument
|
902
|
+
// lists as long as it has 'new' prefixes left
|
903
|
+
unsigned new_count = 0;
|
904
|
+
do {
|
905
|
+
Consume(i::Token::NEW);
|
906
|
+
new_count++;
|
907
|
+
} while (peek() == i::Token::NEW);
|
908
|
+
|
909
|
+
return ParseMemberWithNewPrefixesExpression(new_count, ok);
|
910
|
+
}
|
911
|
+
|
912
|
+
|
913
|
+
PreParser::Expression PreParser::ParseMemberExpression(bool* ok) {
|
914
|
+
return ParseMemberWithNewPrefixesExpression(0, ok);
|
915
|
+
}
|
916
|
+
|
917
|
+
|
918
|
+
PreParser::Expression PreParser::ParseMemberWithNewPrefixesExpression(
|
919
|
+
unsigned new_count, bool* ok) {
|
920
|
+
// MemberExpression ::
|
921
|
+
// (PrimaryExpression | FunctionLiteral)
|
922
|
+
// ('[' Expression ']' | '.' Identifier | Arguments)*
|
923
|
+
|
924
|
+
// Parse the initial primary or function expression.
|
925
|
+
Expression result = Expression::Default();
|
926
|
+
if (peek() == i::Token::FUNCTION) {
|
927
|
+
Consume(i::Token::FUNCTION);
|
928
|
+
Identifier identifier = Identifier::Default();
|
929
|
+
if (peek_any_identifier()) {
|
930
|
+
identifier = ParseIdentifier(CHECK_OK);
|
931
|
+
}
|
932
|
+
result = ParseFunctionLiteral(CHECK_OK);
|
933
|
+
if (result.IsStrictFunction() && !identifier.IsValidStrictVariable()) {
|
934
|
+
StrictModeIdentifierViolation(scanner_->location(),
|
935
|
+
"strict_function_name",
|
936
|
+
identifier,
|
937
|
+
ok);
|
938
|
+
return Expression::Default();
|
939
|
+
}
|
940
|
+
} else {
|
941
|
+
result = ParsePrimaryExpression(CHECK_OK);
|
942
|
+
}
|
943
|
+
|
944
|
+
while (true) {
|
945
|
+
switch (peek()) {
|
946
|
+
case i::Token::LBRACK: {
|
947
|
+
Consume(i::Token::LBRACK);
|
948
|
+
ParseExpression(true, CHECK_OK);
|
949
|
+
Expect(i::Token::RBRACK, CHECK_OK);
|
950
|
+
if (result.IsThis()) {
|
951
|
+
result = Expression::ThisProperty();
|
952
|
+
} else {
|
953
|
+
result = Expression::Default();
|
954
|
+
}
|
955
|
+
break;
|
956
|
+
}
|
957
|
+
case i::Token::PERIOD: {
|
958
|
+
Consume(i::Token::PERIOD);
|
959
|
+
ParseIdentifierName(CHECK_OK);
|
960
|
+
if (result.IsThis()) {
|
961
|
+
result = Expression::ThisProperty();
|
962
|
+
} else {
|
963
|
+
result = Expression::Default();
|
964
|
+
}
|
965
|
+
break;
|
966
|
+
}
|
967
|
+
case i::Token::LPAREN: {
|
968
|
+
if (new_count == 0) return result;
|
969
|
+
// Consume one of the new prefixes (already parsed).
|
970
|
+
ParseArguments(CHECK_OK);
|
971
|
+
new_count--;
|
972
|
+
result = Expression::Default();
|
973
|
+
break;
|
974
|
+
}
|
975
|
+
default:
|
976
|
+
return result;
|
977
|
+
}
|
978
|
+
}
|
979
|
+
}
|
980
|
+
|
981
|
+
|
982
|
+
PreParser::Expression PreParser::ParsePrimaryExpression(bool* ok) {
|
983
|
+
// PrimaryExpression ::
|
984
|
+
// 'this'
|
985
|
+
// 'null'
|
986
|
+
// 'true'
|
987
|
+
// 'false'
|
988
|
+
// Identifier
|
989
|
+
// Number
|
990
|
+
// String
|
991
|
+
// ArrayLiteral
|
992
|
+
// ObjectLiteral
|
993
|
+
// RegExpLiteral
|
994
|
+
// '(' Expression ')'
|
995
|
+
|
996
|
+
Expression result = Expression::Default();
|
997
|
+
switch (peek()) {
|
998
|
+
case i::Token::THIS: {
|
999
|
+
Next();
|
1000
|
+
result = Expression::This();
|
1001
|
+
break;
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
case i::Token::FUTURE_RESERVED_WORD:
|
1005
|
+
if (strict_mode()) {
|
1006
|
+
Next();
|
1007
|
+
i::Scanner::Location location = scanner_->location();
|
1008
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
1009
|
+
"strict_reserved_word", NULL);
|
1010
|
+
*ok = false;
|
1011
|
+
return Expression::Default();
|
1012
|
+
}
|
1013
|
+
// FALLTHROUGH
|
1014
|
+
case i::Token::IDENTIFIER: {
|
1015
|
+
Identifier id = ParseIdentifier(CHECK_OK);
|
1016
|
+
result = Expression::FromIdentifier(id);
|
1017
|
+
break;
|
1018
|
+
}
|
1019
|
+
|
1020
|
+
case i::Token::NULL_LITERAL:
|
1021
|
+
case i::Token::TRUE_LITERAL:
|
1022
|
+
case i::Token::FALSE_LITERAL:
|
1023
|
+
case i::Token::NUMBER: {
|
1024
|
+
Next();
|
1025
|
+
break;
|
1026
|
+
}
|
1027
|
+
case i::Token::STRING: {
|
1028
|
+
Next();
|
1029
|
+
result = GetStringSymbol();
|
1030
|
+
break;
|
1031
|
+
}
|
1032
|
+
|
1033
|
+
case i::Token::ASSIGN_DIV:
|
1034
|
+
result = ParseRegExpLiteral(true, CHECK_OK);
|
1035
|
+
break;
|
1036
|
+
|
1037
|
+
case i::Token::DIV:
|
1038
|
+
result = ParseRegExpLiteral(false, CHECK_OK);
|
1039
|
+
break;
|
1040
|
+
|
1041
|
+
case i::Token::LBRACK:
|
1042
|
+
result = ParseArrayLiteral(CHECK_OK);
|
1043
|
+
break;
|
1044
|
+
|
1045
|
+
case i::Token::LBRACE:
|
1046
|
+
result = ParseObjectLiteral(CHECK_OK);
|
1047
|
+
break;
|
1048
|
+
|
1049
|
+
case i::Token::LPAREN:
|
1050
|
+
Consume(i::Token::LPAREN);
|
1051
|
+
parenthesized_function_ = (peek() == i::Token::FUNCTION);
|
1052
|
+
result = ParseExpression(true, CHECK_OK);
|
1053
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
1054
|
+
result = result.Parenthesize();
|
1055
|
+
break;
|
1056
|
+
|
1057
|
+
case i::Token::MOD:
|
1058
|
+
result = ParseV8Intrinsic(CHECK_OK);
|
1059
|
+
break;
|
1060
|
+
|
1061
|
+
default: {
|
1062
|
+
Next();
|
1063
|
+
*ok = false;
|
1064
|
+
return Expression::Default();
|
1065
|
+
}
|
1066
|
+
}
|
1067
|
+
|
1068
|
+
return result;
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
|
1072
|
+
PreParser::Expression PreParser::ParseArrayLiteral(bool* ok) {
|
1073
|
+
// ArrayLiteral ::
|
1074
|
+
// '[' Expression? (',' Expression?)* ']'
|
1075
|
+
Expect(i::Token::LBRACK, CHECK_OK);
|
1076
|
+
while (peek() != i::Token::RBRACK) {
|
1077
|
+
if (peek() != i::Token::COMMA) {
|
1078
|
+
ParseAssignmentExpression(true, CHECK_OK);
|
1079
|
+
}
|
1080
|
+
if (peek() != i::Token::RBRACK) {
|
1081
|
+
Expect(i::Token::COMMA, CHECK_OK);
|
1082
|
+
}
|
1083
|
+
}
|
1084
|
+
Expect(i::Token::RBRACK, CHECK_OK);
|
1085
|
+
|
1086
|
+
scope_->NextMaterializedLiteralIndex();
|
1087
|
+
return Expression::Default();
|
1088
|
+
}
|
1089
|
+
|
1090
|
+
|
1091
|
+
PreParser::Expression PreParser::ParseObjectLiteral(bool* ok) {
|
1092
|
+
// ObjectLiteral ::
|
1093
|
+
// '{' (
|
1094
|
+
// ((IdentifierName | String | Number) ':' AssignmentExpression)
|
1095
|
+
// | (('get' | 'set') (IdentifierName | String | Number) FunctionLiteral)
|
1096
|
+
// )*[','] '}'
|
1097
|
+
|
1098
|
+
Expect(i::Token::LBRACE, CHECK_OK);
|
1099
|
+
while (peek() != i::Token::RBRACE) {
|
1100
|
+
i::Token::Value next = peek();
|
1101
|
+
switch (next) {
|
1102
|
+
case i::Token::IDENTIFIER:
|
1103
|
+
case i::Token::FUTURE_RESERVED_WORD: {
|
1104
|
+
bool is_getter = false;
|
1105
|
+
bool is_setter = false;
|
1106
|
+
ParseIdentifierOrGetOrSet(&is_getter, &is_setter, CHECK_OK);
|
1107
|
+
if ((is_getter || is_setter) && peek() != i::Token::COLON) {
|
1108
|
+
i::Token::Value name = Next();
|
1109
|
+
bool is_keyword = i::Token::IsKeyword(name);
|
1110
|
+
if (name != i::Token::IDENTIFIER &&
|
1111
|
+
name != i::Token::FUTURE_RESERVED_WORD &&
|
1112
|
+
name != i::Token::NUMBER &&
|
1113
|
+
name != i::Token::STRING &&
|
1114
|
+
!is_keyword) {
|
1115
|
+
*ok = false;
|
1116
|
+
return Expression::Default();
|
1117
|
+
}
|
1118
|
+
if (!is_keyword) {
|
1119
|
+
LogSymbol();
|
1120
|
+
}
|
1121
|
+
ParseFunctionLiteral(CHECK_OK);
|
1122
|
+
if (peek() != i::Token::RBRACE) {
|
1123
|
+
Expect(i::Token::COMMA, CHECK_OK);
|
1124
|
+
}
|
1125
|
+
continue; // restart the while
|
1126
|
+
}
|
1127
|
+
break;
|
1128
|
+
}
|
1129
|
+
case i::Token::STRING:
|
1130
|
+
Consume(next);
|
1131
|
+
GetStringSymbol();
|
1132
|
+
break;
|
1133
|
+
case i::Token::NUMBER:
|
1134
|
+
Consume(next);
|
1135
|
+
break;
|
1136
|
+
default:
|
1137
|
+
if (i::Token::IsKeyword(next)) {
|
1138
|
+
Consume(next);
|
1139
|
+
} else {
|
1140
|
+
// Unexpected token.
|
1141
|
+
*ok = false;
|
1142
|
+
return Expression::Default();
|
1143
|
+
}
|
1144
|
+
}
|
1145
|
+
|
1146
|
+
Expect(i::Token::COLON, CHECK_OK);
|
1147
|
+
ParseAssignmentExpression(true, CHECK_OK);
|
1148
|
+
|
1149
|
+
// TODO(1240767): Consider allowing trailing comma.
|
1150
|
+
if (peek() != i::Token::RBRACE) Expect(i::Token::COMMA, CHECK_OK);
|
1151
|
+
}
|
1152
|
+
Expect(i::Token::RBRACE, CHECK_OK);
|
1153
|
+
|
1154
|
+
scope_->NextMaterializedLiteralIndex();
|
1155
|
+
return Expression::Default();
|
1156
|
+
}
|
1157
|
+
|
1158
|
+
|
1159
|
+
PreParser::Expression PreParser::ParseRegExpLiteral(bool seen_equal,
|
1160
|
+
bool* ok) {
|
1161
|
+
if (!scanner_->ScanRegExpPattern(seen_equal)) {
|
1162
|
+
Next();
|
1163
|
+
i::JavaScriptScanner::Location location = scanner_->location();
|
1164
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
1165
|
+
"unterminated_regexp", NULL);
|
1166
|
+
*ok = false;
|
1167
|
+
return Expression::Default();
|
1168
|
+
}
|
1169
|
+
|
1170
|
+
scope_->NextMaterializedLiteralIndex();
|
1171
|
+
|
1172
|
+
if (!scanner_->ScanRegExpFlags()) {
|
1173
|
+
Next();
|
1174
|
+
i::JavaScriptScanner::Location location = scanner_->location();
|
1175
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
1176
|
+
"invalid_regexp_flags", NULL);
|
1177
|
+
*ok = false;
|
1178
|
+
return Expression::Default();
|
1179
|
+
}
|
1180
|
+
Next();
|
1181
|
+
return Expression::Default();
|
1182
|
+
}
|
1183
|
+
|
1184
|
+
|
1185
|
+
PreParser::Arguments PreParser::ParseArguments(bool* ok) {
|
1186
|
+
// Arguments ::
|
1187
|
+
// '(' (AssignmentExpression)*[','] ')'
|
1188
|
+
|
1189
|
+
Expect(i::Token::LPAREN, ok);
|
1190
|
+
if (!*ok) return -1;
|
1191
|
+
bool done = (peek() == i::Token::RPAREN);
|
1192
|
+
int argc = 0;
|
1193
|
+
while (!done) {
|
1194
|
+
ParseAssignmentExpression(true, ok);
|
1195
|
+
if (!*ok) return -1;
|
1196
|
+
argc++;
|
1197
|
+
done = (peek() == i::Token::RPAREN);
|
1198
|
+
if (!done) {
|
1199
|
+
Expect(i::Token::COMMA, ok);
|
1200
|
+
if (!*ok) return -1;
|
1201
|
+
}
|
1202
|
+
}
|
1203
|
+
Expect(i::Token::RPAREN, ok);
|
1204
|
+
return argc;
|
1205
|
+
}
|
1206
|
+
|
1207
|
+
|
1208
|
+
PreParser::Expression PreParser::ParseFunctionLiteral(bool* ok) {
|
1209
|
+
// Function ::
|
1210
|
+
// '(' FormalParameterList? ')' '{' FunctionBody '}'
|
1211
|
+
|
1212
|
+
// Parse function body.
|
1213
|
+
ScopeType outer_scope_type = scope_->type();
|
1214
|
+
bool inside_with = scope_->IsInsideWith();
|
1215
|
+
Scope function_scope(&scope_, kFunctionScope);
|
1216
|
+
// FormalParameterList ::
|
1217
|
+
// '(' (Identifier)*[','] ')'
|
1218
|
+
Expect(i::Token::LPAREN, CHECK_OK);
|
1219
|
+
int start_position = scanner_->location().beg_pos;
|
1220
|
+
bool done = (peek() == i::Token::RPAREN);
|
1221
|
+
while (!done) {
|
1222
|
+
Identifier id = ParseIdentifier(CHECK_OK);
|
1223
|
+
if (!id.IsValidStrictVariable()) {
|
1224
|
+
StrictModeIdentifierViolation(scanner_->location(),
|
1225
|
+
"strict_param_name",
|
1226
|
+
id,
|
1227
|
+
CHECK_OK);
|
1228
|
+
}
|
1229
|
+
done = (peek() == i::Token::RPAREN);
|
1230
|
+
if (!done) {
|
1231
|
+
Expect(i::Token::COMMA, CHECK_OK);
|
1232
|
+
}
|
1233
|
+
}
|
1234
|
+
Expect(i::Token::RPAREN, CHECK_OK);
|
1235
|
+
|
1236
|
+
Expect(i::Token::LBRACE, CHECK_OK);
|
1237
|
+
int function_block_pos = scanner_->location().beg_pos;
|
1238
|
+
|
1239
|
+
// Determine if the function will be lazily compiled.
|
1240
|
+
// Currently only happens to top-level functions.
|
1241
|
+
// Optimistically assume that all top-level functions are lazily compiled.
|
1242
|
+
bool is_lazily_compiled = (outer_scope_type == kTopLevelScope &&
|
1243
|
+
!inside_with && allow_lazy_ &&
|
1244
|
+
!parenthesized_function_);
|
1245
|
+
parenthesized_function_ = false;
|
1246
|
+
|
1247
|
+
if (is_lazily_compiled) {
|
1248
|
+
log_->PauseRecording();
|
1249
|
+
ParseSourceElements(i::Token::RBRACE, ok);
|
1250
|
+
log_->ResumeRecording();
|
1251
|
+
if (!*ok) Expression::Default();
|
1252
|
+
|
1253
|
+
Expect(i::Token::RBRACE, CHECK_OK);
|
1254
|
+
|
1255
|
+
// Position right after terminal '}'.
|
1256
|
+
int end_pos = scanner_->location().end_pos;
|
1257
|
+
log_->LogFunction(function_block_pos, end_pos,
|
1258
|
+
function_scope.materialized_literal_count(),
|
1259
|
+
function_scope.expected_properties());
|
1260
|
+
} else {
|
1261
|
+
ParseSourceElements(i::Token::RBRACE, CHECK_OK);
|
1262
|
+
Expect(i::Token::RBRACE, CHECK_OK);
|
1263
|
+
}
|
1264
|
+
|
1265
|
+
if (strict_mode()) {
|
1266
|
+
int end_position = scanner_->location().end_pos;
|
1267
|
+
CheckOctalLiteral(start_position, end_position, CHECK_OK);
|
1268
|
+
CheckDelayedStrictModeViolation(start_position, end_position, CHECK_OK);
|
1269
|
+
return Expression::StrictFunction();
|
1270
|
+
}
|
1271
|
+
|
1272
|
+
return Expression::Default();
|
1273
|
+
}
|
1274
|
+
|
1275
|
+
|
1276
|
+
PreParser::Expression PreParser::ParseV8Intrinsic(bool* ok) {
|
1277
|
+
// CallRuntime ::
|
1278
|
+
// '%' Identifier Arguments
|
1279
|
+
|
1280
|
+
Expect(i::Token::MOD, CHECK_OK);
|
1281
|
+
ParseIdentifier(CHECK_OK);
|
1282
|
+
ParseArguments(ok);
|
1283
|
+
|
1284
|
+
return Expression::Default();
|
1285
|
+
}
|
1286
|
+
|
1287
|
+
#undef CHECK_OK
|
1288
|
+
|
1289
|
+
|
1290
|
+
void PreParser::ExpectSemicolon(bool* ok) {
|
1291
|
+
// Check for automatic semicolon insertion according to
|
1292
|
+
// the rules given in ECMA-262, section 7.9, page 21.
|
1293
|
+
i::Token::Value tok = peek();
|
1294
|
+
if (tok == i::Token::SEMICOLON) {
|
1295
|
+
Next();
|
1296
|
+
return;
|
1297
|
+
}
|
1298
|
+
if (scanner_->has_line_terminator_before_next() ||
|
1299
|
+
tok == i::Token::RBRACE ||
|
1300
|
+
tok == i::Token::EOS) {
|
1301
|
+
return;
|
1302
|
+
}
|
1303
|
+
Expect(i::Token::SEMICOLON, ok);
|
1304
|
+
}
|
1305
|
+
|
1306
|
+
|
1307
|
+
void PreParser::LogSymbol() {
|
1308
|
+
int identifier_pos = scanner_->location().beg_pos;
|
1309
|
+
if (scanner_->is_literal_ascii()) {
|
1310
|
+
log_->LogAsciiSymbol(identifier_pos, scanner_->literal_ascii_string());
|
1311
|
+
} else {
|
1312
|
+
log_->LogUC16Symbol(identifier_pos, scanner_->literal_uc16_string());
|
1313
|
+
}
|
1314
|
+
}
|
1315
|
+
|
1316
|
+
|
1317
|
+
PreParser::Expression PreParser::GetStringSymbol() {
|
1318
|
+
const int kUseStrictLength = 10;
|
1319
|
+
const char* kUseStrictChars = "use strict";
|
1320
|
+
LogSymbol();
|
1321
|
+
if (scanner_->is_literal_ascii() &&
|
1322
|
+
scanner_->literal_length() == kUseStrictLength &&
|
1323
|
+
!scanner_->literal_contains_escapes() &&
|
1324
|
+
!strncmp(scanner_->literal_ascii_string().start(), kUseStrictChars,
|
1325
|
+
kUseStrictLength)) {
|
1326
|
+
return Expression::UseStrictStringLiteral();
|
1327
|
+
}
|
1328
|
+
return Expression::StringLiteral();
|
1329
|
+
}
|
1330
|
+
|
1331
|
+
|
1332
|
+
PreParser::Identifier PreParser::GetIdentifierSymbol() {
|
1333
|
+
LogSymbol();
|
1334
|
+
if (scanner_->current_token() == i::Token::FUTURE_RESERVED_WORD) {
|
1335
|
+
return Identifier::FutureReserved();
|
1336
|
+
}
|
1337
|
+
if (scanner_->is_literal_ascii()) {
|
1338
|
+
// Detect strict-mode poison words.
|
1339
|
+
if (scanner_->literal_length() == 4 &&
|
1340
|
+
!strncmp(scanner_->literal_ascii_string().start(), "eval", 4)) {
|
1341
|
+
return Identifier::Eval();
|
1342
|
+
}
|
1343
|
+
if (scanner_->literal_length() == 9 &&
|
1344
|
+
!strncmp(scanner_->literal_ascii_string().start(), "arguments", 9)) {
|
1345
|
+
return Identifier::Arguments();
|
1346
|
+
}
|
1347
|
+
}
|
1348
|
+
return Identifier::Default();
|
1349
|
+
}
|
1350
|
+
|
1351
|
+
|
1352
|
+
PreParser::Identifier PreParser::ParseIdentifier(bool* ok) {
|
1353
|
+
if (!Check(i::Token::FUTURE_RESERVED_WORD)) {
|
1354
|
+
Expect(i::Token::IDENTIFIER, ok);
|
1355
|
+
if (!*ok) return Identifier::Default();
|
1356
|
+
}
|
1357
|
+
return GetIdentifierSymbol();
|
1358
|
+
}
|
1359
|
+
|
1360
|
+
|
1361
|
+
void PreParser::SetStrictModeViolation(i::Scanner::Location location,
|
1362
|
+
const char* type,
|
1363
|
+
bool* ok) {
|
1364
|
+
if (strict_mode()) {
|
1365
|
+
ReportMessageAt(location.beg_pos, location.end_pos, type, NULL);
|
1366
|
+
*ok = false;
|
1367
|
+
return;
|
1368
|
+
}
|
1369
|
+
// Delay report in case this later turns out to be strict code
|
1370
|
+
// (i.e., for function names and parameters prior to a "use strict"
|
1371
|
+
// directive).
|
1372
|
+
strict_mode_violation_location_ = location;
|
1373
|
+
strict_mode_violation_type_ = type;
|
1374
|
+
}
|
1375
|
+
|
1376
|
+
|
1377
|
+
void PreParser::CheckDelayedStrictModeViolation(int beg_pos,
|
1378
|
+
int end_pos,
|
1379
|
+
bool* ok) {
|
1380
|
+
i::Scanner::Location location = strict_mode_violation_location_;
|
1381
|
+
if (location.IsValid() &&
|
1382
|
+
location.beg_pos > beg_pos && location.end_pos < end_pos) {
|
1383
|
+
ReportMessageAt(location.beg_pos, location.end_pos,
|
1384
|
+
strict_mode_violation_type_, NULL);
|
1385
|
+
*ok = false;
|
1386
|
+
}
|
1387
|
+
strict_mode_violation_location_ = i::Scanner::Location::invalid();
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
|
1391
|
+
void PreParser::StrictModeIdentifierViolation(i::Scanner::Location location,
|
1392
|
+
const char* eval_args_type,
|
1393
|
+
Identifier identifier,
|
1394
|
+
bool* ok) {
|
1395
|
+
const char* type = eval_args_type;
|
1396
|
+
if (identifier.IsFutureReserved()) {
|
1397
|
+
type = "strict_reserved_word";
|
1398
|
+
}
|
1399
|
+
if (strict_mode()) {
|
1400
|
+
ReportMessageAt(location.beg_pos, location.end_pos, type, NULL);
|
1401
|
+
*ok = false;
|
1402
|
+
return;
|
1403
|
+
}
|
1404
|
+
strict_mode_violation_location_ = location;
|
1405
|
+
strict_mode_violation_type_ = type;
|
1406
|
+
}
|
1407
|
+
|
1408
|
+
|
1409
|
+
PreParser::Identifier PreParser::ParseIdentifierName(bool* ok) {
|
1410
|
+
i::Token::Value next = Next();
|
1411
|
+
if (i::Token::IsKeyword(next)) {
|
1412
|
+
int pos = scanner_->location().beg_pos;
|
1413
|
+
const char* keyword = i::Token::String(next);
|
1414
|
+
log_->LogAsciiSymbol(pos, i::Vector<const char>(keyword,
|
1415
|
+
i::StrLength(keyword)));
|
1416
|
+
return Identifier::Default();
|
1417
|
+
}
|
1418
|
+
if (next == i::Token::IDENTIFIER ||
|
1419
|
+
next == i::Token::FUTURE_RESERVED_WORD) {
|
1420
|
+
return GetIdentifierSymbol();
|
1421
|
+
}
|
1422
|
+
*ok = false;
|
1423
|
+
return Identifier::Default();
|
1424
|
+
}
|
1425
|
+
|
1426
|
+
#undef CHECK_OK
|
1427
|
+
|
1428
|
+
|
1429
|
+
// This function reads an identifier and determines whether or not it
|
1430
|
+
// is 'get' or 'set'.
|
1431
|
+
PreParser::Identifier PreParser::ParseIdentifierOrGetOrSet(bool* is_get,
|
1432
|
+
bool* is_set,
|
1433
|
+
bool* ok) {
|
1434
|
+
Identifier result = ParseIdentifier(ok);
|
1435
|
+
if (!*ok) return Identifier::Default();
|
1436
|
+
if (scanner_->is_literal_ascii() &&
|
1437
|
+
scanner_->literal_length() == 3) {
|
1438
|
+
const char* token = scanner_->literal_ascii_string().start();
|
1439
|
+
*is_get = strncmp(token, "get", 3) == 0;
|
1440
|
+
*is_set = !*is_get && strncmp(token, "set", 3) == 0;
|
1441
|
+
}
|
1442
|
+
return result;
|
1443
|
+
}
|
1444
|
+
|
1445
|
+
bool PreParser::peek_any_identifier() {
|
1446
|
+
i::Token::Value next = peek();
|
1447
|
+
return next == i::Token::IDENTIFIER ||
|
1448
|
+
next == i::Token::FUTURE_RESERVED_WORD;
|
1449
|
+
}
|
1450
|
+
} } // v8::preparser
|