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.
Files changed (700) hide show
  1. data/.gitignore +8 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +44 -0
  5. data/Rakefile +73 -0
  6. data/ext/libv8/extconf.rb +9 -0
  7. data/lib/libv8.rb +15 -0
  8. data/lib/libv8/Makefile +38 -0
  9. data/lib/libv8/detect_cpu.rb +27 -0
  10. data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
  11. data/lib/libv8/scons/CHANGES.txt +5334 -0
  12. data/lib/libv8/scons/LICENSE.txt +20 -0
  13. data/lib/libv8/scons/MANIFEST +199 -0
  14. data/lib/libv8/scons/PKG-INFO +13 -0
  15. data/lib/libv8/scons/README.txt +243 -0
  16. data/lib/libv8/scons/RELEASE.txt +98 -0
  17. data/lib/libv8/scons/engine/SCons/Action.py +1241 -0
  18. data/lib/libv8/scons/engine/SCons/Builder.py +877 -0
  19. data/lib/libv8/scons/engine/SCons/CacheDir.py +216 -0
  20. data/lib/libv8/scons/engine/SCons/Conftest.py +793 -0
  21. data/lib/libv8/scons/engine/SCons/Debug.py +220 -0
  22. data/lib/libv8/scons/engine/SCons/Defaults.py +480 -0
  23. data/lib/libv8/scons/engine/SCons/Environment.py +2318 -0
  24. data/lib/libv8/scons/engine/SCons/Errors.py +205 -0
  25. data/lib/libv8/scons/engine/SCons/Executor.py +633 -0
  26. data/lib/libv8/scons/engine/SCons/Job.py +435 -0
  27. data/lib/libv8/scons/engine/SCons/Memoize.py +244 -0
  28. data/lib/libv8/scons/engine/SCons/Node/Alias.py +152 -0
  29. data/lib/libv8/scons/engine/SCons/Node/FS.py +3142 -0
  30. data/lib/libv8/scons/engine/SCons/Node/Python.py +128 -0
  31. data/lib/libv8/scons/engine/SCons/Node/__init__.py +1328 -0
  32. data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +50 -0
  33. data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +50 -0
  34. data/lib/libv8/scons/engine/SCons/Options/ListOption.py +50 -0
  35. data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +50 -0
  36. data/lib/libv8/scons/engine/SCons/Options/PathOption.py +76 -0
  37. data/lib/libv8/scons/engine/SCons/Options/__init__.py +67 -0
  38. data/lib/libv8/scons/engine/SCons/PathList.py +231 -0
  39. data/lib/libv8/scons/engine/SCons/Platform/__init__.py +241 -0
  40. data/lib/libv8/scons/engine/SCons/Platform/aix.py +69 -0
  41. data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +55 -0
  42. data/lib/libv8/scons/engine/SCons/Platform/darwin.py +46 -0
  43. data/lib/libv8/scons/engine/SCons/Platform/hpux.py +46 -0
  44. data/lib/libv8/scons/engine/SCons/Platform/irix.py +44 -0
  45. data/lib/libv8/scons/engine/SCons/Platform/os2.py +58 -0
  46. data/lib/libv8/scons/engine/SCons/Platform/posix.py +263 -0
  47. data/lib/libv8/scons/engine/SCons/Platform/sunos.py +50 -0
  48. data/lib/libv8/scons/engine/SCons/Platform/win32.py +385 -0
  49. data/lib/libv8/scons/engine/SCons/SConf.py +1030 -0
  50. data/lib/libv8/scons/engine/SCons/SConsign.py +383 -0
  51. data/lib/libv8/scons/engine/SCons/Scanner/C.py +132 -0
  52. data/lib/libv8/scons/engine/SCons/Scanner/D.py +73 -0
  53. data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +109 -0
  54. data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +316 -0
  55. data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +48 -0
  56. data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +384 -0
  57. data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +101 -0
  58. data/lib/libv8/scons/engine/SCons/Scanner/RC.py +55 -0
  59. data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +413 -0
  60. data/lib/libv8/scons/engine/SCons/Script/Interactive.py +384 -0
  61. data/lib/libv8/scons/engine/SCons/Script/Main.py +1334 -0
  62. data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +939 -0
  63. data/lib/libv8/scons/engine/SCons/Script/SConscript.py +640 -0
  64. data/lib/libv8/scons/engine/SCons/Script/__init__.py +412 -0
  65. data/lib/libv8/scons/engine/SCons/Sig.py +63 -0
  66. data/lib/libv8/scons/engine/SCons/Subst.py +904 -0
  67. data/lib/libv8/scons/engine/SCons/Taskmaster.py +1017 -0
  68. data/lib/libv8/scons/engine/SCons/Tool/386asm.py +61 -0
  69. data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +67 -0
  70. data/lib/libv8/scons/engine/SCons/Tool/CVS.py +73 -0
  71. data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +246 -0
  72. data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +323 -0
  73. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +56 -0
  74. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +61 -0
  75. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +240 -0
  76. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +82 -0
  77. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +391 -0
  78. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +456 -0
  79. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +499 -0
  80. data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +103 -0
  81. data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +137 -0
  82. data/lib/libv8/scons/engine/SCons/Tool/RCS.py +64 -0
  83. data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +64 -0
  84. data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +71 -0
  85. data/lib/libv8/scons/engine/SCons/Tool/__init__.py +681 -0
  86. data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +82 -0
  87. data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +74 -0
  88. data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +80 -0
  89. data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +76 -0
  90. data/lib/libv8/scons/engine/SCons/Tool/applelink.py +71 -0
  91. data/lib/libv8/scons/engine/SCons/Tool/ar.py +63 -0
  92. data/lib/libv8/scons/engine/SCons/Tool/as.py +78 -0
  93. data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +81 -0
  94. data/lib/libv8/scons/engine/SCons/Tool/c++.py +99 -0
  95. data/lib/libv8/scons/engine/SCons/Tool/cc.py +102 -0
  96. data/lib/libv8/scons/engine/SCons/Tool/cvf.py +58 -0
  97. data/lib/libv8/scons/engine/SCons/Tool/default.py +50 -0
  98. data/lib/libv8/scons/engine/SCons/Tool/dmd.py +223 -0
  99. data/lib/libv8/scons/engine/SCons/Tool/dvi.py +64 -0
  100. data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +124 -0
  101. data/lib/libv8/scons/engine/SCons/Tool/dvips.py +94 -0
  102. data/lib/libv8/scons/engine/SCons/Tool/f77.py +62 -0
  103. data/lib/libv8/scons/engine/SCons/Tool/f90.py +62 -0
  104. data/lib/libv8/scons/engine/SCons/Tool/f95.py +63 -0
  105. data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +98 -0
  106. data/lib/libv8/scons/engine/SCons/Tool/fortran.py +62 -0
  107. data/lib/libv8/scons/engine/SCons/Tool/g++.py +90 -0
  108. data/lib/libv8/scons/engine/SCons/Tool/g77.py +73 -0
  109. data/lib/libv8/scons/engine/SCons/Tool/gas.py +53 -0
  110. data/lib/libv8/scons/engine/SCons/Tool/gcc.py +80 -0
  111. data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +64 -0
  112. data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +63 -0
  113. data/lib/libv8/scons/engine/SCons/Tool/gs.py +81 -0
  114. data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +84 -0
  115. data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +53 -0
  116. data/lib/libv8/scons/engine/SCons/Tool/hplink.py +77 -0
  117. data/lib/libv8/scons/engine/SCons/Tool/icc.py +59 -0
  118. data/lib/libv8/scons/engine/SCons/Tool/icl.py +52 -0
  119. data/lib/libv8/scons/engine/SCons/Tool/ifl.py +72 -0
  120. data/lib/libv8/scons/engine/SCons/Tool/ifort.py +88 -0
  121. data/lib/libv8/scons/engine/SCons/Tool/ilink.py +59 -0
  122. data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +60 -0
  123. data/lib/libv8/scons/engine/SCons/Tool/install.py +229 -0
  124. data/lib/libv8/scons/engine/SCons/Tool/intelc.py +482 -0
  125. data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +67 -0
  126. data/lib/libv8/scons/engine/SCons/Tool/jar.py +110 -0
  127. data/lib/libv8/scons/engine/SCons/Tool/javac.py +230 -0
  128. data/lib/libv8/scons/engine/SCons/Tool/javah.py +137 -0
  129. data/lib/libv8/scons/engine/SCons/Tool/latex.py +79 -0
  130. data/lib/libv8/scons/engine/SCons/Tool/lex.py +97 -0
  131. data/lib/libv8/scons/engine/SCons/Tool/link.py +121 -0
  132. data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +112 -0
  133. data/lib/libv8/scons/engine/SCons/Tool/m4.py +63 -0
  134. data/lib/libv8/scons/engine/SCons/Tool/masm.py +77 -0
  135. data/lib/libv8/scons/engine/SCons/Tool/midl.py +88 -0
  136. data/lib/libv8/scons/engine/SCons/Tool/mingw.py +158 -0
  137. data/lib/libv8/scons/engine/SCons/Tool/mslib.py +64 -0
  138. data/lib/libv8/scons/engine/SCons/Tool/mslink.py +266 -0
  139. data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +50 -0
  140. data/lib/libv8/scons/engine/SCons/Tool/msvc.py +268 -0
  141. data/lib/libv8/scons/engine/SCons/Tool/msvs.py +1388 -0
  142. data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +207 -0
  143. data/lib/libv8/scons/engine/SCons/Tool/mwld.py +107 -0
  144. data/lib/libv8/scons/engine/SCons/Tool/nasm.py +72 -0
  145. data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +312 -0
  146. data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +185 -0
  147. data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +527 -0
  148. data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +365 -0
  149. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +43 -0
  150. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +43 -0
  151. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +43 -0
  152. data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +44 -0
  153. data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +44 -0
  154. data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +44 -0
  155. data/lib/libv8/scons/engine/SCons/Tool/pdf.py +78 -0
  156. data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +83 -0
  157. data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +108 -0
  158. data/lib/libv8/scons/engine/SCons/Tool/qt.py +336 -0
  159. data/lib/libv8/scons/engine/SCons/Tool/rmic.py +120 -0
  160. data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +70 -0
  161. data/lib/libv8/scons/engine/SCons/Tool/rpm.py +132 -0
  162. data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +68 -0
  163. data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +58 -0
  164. data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +53 -0
  165. data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +63 -0
  166. data/lib/libv8/scons/engine/SCons/Tool/sunar.py +67 -0
  167. data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +142 -0
  168. data/lib/libv8/scons/engine/SCons/Tool/suncc.py +58 -0
  169. data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +63 -0
  170. data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +64 -0
  171. data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +64 -0
  172. data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +77 -0
  173. data/lib/libv8/scons/engine/SCons/Tool/swig.py +182 -0
  174. data/lib/libv8/scons/engine/SCons/Tool/tar.py +73 -0
  175. data/lib/libv8/scons/engine/SCons/Tool/tex.py +813 -0
  176. data/lib/libv8/scons/engine/SCons/Tool/textfile.py +175 -0
  177. data/lib/libv8/scons/engine/SCons/Tool/tlib.py +53 -0
  178. data/lib/libv8/scons/engine/SCons/Tool/wix.py +99 -0
  179. data/lib/libv8/scons/engine/SCons/Tool/yacc.py +130 -0
  180. data/lib/libv8/scons/engine/SCons/Tool/zip.py +99 -0
  181. data/lib/libv8/scons/engine/SCons/Util.py +1492 -0
  182. data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +89 -0
  183. data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +103 -0
  184. data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +135 -0
  185. data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +106 -0
  186. data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +147 -0
  187. data/lib/libv8/scons/engine/SCons/Variables/__init__.py +312 -0
  188. data/lib/libv8/scons/engine/SCons/Warnings.py +246 -0
  189. data/lib/libv8/scons/engine/SCons/__init__.py +49 -0
  190. data/lib/libv8/scons/engine/SCons/compat/__init__.py +237 -0
  191. data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +150 -0
  192. data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +45 -0
  193. data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +45 -0
  194. data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +76 -0
  195. data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +45 -0
  196. data/lib/libv8/scons/engine/SCons/compat/_scons_sets.py +563 -0
  197. data/lib/libv8/scons/engine/SCons/compat/_scons_subprocess.py +1281 -0
  198. data/lib/libv8/scons/engine/SCons/cpp.py +589 -0
  199. data/lib/libv8/scons/engine/SCons/dblite.py +251 -0
  200. data/lib/libv8/scons/engine/SCons/exitfuncs.py +77 -0
  201. data/lib/libv8/scons/os_spawnv_fix.diff +83 -0
  202. data/lib/libv8/scons/scons-time.1 +1017 -0
  203. data/lib/libv8/scons/scons.1 +15219 -0
  204. data/lib/libv8/scons/sconsign.1 +208 -0
  205. data/lib/libv8/scons/script/scons +196 -0
  206. data/lib/libv8/scons/script/scons-time +1544 -0
  207. data/lib/libv8/scons/script/scons.bat +31 -0
  208. data/lib/libv8/scons/script/sconsign +513 -0
  209. data/lib/libv8/scons/setup.cfg +6 -0
  210. data/lib/libv8/scons/setup.py +425 -0
  211. data/lib/libv8/v8/.gitignore +35 -0
  212. data/lib/libv8/v8/AUTHORS +44 -0
  213. data/lib/libv8/v8/ChangeLog +2839 -0
  214. data/lib/libv8/v8/LICENSE +52 -0
  215. data/lib/libv8/v8/LICENSE.strongtalk +29 -0
  216. data/lib/libv8/v8/LICENSE.v8 +26 -0
  217. data/lib/libv8/v8/LICENSE.valgrind +45 -0
  218. data/lib/libv8/v8/SConstruct +1478 -0
  219. data/lib/libv8/v8/build/README.txt +49 -0
  220. data/lib/libv8/v8/build/all.gyp +18 -0
  221. data/lib/libv8/v8/build/armu.gypi +32 -0
  222. data/lib/libv8/v8/build/common.gypi +144 -0
  223. data/lib/libv8/v8/build/gyp_v8 +145 -0
  224. data/lib/libv8/v8/include/v8-debug.h +395 -0
  225. data/lib/libv8/v8/include/v8-preparser.h +117 -0
  226. data/lib/libv8/v8/include/v8-profiler.h +505 -0
  227. data/lib/libv8/v8/include/v8-testing.h +104 -0
  228. data/lib/libv8/v8/include/v8.h +4124 -0
  229. data/lib/libv8/v8/include/v8stdint.h +53 -0
  230. data/lib/libv8/v8/preparser/SConscript +38 -0
  231. data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
  232. data/lib/libv8/v8/src/SConscript +368 -0
  233. data/lib/libv8/v8/src/accessors.cc +767 -0
  234. data/lib/libv8/v8/src/accessors.h +123 -0
  235. data/lib/libv8/v8/src/allocation-inl.h +49 -0
  236. data/lib/libv8/v8/src/allocation.cc +122 -0
  237. data/lib/libv8/v8/src/allocation.h +143 -0
  238. data/lib/libv8/v8/src/api.cc +5845 -0
  239. data/lib/libv8/v8/src/api.h +574 -0
  240. data/lib/libv8/v8/src/apinatives.js +110 -0
  241. data/lib/libv8/v8/src/apiutils.h +73 -0
  242. data/lib/libv8/v8/src/arguments.h +118 -0
  243. data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
  244. data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
  245. data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
  246. data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
  247. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
  248. data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
  249. data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
  250. data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
  251. data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
  252. data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
  253. data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
  254. data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
  255. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
  256. data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
  257. data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
  258. data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
  259. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
  260. data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
  261. data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
  262. data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
  263. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
  264. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
  265. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
  266. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
  267. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
  268. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
  269. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
  270. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
  271. data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
  272. data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
  273. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
  274. data/lib/libv8/v8/src/array.js +1366 -0
  275. data/lib/libv8/v8/src/assembler.cc +1207 -0
  276. data/lib/libv8/v8/src/assembler.h +858 -0
  277. data/lib/libv8/v8/src/ast-inl.h +112 -0
  278. data/lib/libv8/v8/src/ast.cc +1146 -0
  279. data/lib/libv8/v8/src/ast.h +2188 -0
  280. data/lib/libv8/v8/src/atomicops.h +167 -0
  281. data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
  282. data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
  283. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
  284. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
  285. data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
  286. data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
  287. data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
  288. data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
  289. data/lib/libv8/v8/src/bignum.cc +768 -0
  290. data/lib/libv8/v8/src/bignum.h +140 -0
  291. data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
  292. data/lib/libv8/v8/src/bootstrapper.h +188 -0
  293. data/lib/libv8/v8/src/builtins.cc +1707 -0
  294. data/lib/libv8/v8/src/builtins.h +371 -0
  295. data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
  296. data/lib/libv8/v8/src/cached-powers.cc +177 -0
  297. data/lib/libv8/v8/src/cached-powers.h +65 -0
  298. data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
  299. data/lib/libv8/v8/src/char-predicates.h +67 -0
  300. data/lib/libv8/v8/src/checks.cc +110 -0
  301. data/lib/libv8/v8/src/checks.h +296 -0
  302. data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
  303. data/lib/libv8/v8/src/circular-queue.cc +122 -0
  304. data/lib/libv8/v8/src/circular-queue.h +103 -0
  305. data/lib/libv8/v8/src/code-stubs.cc +267 -0
  306. data/lib/libv8/v8/src/code-stubs.h +1011 -0
  307. data/lib/libv8/v8/src/code.h +70 -0
  308. data/lib/libv8/v8/src/codegen.cc +231 -0
  309. data/lib/libv8/v8/src/codegen.h +84 -0
  310. data/lib/libv8/v8/src/compilation-cache.cc +540 -0
  311. data/lib/libv8/v8/src/compilation-cache.h +287 -0
  312. data/lib/libv8/v8/src/compiler.cc +786 -0
  313. data/lib/libv8/v8/src/compiler.h +312 -0
  314. data/lib/libv8/v8/src/contexts.cc +347 -0
  315. data/lib/libv8/v8/src/contexts.h +391 -0
  316. data/lib/libv8/v8/src/conversions-inl.h +106 -0
  317. data/lib/libv8/v8/src/conversions.cc +1131 -0
  318. data/lib/libv8/v8/src/conversions.h +135 -0
  319. data/lib/libv8/v8/src/counters.cc +93 -0
  320. data/lib/libv8/v8/src/counters.h +254 -0
  321. data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
  322. data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
  323. data/lib/libv8/v8/src/cpu-profiler.h +302 -0
  324. data/lib/libv8/v8/src/cpu.h +69 -0
  325. data/lib/libv8/v8/src/d8-debug.cc +367 -0
  326. data/lib/libv8/v8/src/d8-debug.h +158 -0
  327. data/lib/libv8/v8/src/d8-posix.cc +695 -0
  328. data/lib/libv8/v8/src/d8-readline.cc +130 -0
  329. data/lib/libv8/v8/src/d8-windows.cc +42 -0
  330. data/lib/libv8/v8/src/d8.cc +803 -0
  331. data/lib/libv8/v8/src/d8.gyp +91 -0
  332. data/lib/libv8/v8/src/d8.h +235 -0
  333. data/lib/libv8/v8/src/d8.js +2798 -0
  334. data/lib/libv8/v8/src/data-flow.cc +66 -0
  335. data/lib/libv8/v8/src/data-flow.h +205 -0
  336. data/lib/libv8/v8/src/date.js +1103 -0
  337. data/lib/libv8/v8/src/dateparser-inl.h +127 -0
  338. data/lib/libv8/v8/src/dateparser.cc +178 -0
  339. data/lib/libv8/v8/src/dateparser.h +266 -0
  340. data/lib/libv8/v8/src/debug-agent.cc +447 -0
  341. data/lib/libv8/v8/src/debug-agent.h +129 -0
  342. data/lib/libv8/v8/src/debug-debugger.js +2569 -0
  343. data/lib/libv8/v8/src/debug.cc +3165 -0
  344. data/lib/libv8/v8/src/debug.h +1057 -0
  345. data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
  346. data/lib/libv8/v8/src/deoptimizer.h +602 -0
  347. data/lib/libv8/v8/src/disasm.h +80 -0
  348. data/lib/libv8/v8/src/disassembler.cc +343 -0
  349. data/lib/libv8/v8/src/disassembler.h +58 -0
  350. data/lib/libv8/v8/src/diy-fp.cc +58 -0
  351. data/lib/libv8/v8/src/diy-fp.h +117 -0
  352. data/lib/libv8/v8/src/double.h +238 -0
  353. data/lib/libv8/v8/src/dtoa.cc +103 -0
  354. data/lib/libv8/v8/src/dtoa.h +85 -0
  355. data/lib/libv8/v8/src/execution.cc +849 -0
  356. data/lib/libv8/v8/src/execution.h +297 -0
  357. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
  358. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
  359. data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
  360. data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
  361. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
  362. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
  363. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
  364. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
  365. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
  366. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
  367. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
  368. data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
  369. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
  370. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
  371. data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
  372. data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
  373. data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
  374. data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
  375. data/lib/libv8/v8/src/factory.cc +1222 -0
  376. data/lib/libv8/v8/src/factory.h +442 -0
  377. data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
  378. data/lib/libv8/v8/src/fast-dtoa.h +83 -0
  379. data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
  380. data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
  381. data/lib/libv8/v8/src/flag-definitions.h +560 -0
  382. data/lib/libv8/v8/src/flags.cc +551 -0
  383. data/lib/libv8/v8/src/flags.h +79 -0
  384. data/lib/libv8/v8/src/frames-inl.h +247 -0
  385. data/lib/libv8/v8/src/frames.cc +1243 -0
  386. data/lib/libv8/v8/src/frames.h +870 -0
  387. data/lib/libv8/v8/src/full-codegen.cc +1374 -0
  388. data/lib/libv8/v8/src/full-codegen.h +771 -0
  389. data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
  390. data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
  391. data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
  392. data/lib/libv8/v8/src/gdb-jit.h +143 -0
  393. data/lib/libv8/v8/src/global-handles.cc +665 -0
  394. data/lib/libv8/v8/src/global-handles.h +284 -0
  395. data/lib/libv8/v8/src/globals.h +325 -0
  396. data/lib/libv8/v8/src/handles-inl.h +177 -0
  397. data/lib/libv8/v8/src/handles.cc +987 -0
  398. data/lib/libv8/v8/src/handles.h +382 -0
  399. data/lib/libv8/v8/src/hashmap.cc +230 -0
  400. data/lib/libv8/v8/src/hashmap.h +123 -0
  401. data/lib/libv8/v8/src/heap-inl.h +704 -0
  402. data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
  403. data/lib/libv8/v8/src/heap-profiler.h +397 -0
  404. data/lib/libv8/v8/src/heap.cc +5930 -0
  405. data/lib/libv8/v8/src/heap.h +2268 -0
  406. data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
  407. data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
  408. data/lib/libv8/v8/src/hydrogen.cc +6239 -0
  409. data/lib/libv8/v8/src/hydrogen.h +1202 -0
  410. data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
  411. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
  412. data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
  413. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
  414. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
  415. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
  416. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
  417. data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
  418. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
  419. data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
  420. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
  421. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
  422. data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
  423. data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
  424. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
  425. data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
  426. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
  427. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
  428. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
  429. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
  430. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
  431. data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
  432. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
  433. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
  434. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
  435. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
  436. data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
  437. data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
  438. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
  439. data/lib/libv8/v8/src/ic-inl.h +130 -0
  440. data/lib/libv8/v8/src/ic.cc +2577 -0
  441. data/lib/libv8/v8/src/ic.h +736 -0
  442. data/lib/libv8/v8/src/inspector.cc +63 -0
  443. data/lib/libv8/v8/src/inspector.h +62 -0
  444. data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
  445. data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
  446. data/lib/libv8/v8/src/isolate-inl.h +50 -0
  447. data/lib/libv8/v8/src/isolate.cc +1869 -0
  448. data/lib/libv8/v8/src/isolate.h +1382 -0
  449. data/lib/libv8/v8/src/json-parser.cc +504 -0
  450. data/lib/libv8/v8/src/json-parser.h +161 -0
  451. data/lib/libv8/v8/src/json.js +342 -0
  452. data/lib/libv8/v8/src/jsregexp.cc +5385 -0
  453. data/lib/libv8/v8/src/jsregexp.h +1492 -0
  454. data/lib/libv8/v8/src/list-inl.h +212 -0
  455. data/lib/libv8/v8/src/list.h +174 -0
  456. data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
  457. data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
  458. data/lib/libv8/v8/src/lithium-allocator.h +630 -0
  459. data/lib/libv8/v8/src/lithium.cc +190 -0
  460. data/lib/libv8/v8/src/lithium.h +597 -0
  461. data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
  462. data/lib/libv8/v8/src/liveedit.cc +1691 -0
  463. data/lib/libv8/v8/src/liveedit.h +180 -0
  464. data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
  465. data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
  466. data/lib/libv8/v8/src/liveobjectlist.h +322 -0
  467. data/lib/libv8/v8/src/log-inl.h +59 -0
  468. data/lib/libv8/v8/src/log-utils.cc +428 -0
  469. data/lib/libv8/v8/src/log-utils.h +231 -0
  470. data/lib/libv8/v8/src/log.cc +1993 -0
  471. data/lib/libv8/v8/src/log.h +476 -0
  472. data/lib/libv8/v8/src/macro-assembler.h +120 -0
  473. data/lib/libv8/v8/src/macros.py +178 -0
  474. data/lib/libv8/v8/src/mark-compact.cc +3143 -0
  475. data/lib/libv8/v8/src/mark-compact.h +506 -0
  476. data/lib/libv8/v8/src/math.js +264 -0
  477. data/lib/libv8/v8/src/messages.cc +179 -0
  478. data/lib/libv8/v8/src/messages.h +113 -0
  479. data/lib/libv8/v8/src/messages.js +1096 -0
  480. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
  481. data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
  482. data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
  483. data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
  484. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
  485. data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
  486. data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
  487. data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
  488. data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
  489. data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
  490. data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
  491. data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
  492. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
  493. data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
  494. data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
  495. data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
  496. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
  497. data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
  498. data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
  499. data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
  500. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
  501. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
  502. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
  503. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
  504. data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
  505. data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
  506. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
  507. data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
  508. data/lib/libv8/v8/src/mksnapshot.cc +328 -0
  509. data/lib/libv8/v8/src/natives.h +64 -0
  510. data/lib/libv8/v8/src/objects-debug.cc +738 -0
  511. data/lib/libv8/v8/src/objects-inl.h +4323 -0
  512. data/lib/libv8/v8/src/objects-printer.cc +829 -0
  513. data/lib/libv8/v8/src/objects-visiting.cc +148 -0
  514. data/lib/libv8/v8/src/objects-visiting.h +424 -0
  515. data/lib/libv8/v8/src/objects.cc +10585 -0
  516. data/lib/libv8/v8/src/objects.h +6838 -0
  517. data/lib/libv8/v8/src/parser.cc +4997 -0
  518. data/lib/libv8/v8/src/parser.h +765 -0
  519. data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
  520. data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
  521. data/lib/libv8/v8/src/platform-linux.cc +1149 -0
  522. data/lib/libv8/v8/src/platform-macos.cc +830 -0
  523. data/lib/libv8/v8/src/platform-nullos.cc +479 -0
  524. data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
  525. data/lib/libv8/v8/src/platform-posix.cc +424 -0
  526. data/lib/libv8/v8/src/platform-solaris.cc +762 -0
  527. data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
  528. data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
  529. data/lib/libv8/v8/src/platform-tls.h +50 -0
  530. data/lib/libv8/v8/src/platform-win32.cc +2021 -0
  531. data/lib/libv8/v8/src/platform.h +667 -0
  532. data/lib/libv8/v8/src/preparse-data-format.h +62 -0
  533. data/lib/libv8/v8/src/preparse-data.cc +183 -0
  534. data/lib/libv8/v8/src/preparse-data.h +225 -0
  535. data/lib/libv8/v8/src/preparser-api.cc +220 -0
  536. data/lib/libv8/v8/src/preparser.cc +1450 -0
  537. data/lib/libv8/v8/src/preparser.h +493 -0
  538. data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
  539. data/lib/libv8/v8/src/prettyprinter.h +223 -0
  540. data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
  541. data/lib/libv8/v8/src/profile-generator.cc +3098 -0
  542. data/lib/libv8/v8/src/profile-generator.h +1126 -0
  543. data/lib/libv8/v8/src/property.cc +105 -0
  544. data/lib/libv8/v8/src/property.h +365 -0
  545. data/lib/libv8/v8/src/proxy.js +83 -0
  546. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  547. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
  548. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
  549. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
  550. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
  551. data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
  552. data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
  553. data/lib/libv8/v8/src/regexp-stack.cc +111 -0
  554. data/lib/libv8/v8/src/regexp-stack.h +147 -0
  555. data/lib/libv8/v8/src/regexp.js +483 -0
  556. data/lib/libv8/v8/src/rewriter.cc +360 -0
  557. data/lib/libv8/v8/src/rewriter.h +50 -0
  558. data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
  559. data/lib/libv8/v8/src/runtime-profiler.h +201 -0
  560. data/lib/libv8/v8/src/runtime.cc +12227 -0
  561. data/lib/libv8/v8/src/runtime.h +652 -0
  562. data/lib/libv8/v8/src/runtime.js +649 -0
  563. data/lib/libv8/v8/src/safepoint-table.cc +256 -0
  564. data/lib/libv8/v8/src/safepoint-table.h +270 -0
  565. data/lib/libv8/v8/src/scanner-base.cc +952 -0
  566. data/lib/libv8/v8/src/scanner-base.h +670 -0
  567. data/lib/libv8/v8/src/scanner.cc +345 -0
  568. data/lib/libv8/v8/src/scanner.h +146 -0
  569. data/lib/libv8/v8/src/scopeinfo.cc +646 -0
  570. data/lib/libv8/v8/src/scopeinfo.h +254 -0
  571. data/lib/libv8/v8/src/scopes.cc +1150 -0
  572. data/lib/libv8/v8/src/scopes.h +507 -0
  573. data/lib/libv8/v8/src/serialize.cc +1574 -0
  574. data/lib/libv8/v8/src/serialize.h +589 -0
  575. data/lib/libv8/v8/src/shell.h +55 -0
  576. data/lib/libv8/v8/src/simulator.h +43 -0
  577. data/lib/libv8/v8/src/small-pointer-list.h +163 -0
  578. data/lib/libv8/v8/src/smart-pointer.h +109 -0
  579. data/lib/libv8/v8/src/snapshot-common.cc +83 -0
  580. data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
  581. data/lib/libv8/v8/src/snapshot.h +91 -0
  582. data/lib/libv8/v8/src/spaces-inl.h +529 -0
  583. data/lib/libv8/v8/src/spaces.cc +3145 -0
  584. data/lib/libv8/v8/src/spaces.h +2369 -0
  585. data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
  586. data/lib/libv8/v8/src/splay-tree.h +205 -0
  587. data/lib/libv8/v8/src/string-search.cc +41 -0
  588. data/lib/libv8/v8/src/string-search.h +568 -0
  589. data/lib/libv8/v8/src/string-stream.cc +592 -0
  590. data/lib/libv8/v8/src/string-stream.h +191 -0
  591. data/lib/libv8/v8/src/string.js +994 -0
  592. data/lib/libv8/v8/src/strtod.cc +440 -0
  593. data/lib/libv8/v8/src/strtod.h +40 -0
  594. data/lib/libv8/v8/src/stub-cache.cc +1965 -0
  595. data/lib/libv8/v8/src/stub-cache.h +924 -0
  596. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
  597. data/lib/libv8/v8/src/token.cc +63 -0
  598. data/lib/libv8/v8/src/token.h +288 -0
  599. data/lib/libv8/v8/src/type-info.cc +507 -0
  600. data/lib/libv8/v8/src/type-info.h +272 -0
  601. data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
  602. data/lib/libv8/v8/src/unbound-queue.h +69 -0
  603. data/lib/libv8/v8/src/unicode-inl.h +238 -0
  604. data/lib/libv8/v8/src/unicode.cc +1624 -0
  605. data/lib/libv8/v8/src/unicode.h +280 -0
  606. data/lib/libv8/v8/src/uri.js +408 -0
  607. data/lib/libv8/v8/src/utils-inl.h +48 -0
  608. data/lib/libv8/v8/src/utils.cc +371 -0
  609. data/lib/libv8/v8/src/utils.h +800 -0
  610. data/lib/libv8/v8/src/v8-counters.cc +62 -0
  611. data/lib/libv8/v8/src/v8-counters.h +314 -0
  612. data/lib/libv8/v8/src/v8.cc +213 -0
  613. data/lib/libv8/v8/src/v8.h +131 -0
  614. data/lib/libv8/v8/src/v8checks.h +64 -0
  615. data/lib/libv8/v8/src/v8dll-main.cc +44 -0
  616. data/lib/libv8/v8/src/v8globals.h +512 -0
  617. data/lib/libv8/v8/src/v8memory.h +82 -0
  618. data/lib/libv8/v8/src/v8natives.js +1310 -0
  619. data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
  620. data/lib/libv8/v8/src/v8threads.cc +464 -0
  621. data/lib/libv8/v8/src/v8threads.h +165 -0
  622. data/lib/libv8/v8/src/v8utils.h +319 -0
  623. data/lib/libv8/v8/src/variables.cc +114 -0
  624. data/lib/libv8/v8/src/variables.h +167 -0
  625. data/lib/libv8/v8/src/version.cc +116 -0
  626. data/lib/libv8/v8/src/version.h +68 -0
  627. data/lib/libv8/v8/src/vm-state-inl.h +138 -0
  628. data/lib/libv8/v8/src/vm-state.h +71 -0
  629. data/lib/libv8/v8/src/win32-headers.h +96 -0
  630. data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
  631. data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
  632. data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
  633. data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
  634. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
  635. data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
  636. data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
  637. data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
  638. data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
  639. data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
  640. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
  641. data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
  642. data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
  643. data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
  644. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
  645. data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
  646. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
  647. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
  648. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
  649. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
  650. data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
  651. data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
  652. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
  653. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
  654. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
  655. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
  656. data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
  657. data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
  658. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
  659. data/lib/libv8/v8/src/zone-inl.h +140 -0
  660. data/lib/libv8/v8/src/zone.cc +196 -0
  661. data/lib/libv8/v8/src/zone.h +240 -0
  662. data/lib/libv8/v8/tools/codemap.js +265 -0
  663. data/lib/libv8/v8/tools/consarray.js +93 -0
  664. data/lib/libv8/v8/tools/csvparser.js +78 -0
  665. data/lib/libv8/v8/tools/disasm.py +92 -0
  666. data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
  667. data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
  668. data/lib/libv8/v8/tools/gcmole/README +62 -0
  669. data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
  670. data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
  671. data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
  672. data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
  673. data/lib/libv8/v8/tools/grokdump.py +841 -0
  674. data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
  675. data/lib/libv8/v8/tools/js2c.py +364 -0
  676. data/lib/libv8/v8/tools/jsmin.py +280 -0
  677. data/lib/libv8/v8/tools/linux-tick-processor +35 -0
  678. data/lib/libv8/v8/tools/ll_prof.py +942 -0
  679. data/lib/libv8/v8/tools/logreader.js +185 -0
  680. data/lib/libv8/v8/tools/mac-nm +18 -0
  681. data/lib/libv8/v8/tools/mac-tick-processor +6 -0
  682. data/lib/libv8/v8/tools/oom_dump/README +31 -0
  683. data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
  684. data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
  685. data/lib/libv8/v8/tools/presubmit.py +305 -0
  686. data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
  687. data/lib/libv8/v8/tools/profile.js +751 -0
  688. data/lib/libv8/v8/tools/profile_view.js +219 -0
  689. data/lib/libv8/v8/tools/run-valgrind.py +77 -0
  690. data/lib/libv8/v8/tools/splaytree.js +316 -0
  691. data/lib/libv8/v8/tools/stats-viewer.py +468 -0
  692. data/lib/libv8/v8/tools/test.py +1510 -0
  693. data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
  694. data/lib/libv8/v8/tools/tickprocessor.js +877 -0
  695. data/lib/libv8/v8/tools/utils.py +96 -0
  696. data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
  697. data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
  698. data/lib/libv8/version.rb +4 -0
  699. data/libv8.gemspec +31 -0
  700. 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