libv8 3.3.10.4 → 3.5.10.beta1

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