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
@@ -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:
@@ -67,6 +67,7 @@ inline bool StackHandler::includes(Address address) const {
67
67
 
68
68
 
69
69
  inline void StackHandler::Iterate(ObjectVisitor* v, Code* holder) const {
70
+ v->VisitPointer(context_address());
70
71
  StackFrame::IteratePc(v, pc_address(), holder);
71
72
  }
72
73
 
@@ -82,6 +83,12 @@ inline StackHandler::State StackHandler::state() const {
82
83
  }
83
84
 
84
85
 
86
+ inline Object** StackHandler::context_address() const {
87
+ const int offset = StackHandlerConstants::kContextOffset;
88
+ return reinterpret_cast<Object**>(address() + offset);
89
+ }
90
+
91
+
85
92
  inline Address* StackHandler::pc_address() const {
86
93
  const int offset = StackHandlerConstants::kPCOffset;
87
94
  return reinterpret_cast<Address*>(address() + offset);
@@ -36,6 +36,8 @@
36
36
  #include "scopeinfo.h"
37
37
  #include "string-stream.h"
38
38
 
39
+ #include "allocation-inl.h"
40
+
39
41
  namespace v8 {
40
42
  namespace internal {
41
43
 
@@ -346,7 +348,6 @@ void SafeStackFrameIterator::Reset() {
346
348
  // -------------------------------------------------------------------------
347
349
 
348
350
 
349
- #ifdef ENABLE_LOGGING_AND_PROFILING
350
351
  SafeStackTraceFrameIterator::SafeStackTraceFrameIterator(
351
352
  Isolate* isolate,
352
353
  Address fp, Address sp, Address low_bound, Address high_bound) :
@@ -362,7 +363,6 @@ void SafeStackTraceFrameIterator::Advance() {
362
363
  if (frame()->is_java_script()) return;
363
364
  }
364
365
  }
365
- #endif
366
366
 
367
367
 
368
368
  Code* StackFrame::GetSafepointData(Isolate* isolate,
@@ -371,7 +371,6 @@ Code* StackFrame::GetSafepointData(Isolate* isolate,
371
371
  unsigned* stack_slots) {
372
372
  PcToCodeCache::PcToCodeCacheEntry* entry =
373
373
  isolate->pc_to_code_cache()->GetCacheEntry(pc);
374
- SafepointEntry cached_safepoint_entry = entry->safepoint_entry;
375
374
  if (!entry->safepoint_entry.is_valid()) {
376
375
  entry->safepoint_entry = entry->code->GetSafepointEntry(pc);
377
376
  ASSERT(entry->safepoint_entry.is_valid());
@@ -528,6 +527,17 @@ Address StandardFrame::GetExpressionAddress(int n) const {
528
527
  }
529
528
 
530
529
 
530
+ Object* StandardFrame::GetExpression(Address fp, int index) {
531
+ return Memory::Object_at(GetExpressionAddress(fp, index));
532
+ }
533
+
534
+
535
+ Address StandardFrame::GetExpressionAddress(Address fp, int n) {
536
+ const int offset = StandardFrameConstants::kExpressionsOffset;
537
+ return fp + offset - n * kPointerSize;
538
+ }
539
+
540
+
531
541
  int StandardFrame::ComputeExpressionsCount() const {
532
542
  const int offset =
533
543
  StandardFrameConstants::kExpressionsOffset + kPointerSize;
@@ -646,6 +656,16 @@ bool JavaScriptFrame::IsConstructor() const {
646
656
  }
647
657
 
648
658
 
659
+ int JavaScriptFrame::GetArgumentsLength() const {
660
+ // If there is an arguments adaptor frame get the arguments length from it.
661
+ if (has_adapted_arguments()) {
662
+ return Smi::cast(GetExpression(caller_fp(), 0))->value();
663
+ } else {
664
+ return GetNumberOfIncomingArguments();
665
+ }
666
+ }
667
+
668
+
649
669
  Code* JavaScriptFrame::unchecked_code() const {
650
670
  JSFunction* function = JSFunction::cast(this->function());
651
671
  return function->unchecked_code();
@@ -812,6 +832,22 @@ DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData(
812
832
  }
813
833
 
814
834
 
835
+ int OptimizedFrame::GetInlineCount() {
836
+ ASSERT(is_optimized());
837
+
838
+ int deopt_index = Safepoint::kNoDeoptimizationIndex;
839
+ DeoptimizationInputData* data = GetDeoptimizationData(&deopt_index);
840
+
841
+ TranslationIterator it(data->TranslationByteArray(),
842
+ data->TranslationIndex(deopt_index)->value());
843
+ Translation::Opcode opcode = static_cast<Translation::Opcode>(it.Next());
844
+ ASSERT(opcode == Translation::BEGIN);
845
+ USE(opcode);
846
+ int frame_count = it.Next();
847
+ return frame_count;
848
+ }
849
+
850
+
815
851
  void OptimizedFrame::GetFunctions(List<JSFunction*>* functions) {
816
852
  ASSERT(functions->length() == 0);
817
853
  ASSERT(is_optimized());
@@ -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:
@@ -114,6 +114,7 @@ class StackHandler BASE_EMBEDDED {
114
114
  // Accessors.
115
115
  inline State state() const;
116
116
 
117
+ inline Object** context_address() const;
117
118
  inline Address* pc_address() const;
118
119
 
119
120
  DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler);
@@ -383,6 +384,7 @@ class StandardFrame: public StackFrame {
383
384
  inline Object* GetExpression(int index) const;
384
385
  inline void SetExpression(int index, Object* value);
385
386
  int ComputeExpressionsCount() const;
387
+ static Object* GetExpression(Address fp, int index);
386
388
 
387
389
  virtual void SetCallerFp(Address caller_fp);
388
390
 
@@ -411,6 +413,7 @@ class StandardFrame: public StackFrame {
411
413
 
412
414
  // Returns the address of the n'th expression stack element.
413
415
  Address GetExpressionAddress(int n) const;
416
+ static Address GetExpressionAddress(Address fp, int n);
414
417
 
415
418
  // Determines if the n'th expression stack element is in a stack
416
419
  // handler or not. Requires traversing all handlers in this frame.
@@ -483,6 +486,7 @@ class JavaScriptFrame: public StandardFrame {
483
486
  // actual passed arguments are available in an arguments adaptor
484
487
  // frame below it on the stack.
485
488
  inline bool has_adapted_arguments() const;
489
+ int GetArgumentsLength() const;
486
490
 
487
491
  // Garbage collection support.
488
492
  virtual void Iterate(ObjectVisitor* v) const;
@@ -495,6 +499,9 @@ class JavaScriptFrame: public StandardFrame {
495
499
  // Determine the code for the frame.
496
500
  virtual Code* unchecked_code() const;
497
501
 
502
+ // Returns the levels of inlining for this frame.
503
+ virtual int GetInlineCount() { return 1; }
504
+
498
505
  // Return a list with JSFunctions of this frame.
499
506
  virtual void GetFunctions(List<JSFunction*>* functions);
500
507
 
@@ -533,6 +540,8 @@ class OptimizedFrame : public JavaScriptFrame {
533
540
  // GC support.
534
541
  virtual void Iterate(ObjectVisitor* v) const;
535
542
 
543
+ virtual int GetInlineCount();
544
+
536
545
  // Return a list with JSFunctions of this frame.
537
546
  // The functions are ordered bottom-to-top (i.e. functions.last()
538
547
  // is the top-most activation)
@@ -835,7 +844,6 @@ class SafeStackFrameIterator BASE_EMBEDDED {
835
844
  };
836
845
 
837
846
 
838
- #ifdef ENABLE_LOGGING_AND_PROFILING
839
847
  typedef JavaScriptFrameIteratorTemp<SafeStackFrameIterator>
840
848
  SafeJavaScriptFrameIterator;
841
849
 
@@ -847,7 +855,6 @@ class SafeStackTraceFrameIterator: public SafeJavaScriptFrameIterator {
847
855
  Address low_bound, Address high_bound);
848
856
  void Advance();
849
857
  };
850
- #endif
851
858
 
852
859
 
853
860
  class StackFrameLocator BASE_EMBEDDED {
@@ -35,6 +35,7 @@
35
35
  #include "macro-assembler.h"
36
36
  #include "prettyprinter.h"
37
37
  #include "scopes.h"
38
+ #include "scopeinfo.h"
38
39
  #include "stub-cache.h"
39
40
 
40
41
  namespace v8 {
@@ -90,14 +91,13 @@ void BreakableStatementChecker::VisitReturnStatement(ReturnStatement* stmt) {
90
91
  }
91
92
 
92
93
 
93
- void BreakableStatementChecker::VisitWithEnterStatement(
94
- WithEnterStatement* stmt) {
94
+ void BreakableStatementChecker::VisitWithStatement(WithStatement* stmt) {
95
95
  Visit(stmt->expression());
96
96
  }
97
97
 
98
98
 
99
- void BreakableStatementChecker::VisitWithExitStatement(
100
- WithExitStatement* stmt) {
99
+ void BreakableStatementChecker::VisitExitContextStatement(
100
+ ExitContextStatement* stmt) {
101
101
  }
102
102
 
103
103
 
@@ -187,11 +187,6 @@ void BreakableStatementChecker::VisitArrayLiteral(ArrayLiteral* expr) {
187
187
  }
188
188
 
189
189
 
190
- void BreakableStatementChecker::VisitCatchExtensionObject(
191
- CatchExtensionObject* expr) {
192
- }
193
-
194
-
195
190
  void BreakableStatementChecker::VisitAssignment(Assignment* expr) {
196
191
  // If assigning to a property (including a global property) the assignment is
197
192
  // breakable.
@@ -247,7 +242,10 @@ void BreakableStatementChecker::VisitCountOperation(CountOperation* expr) {
247
242
 
248
243
  void BreakableStatementChecker::VisitBinaryOperation(BinaryOperation* expr) {
249
244
  Visit(expr->left());
250
- Visit(expr->right());
245
+ if (expr->op() != Token::AND &&
246
+ expr->op() != Token::OR) {
247
+ Visit(expr->right());
248
+ }
251
249
  }
252
250
 
253
251
 
@@ -319,7 +317,6 @@ unsigned FullCodeGenerator::EmitStackCheckTable() {
319
317
  // field, and then a sequence of entries. Each entry is a pair of AST id
320
318
  // and code-relative pc offset.
321
319
  masm()->Align(kIntSize);
322
- masm()->RecordComment("[ Stack check table");
323
320
  unsigned offset = masm()->pc_offset();
324
321
  unsigned length = stack_checks_.length();
325
322
  __ dd(length);
@@ -327,7 +324,6 @@ unsigned FullCodeGenerator::EmitStackCheckTable() {
327
324
  __ dd(stack_checks_[i].id);
328
325
  __ dd(stack_checks_[i].pc_and_state);
329
326
  }
330
- masm()->RecordComment("]");
331
327
  return offset;
332
328
  }
333
329
 
@@ -348,7 +344,7 @@ void FullCodeGenerator::PopulateDeoptimizationData(Handle<Code> code) {
348
344
  }
349
345
 
350
346
 
351
- void FullCodeGenerator::PrepareForBailout(AstNode* node, State state) {
347
+ void FullCodeGenerator::PrepareForBailout(Expression* node, State state) {
352
348
  PrepareForBailoutForId(node->id(), state);
353
349
  }
354
350
 
@@ -406,7 +402,7 @@ int FullCodeGenerator::SlotOffset(Slot* slot) {
406
402
  // Adjust by a (parameter or local) base offset.
407
403
  switch (slot->type()) {
408
404
  case Slot::PARAMETER:
409
- offset += (scope()->num_parameters() + 1) * kPointerSize;
405
+ offset += (info_->scope()->num_parameters() + 1) * kPointerSize;
410
406
  break;
411
407
  case Slot::LOCAL:
412
408
  offset += JavaScriptFrameConstants::kLocal0Offset;
@@ -439,6 +435,7 @@ void FullCodeGenerator::AccumulatorValueContext::Plug(Register reg) const {
439
435
 
440
436
  void FullCodeGenerator::StackValueContext::Plug(Register reg) const {
441
437
  __ push(reg);
438
+ codegen()->increment_stack_height();
442
439
  }
443
440
 
444
441
 
@@ -446,17 +443,19 @@ void FullCodeGenerator::TestContext::Plug(Register reg) const {
446
443
  // For simplicity we always test the accumulator register.
447
444
  __ Move(result_register(), reg);
448
445
  codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
449
- codegen()->DoTest(true_label_, false_label_, fall_through_);
446
+ codegen()->DoTest(this);
450
447
  }
451
448
 
452
449
 
453
450
  void FullCodeGenerator::EffectContext::PlugTOS() const {
454
451
  __ Drop(1);
452
+ codegen()->decrement_stack_height();
455
453
  }
456
454
 
457
455
 
458
456
  void FullCodeGenerator::AccumulatorValueContext::PlugTOS() const {
459
457
  __ pop(result_register());
458
+ codegen()->decrement_stack_height();
460
459
  }
461
460
 
462
461
 
@@ -467,8 +466,9 @@ void FullCodeGenerator::StackValueContext::PlugTOS() const {
467
466
  void FullCodeGenerator::TestContext::PlugTOS() const {
468
467
  // For simplicity we always test the accumulator register.
469
468
  __ pop(result_register());
469
+ codegen()->decrement_stack_height();
470
470
  codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
471
- codegen()->DoTest(true_label_, false_label_, fall_through_);
471
+ codegen()->DoTest(this);
472
472
  }
473
473
 
474
474
 
@@ -518,6 +518,14 @@ void FullCodeGenerator::TestContext::PrepareTest(
518
518
  }
519
519
 
520
520
 
521
+ void FullCodeGenerator::DoTest(const TestContext* context) {
522
+ DoTest(context->condition(),
523
+ context->true_label(),
524
+ context->false_label(),
525
+ context->fall_through());
526
+ }
527
+
528
+
521
529
  void FullCodeGenerator::VisitDeclarations(
522
530
  ZoneList<Declaration*>* declarations) {
523
531
  int length = declarations->length();
@@ -577,88 +585,78 @@ void FullCodeGenerator::VisitDeclarations(
577
585
 
578
586
 
579
587
  void FullCodeGenerator::SetFunctionPosition(FunctionLiteral* fun) {
580
- if (FLAG_debug_info) {
581
- CodeGenerator::RecordPositions(masm_, fun->start_position());
582
- }
588
+ CodeGenerator::RecordPositions(masm_, fun->start_position());
583
589
  }
584
590
 
585
591
 
586
592
  void FullCodeGenerator::SetReturnPosition(FunctionLiteral* fun) {
587
- if (FLAG_debug_info) {
588
- CodeGenerator::RecordPositions(masm_, fun->end_position() - 1);
589
- }
593
+ CodeGenerator::RecordPositions(masm_, fun->end_position() - 1);
590
594
  }
591
595
 
592
596
 
593
597
  void FullCodeGenerator::SetStatementPosition(Statement* stmt) {
594
- if (FLAG_debug_info) {
595
598
  #ifdef ENABLE_DEBUGGER_SUPPORT
596
- if (!isolate()->debugger()->IsDebuggerActive()) {
597
- CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
598
- } else {
599
- // Check if the statement will be breakable without adding a debug break
600
- // slot.
601
- BreakableStatementChecker checker;
602
- checker.Check(stmt);
603
- // Record the statement position right here if the statement is not
604
- // breakable. For breakable statements the actual recording of the
605
- // position will be postponed to the breakable code (typically an IC).
606
- bool position_recorded = CodeGenerator::RecordPositions(
607
- masm_, stmt->statement_pos(), !checker.is_breakable());
608
- // If the position recording did record a new position generate a debug
609
- // break slot to make the statement breakable.
610
- if (position_recorded) {
611
- Debug::GenerateSlot(masm_);
612
- }
599
+ if (!isolate()->debugger()->IsDebuggerActive()) {
600
+ CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
601
+ } else {
602
+ // Check if the statement will be breakable without adding a debug break
603
+ // slot.
604
+ BreakableStatementChecker checker;
605
+ checker.Check(stmt);
606
+ // Record the statement position right here if the statement is not
607
+ // breakable. For breakable statements the actual recording of the
608
+ // position will be postponed to the breakable code (typically an IC).
609
+ bool position_recorded = CodeGenerator::RecordPositions(
610
+ masm_, stmt->statement_pos(), !checker.is_breakable());
611
+ // If the position recording did record a new position generate a debug
612
+ // break slot to make the statement breakable.
613
+ if (position_recorded) {
614
+ Debug::GenerateSlot(masm_);
613
615
  }
616
+ }
614
617
  #else
615
- CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
618
+ CodeGenerator::RecordPositions(masm_, stmt->statement_pos());
616
619
  #endif
617
- }
618
620
  }
619
621
 
620
622
 
621
623
  void FullCodeGenerator::SetExpressionPosition(Expression* expr, int pos) {
622
- if (FLAG_debug_info) {
623
624
  #ifdef ENABLE_DEBUGGER_SUPPORT
624
- if (!isolate()->debugger()->IsDebuggerActive()) {
625
- CodeGenerator::RecordPositions(masm_, pos);
626
- } else {
627
- // Check if the expression will be breakable without adding a debug break
628
- // slot.
629
- BreakableStatementChecker checker;
630
- checker.Check(expr);
631
- // Record a statement position right here if the expression is not
632
- // breakable. For breakable expressions the actual recording of the
633
- // position will be postponed to the breakable code (typically an IC).
634
- // NOTE this will record a statement position for something which might
635
- // not be a statement. As stepping in the debugger will only stop at
636
- // statement positions this is used for e.g. the condition expression of
637
- // a do while loop.
638
- bool position_recorded = CodeGenerator::RecordPositions(
639
- masm_, pos, !checker.is_breakable());
640
- // If the position recording did record a new position generate a debug
641
- // break slot to make the statement breakable.
642
- if (position_recorded) {
643
- Debug::GenerateSlot(masm_);
644
- }
625
+ if (!isolate()->debugger()->IsDebuggerActive()) {
626
+ CodeGenerator::RecordPositions(masm_, pos);
627
+ } else {
628
+ // Check if the expression will be breakable without adding a debug break
629
+ // slot.
630
+ BreakableStatementChecker checker;
631
+ checker.Check(expr);
632
+ // Record a statement position right here if the expression is not
633
+ // breakable. For breakable expressions the actual recording of the
634
+ // position will be postponed to the breakable code (typically an IC).
635
+ // NOTE this will record a statement position for something which might
636
+ // not be a statement. As stepping in the debugger will only stop at
637
+ // statement positions this is used for e.g. the condition expression of
638
+ // a do while loop.
639
+ bool position_recorded = CodeGenerator::RecordPositions(
640
+ masm_, pos, !checker.is_breakable());
641
+ // If the position recording did record a new position generate a debug
642
+ // break slot to make the statement breakable.
643
+ if (position_recorded) {
644
+ Debug::GenerateSlot(masm_);
645
645
  }
646
+ }
646
647
  #else
647
- CodeGenerator::RecordPositions(masm_, pos);
648
+ CodeGenerator::RecordPositions(masm_, pos);
648
649
  #endif
649
- }
650
650
  }
651
651
 
652
652
 
653
653
  void FullCodeGenerator::SetStatementPosition(int pos) {
654
- if (FLAG_debug_info) {
655
- CodeGenerator::RecordPositions(masm_, pos);
656
- }
654
+ CodeGenerator::RecordPositions(masm_, pos);
657
655
  }
658
656
 
659
657
 
660
658
  void FullCodeGenerator::SetSourcePosition(int pos) {
661
- if (FLAG_debug_info && pos != RelocInfo::kNoPosition) {
659
+ if (pos != RelocInfo::kNoPosition) {
662
660
  masm_->positions_recorder()->RecordPosition(pos);
663
661
  }
664
662
  }
@@ -690,7 +688,6 @@ FullCodeGenerator::InlineFunctionGenerator
690
688
 
691
689
  void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
692
690
  ZoneList<Expression*>* args = node->arguments();
693
- Handle<String> name = node->name();
694
691
  const Runtime::Function* function = node->function();
695
692
  ASSERT(function != NULL);
696
693
  ASSERT(function->intrinsic_type == Runtime::INLINE);
@@ -701,143 +698,116 @@ void FullCodeGenerator::EmitInlineRuntimeCall(CallRuntime* node) {
701
698
 
702
699
 
703
700
  void FullCodeGenerator::VisitBinaryOperation(BinaryOperation* expr) {
704
- Comment cmnt(masm_, "[ BinaryOperation");
705
- Token::Value op = expr->op();
706
- Expression* left = expr->left();
707
- Expression* right = expr->right();
708
-
709
- OverwriteMode mode = NO_OVERWRITE;
710
- if (left->ResultOverwriteAllowed()) {
711
- mode = OVERWRITE_LEFT;
712
- } else if (right->ResultOverwriteAllowed()) {
713
- mode = OVERWRITE_RIGHT;
714
- }
715
-
716
- switch (op) {
701
+ switch (expr->op()) {
717
702
  case Token::COMMA:
718
- VisitForEffect(left);
719
- if (context()->IsTest()) ForwardBailoutToChild(expr);
720
- context()->HandleExpression(right);
721
- break;
722
-
703
+ return VisitComma(expr);
723
704
  case Token::OR:
724
705
  case Token::AND:
725
- EmitLogicalOperation(expr);
726
- break;
727
-
728
- case Token::ADD:
729
- case Token::SUB:
730
- case Token::DIV:
731
- case Token::MOD:
732
- case Token::MUL:
733
- case Token::BIT_OR:
734
- case Token::BIT_AND:
735
- case Token::BIT_XOR:
736
- case Token::SHL:
737
- case Token::SHR:
738
- case Token::SAR: {
739
- // Load both operands.
740
- VisitForStackValue(left);
741
- VisitForAccumulatorValue(right);
742
-
743
- SetSourcePosition(expr->position());
744
- if (ShouldInlineSmiCase(op)) {
745
- EmitInlineSmiBinaryOp(expr, op, mode, left, right);
746
- } else {
747
- EmitBinaryOp(expr, op, mode);
748
- }
749
- break;
750
- }
751
-
706
+ return VisitLogicalExpression(expr);
752
707
  default:
753
- UNREACHABLE();
708
+ return VisitArithmeticExpression(expr);
754
709
  }
755
710
  }
756
711
 
757
712
 
758
- void FullCodeGenerator::EmitLogicalOperation(BinaryOperation* expr) {
759
- Label eval_right, done;
760
-
761
- context()->EmitLogicalLeft(expr, &eval_right, &done);
762
-
763
- PrepareForBailoutForId(expr->RightId(), NO_REGISTERS);
764
- __ bind(&eval_right);
713
+ void FullCodeGenerator::VisitComma(BinaryOperation* expr) {
714
+ Comment cmnt(masm_, "[ Comma");
715
+ VisitForEffect(expr->left());
765
716
  if (context()->IsTest()) ForwardBailoutToChild(expr);
766
- context()->HandleExpression(expr->right());
767
-
768
- __ bind(&done);
717
+ VisitInCurrentContext(expr->right());
769
718
  }
770
719
 
771
720
 
772
- void FullCodeGenerator::EffectContext::EmitLogicalLeft(BinaryOperation* expr,
773
- Label* eval_right,
774
- Label* done) const {
775
- if (expr->op() == Token::OR) {
776
- codegen()->VisitForControl(expr->left(), done, eval_right, eval_right);
777
- } else {
778
- ASSERT(expr->op() == Token::AND);
779
- codegen()->VisitForControl(expr->left(), eval_right, done, eval_right);
780
- }
781
- }
721
+ void FullCodeGenerator::VisitLogicalExpression(BinaryOperation* expr) {
722
+ bool is_logical_and = expr->op() == Token::AND;
723
+ Comment cmnt(masm_, is_logical_and ? "[ Logical AND" : "[ Logical OR");
724
+ Expression* left = expr->left();
725
+ Expression* right = expr->right();
726
+ int right_id = expr->RightId();
727
+ Label done;
782
728
 
729
+ if (context()->IsTest()) {
730
+ Label eval_right;
731
+ const TestContext* test = TestContext::cast(context());
732
+ if (is_logical_and) {
733
+ VisitForControl(left, &eval_right, test->false_label(), &eval_right);
734
+ } else {
735
+ VisitForControl(left, test->true_label(), &eval_right, &eval_right);
736
+ }
737
+ PrepareForBailoutForId(right_id, NO_REGISTERS);
738
+ __ bind(&eval_right);
739
+ ForwardBailoutToChild(expr);
740
+
741
+ } else if (context()->IsAccumulatorValue()) {
742
+ VisitForAccumulatorValue(left);
743
+ // We want the value in the accumulator for the test, and on the stack in
744
+ // case we need it.
745
+ __ push(result_register());
746
+ Label discard, restore;
747
+ PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
748
+ if (is_logical_and) {
749
+ DoTest(left, &discard, &restore, &restore);
750
+ } else {
751
+ DoTest(left, &restore, &discard, &restore);
752
+ }
753
+ __ bind(&restore);
754
+ __ pop(result_register());
755
+ __ jmp(&done);
756
+ __ bind(&discard);
757
+ __ Drop(1);
758
+ PrepareForBailoutForId(right_id, NO_REGISTERS);
759
+
760
+ } else if (context()->IsStackValue()) {
761
+ VisitForAccumulatorValue(left);
762
+ // We want the value in the accumulator for the test, and on the stack in
763
+ // case we need it.
764
+ __ push(result_register());
765
+ Label discard;
766
+ PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
767
+ if (is_logical_and) {
768
+ DoTest(left, &discard, &done, &discard);
769
+ } else {
770
+ DoTest(left, &done, &discard, &discard);
771
+ }
772
+ __ bind(&discard);
773
+ __ Drop(1);
774
+ PrepareForBailoutForId(right_id, NO_REGISTERS);
783
775
 
784
- void FullCodeGenerator::AccumulatorValueContext::EmitLogicalLeft(
785
- BinaryOperation* expr,
786
- Label* eval_right,
787
- Label* done) const {
788
- HandleExpression(expr->left());
789
- // We want the value in the accumulator for the test, and on the stack in case
790
- // we need it.
791
- __ push(result_register());
792
- Label discard, restore;
793
- if (expr->op() == Token::OR) {
794
- codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
795
- codegen()->DoTest(&restore, &discard, &restore);
796
776
  } else {
797
- ASSERT(expr->op() == Token::AND);
798
- codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
799
- codegen()->DoTest(&discard, &restore, &restore);
777
+ ASSERT(context()->IsEffect());
778
+ Label eval_right;
779
+ if (is_logical_and) {
780
+ VisitForControl(left, &eval_right, &done, &eval_right);
781
+ } else {
782
+ VisitForControl(left, &done, &eval_right, &eval_right);
783
+ }
784
+ PrepareForBailoutForId(right_id, NO_REGISTERS);
785
+ __ bind(&eval_right);
800
786
  }
801
- __ bind(&restore);
802
- __ pop(result_register());
803
- __ jmp(done);
804
- __ bind(&discard);
805
- __ Drop(1);
787
+
788
+ VisitInCurrentContext(right);
789
+ __ bind(&done);
806
790
  }
807
791
 
808
792
 
809
- void FullCodeGenerator::StackValueContext::EmitLogicalLeft(
810
- BinaryOperation* expr,
811
- Label* eval_right,
812
- Label* done) const {
813
- codegen()->VisitForAccumulatorValue(expr->left());
814
- // We want the value in the accumulator for the test, and on the stack in case
815
- // we need it.
816
- __ push(result_register());
817
- Label discard;
818
- if (expr->op() == Token::OR) {
819
- codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
820
- codegen()->DoTest(done, &discard, &discard);
821
- } else {
822
- ASSERT(expr->op() == Token::AND);
823
- codegen()->PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
824
- codegen()->DoTest(&discard, done, &discard);
825
- }
826
- __ bind(&discard);
827
- __ Drop(1);
828
- }
793
+ void FullCodeGenerator::VisitArithmeticExpression(BinaryOperation* expr) {
794
+ Token::Value op = expr->op();
795
+ Comment cmnt(masm_, "[ ArithmeticExpression");
796
+ Expression* left = expr->left();
797
+ Expression* right = expr->right();
798
+ OverwriteMode mode =
799
+ left->ResultOverwriteAllowed()
800
+ ? OVERWRITE_LEFT
801
+ : (right->ResultOverwriteAllowed() ? OVERWRITE_RIGHT : NO_OVERWRITE);
829
802
 
803
+ VisitForStackValue(left);
804
+ VisitForAccumulatorValue(right);
830
805
 
831
- void FullCodeGenerator::TestContext::EmitLogicalLeft(BinaryOperation* expr,
832
- Label* eval_right,
833
- Label* done) const {
834
- if (expr->op() == Token::OR) {
835
- codegen()->VisitForControl(expr->left(),
836
- true_label_, eval_right, eval_right);
806
+ SetSourcePosition(expr->position());
807
+ if (ShouldInlineSmiCase(op)) {
808
+ EmitInlineSmiBinaryOp(expr, op, mode, left, right);
837
809
  } else {
838
- ASSERT(expr->op() == Token::AND);
839
- codegen()->VisitForControl(expr->left(),
840
- eval_right, false_label_, eval_right);
810
+ EmitBinaryOp(expr, op, mode);
841
811
  }
842
812
  }
843
813
 
@@ -850,46 +820,23 @@ void FullCodeGenerator::ForwardBailoutToChild(Expression* expr) {
850
820
  }
851
821
 
852
822
 
853
- void FullCodeGenerator::EffectContext::HandleExpression(
854
- Expression* expr) const {
855
- codegen()->HandleInNonTestContext(expr, NO_REGISTERS);
856
- }
857
-
858
-
859
- void FullCodeGenerator::AccumulatorValueContext::HandleExpression(
860
- Expression* expr) const {
861
- codegen()->HandleInNonTestContext(expr, TOS_REG);
862
- }
863
-
864
-
865
- void FullCodeGenerator::StackValueContext::HandleExpression(
866
- Expression* expr) const {
867
- codegen()->HandleInNonTestContext(expr, NO_REGISTERS);
868
- }
869
-
870
-
871
- void FullCodeGenerator::TestContext::HandleExpression(Expression* expr) const {
872
- codegen()->VisitInTestContext(expr);
873
- }
874
-
875
-
876
- void FullCodeGenerator::HandleInNonTestContext(Expression* expr, State state) {
877
- ASSERT(forward_bailout_pending_ == NULL);
878
- AstVisitor::Visit(expr);
879
- PrepareForBailout(expr, state);
880
- // Forwarding bailouts to children is a one shot operation. It
881
- // should have been processed at this point.
882
- ASSERT(forward_bailout_pending_ == NULL);
883
- }
884
-
885
-
886
- void FullCodeGenerator::VisitInTestContext(Expression* expr) {
887
- ForwardBailoutStack stack(expr, forward_bailout_pending_);
888
- ForwardBailoutStack* saved = forward_bailout_stack_;
889
- forward_bailout_pending_ = NULL;
890
- forward_bailout_stack_ = &stack;
891
- AstVisitor::Visit(expr);
892
- forward_bailout_stack_ = saved;
823
+ void FullCodeGenerator::VisitInCurrentContext(Expression* expr) {
824
+ if (context()->IsTest()) {
825
+ ForwardBailoutStack stack(expr, forward_bailout_pending_);
826
+ ForwardBailoutStack* saved = forward_bailout_stack_;
827
+ forward_bailout_pending_ = NULL;
828
+ forward_bailout_stack_ = &stack;
829
+ Visit(expr);
830
+ forward_bailout_stack_ = saved;
831
+ } else {
832
+ ASSERT(forward_bailout_pending_ == NULL);
833
+ Visit(expr);
834
+ State state = context()->IsAccumulatorValue() ? TOS_REG : NO_REGISTERS;
835
+ PrepareForBailout(expr, state);
836
+ // Forwarding bailouts to children is a one shot operation. It should have
837
+ // been processed at this point.
838
+ ASSERT(forward_bailout_pending_ == NULL);
839
+ }
893
840
  }
894
841
 
895
842
 
@@ -898,9 +845,24 @@ void FullCodeGenerator::VisitBlock(Block* stmt) {
898
845
  Breakable nested_statement(this, stmt);
899
846
  SetStatementPosition(stmt);
900
847
 
848
+ Scope* saved_scope = scope();
849
+ if (stmt->block_scope() != NULL) {
850
+ { Comment cmnt(masm_, "[ Extend block context");
851
+ scope_ = stmt->block_scope();
852
+ __ Push(scope_->GetSerializedScopeInfo());
853
+ PushFunctionArgumentForContextAllocation();
854
+ __ CallRuntime(Runtime::kPushBlockContext, 2);
855
+ StoreToFrameField(StandardFrameConstants::kContextOffset,
856
+ context_register());
857
+ }
858
+ { Comment cmnt(masm_, "[ Declarations");
859
+ VisitDeclarations(scope_->declarations());
860
+ }
861
+ }
901
862
  PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS);
902
863
  VisitStatements(stmt->statements());
903
- __ bind(nested_statement.break_target());
864
+ scope_ = saved_scope;
865
+ __ bind(nested_statement.break_label());
904
866
  PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
905
867
  }
906
868
 
@@ -942,7 +904,7 @@ void FullCodeGenerator::VisitIfStatement(IfStatement* stmt) {
942
904
  PrepareForBailoutForId(stmt->ElseId(), NO_REGISTERS);
943
905
  }
944
906
  __ bind(&done);
945
- PrepareForBailoutForId(stmt->id(), NO_REGISTERS);
907
+ PrepareForBailoutForId(stmt->IfId(), NO_REGISTERS);
946
908
  }
947
909
 
948
910
 
@@ -951,19 +913,26 @@ void FullCodeGenerator::VisitContinueStatement(ContinueStatement* stmt) {
951
913
  SetStatementPosition(stmt);
952
914
  NestedStatement* current = nesting_stack_;
953
915
  int stack_depth = 0;
916
+ int context_length = 0;
954
917
  // When continuing, we clobber the unpredictable value in the accumulator
955
918
  // with one that's safe for GC. If we hit an exit from the try block of
956
919
  // try...finally on our way out, we will unconditionally preserve the
957
920
  // accumulator on the stack.
958
921
  ClearAccumulator();
959
922
  while (!current->IsContinueTarget(stmt->target())) {
960
- stack_depth = current->Exit(stack_depth);
961
- current = current->outer();
923
+ current = current->Exit(&stack_depth, &context_length);
962
924
  }
963
925
  __ Drop(stack_depth);
926
+ if (context_length > 0) {
927
+ while (context_length > 0) {
928
+ LoadContextField(context_register(), Context::PREVIOUS_INDEX);
929
+ --context_length;
930
+ }
931
+ StoreToFrameField(StandardFrameConstants::kContextOffset,
932
+ context_register());
933
+ }
964
934
 
965
- Iteration* loop = current->AsIteration();
966
- __ jmp(loop->continue_target());
935
+ __ jmp(current->AsIteration()->continue_label());
967
936
  }
968
937
 
969
938
 
@@ -972,19 +941,26 @@ void FullCodeGenerator::VisitBreakStatement(BreakStatement* stmt) {
972
941
  SetStatementPosition(stmt);
973
942
  NestedStatement* current = nesting_stack_;
974
943
  int stack_depth = 0;
944
+ int context_length = 0;
975
945
  // When breaking, we clobber the unpredictable value in the accumulator
976
946
  // with one that's safe for GC. If we hit an exit from the try block of
977
947
  // try...finally on our way out, we will unconditionally preserve the
978
948
  // accumulator on the stack.
979
949
  ClearAccumulator();
980
950
  while (!current->IsBreakTarget(stmt->target())) {
981
- stack_depth = current->Exit(stack_depth);
982
- current = current->outer();
951
+ current = current->Exit(&stack_depth, &context_length);
983
952
  }
984
953
  __ Drop(stack_depth);
954
+ if (context_length > 0) {
955
+ while (context_length > 0) {
956
+ LoadContextField(context_register(), Context::PREVIOUS_INDEX);
957
+ --context_length;
958
+ }
959
+ StoreToFrameField(StandardFrameConstants::kContextOffset,
960
+ context_register());
961
+ }
985
962
 
986
- Breakable* target = current->AsBreakable();
987
- __ jmp(target->break_target());
963
+ __ jmp(current->AsBreakable()->break_label());
988
964
  }
989
965
 
990
966
 
@@ -997,9 +973,9 @@ void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
997
973
  // Exit all nested statements.
998
974
  NestedStatement* current = nesting_stack_;
999
975
  int stack_depth = 0;
976
+ int context_length = 0;
1000
977
  while (current != NULL) {
1001
- stack_depth = current->Exit(stack_depth);
1002
- current = current->outer();
978
+ current = current->Exit(&stack_depth, &context_length);
1003
979
  }
1004
980
  __ Drop(stack_depth);
1005
981
 
@@ -1007,26 +983,29 @@ void FullCodeGenerator::VisitReturnStatement(ReturnStatement* stmt) {
1007
983
  }
1008
984
 
1009
985
 
1010
- void FullCodeGenerator::VisitWithEnterStatement(WithEnterStatement* stmt) {
1011
- Comment cmnt(masm_, "[ WithEnterStatement");
986
+ void FullCodeGenerator::VisitWithStatement(WithStatement* stmt) {
987
+ Comment cmnt(masm_, "[ WithStatement");
1012
988
  SetStatementPosition(stmt);
1013
989
 
1014
990
  VisitForStackValue(stmt->expression());
1015
- if (stmt->is_catch_block()) {
1016
- __ CallRuntime(Runtime::kPushCatchContext, 1);
1017
- } else {
1018
- __ CallRuntime(Runtime::kPushContext, 1);
991
+ PushFunctionArgumentForContextAllocation();
992
+ __ CallRuntime(Runtime::kPushWithContext, 2);
993
+ decrement_stack_height();
994
+ StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
995
+
996
+ { WithOrCatch body(this);
997
+ Visit(stmt->statement());
1019
998
  }
1020
- // Both runtime calls return the new context in both the context and the
1021
- // result registers.
1022
999
 
1000
+ // Pop context.
1001
+ LoadContextField(context_register(), Context::PREVIOUS_INDEX);
1023
1002
  // Update local stack frame context field.
1024
1003
  StoreToFrameField(StandardFrameConstants::kContextOffset, context_register());
1025
1004
  }
1026
1005
 
1027
1006
 
1028
- void FullCodeGenerator::VisitWithExitStatement(WithExitStatement* stmt) {
1029
- Comment cmnt(masm_, "[ WithExitStatement");
1007
+ void FullCodeGenerator::VisitExitContextStatement(ExitContextStatement* stmt) {
1008
+ Comment cmnt(masm_, "[ ExitContextStatement");
1030
1009
  SetStatementPosition(stmt);
1031
1010
 
1032
1011
  // Pop context.
@@ -1049,12 +1028,12 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) {
1049
1028
 
1050
1029
  // Record the position of the do while condition and make sure it is
1051
1030
  // possible to break on the condition.
1052
- __ bind(loop_statement.continue_target());
1031
+ __ bind(loop_statement.continue_label());
1053
1032
  PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
1054
1033
  SetExpressionPosition(stmt->cond(), stmt->condition_position());
1055
1034
  VisitForControl(stmt->cond(),
1056
1035
  &stack_check,
1057
- loop_statement.break_target(),
1036
+ loop_statement.break_label(),
1058
1037
  &stack_check);
1059
1038
 
1060
1039
  // Check stack before looping.
@@ -1064,7 +1043,7 @@ void FullCodeGenerator::VisitDoWhileStatement(DoWhileStatement* stmt) {
1064
1043
  __ jmp(&body);
1065
1044
 
1066
1045
  PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1067
- __ bind(loop_statement.break_target());
1046
+ __ bind(loop_statement.break_label());
1068
1047
  decrement_loop_depth();
1069
1048
  }
1070
1049
 
@@ -1085,7 +1064,7 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) {
1085
1064
 
1086
1065
  // Emit the statement position here as this is where the while
1087
1066
  // statement code starts.
1088
- __ bind(loop_statement.continue_target());
1067
+ __ bind(loop_statement.continue_label());
1089
1068
  SetStatementPosition(stmt);
1090
1069
 
1091
1070
  // Check stack before looping.
@@ -1094,11 +1073,11 @@ void FullCodeGenerator::VisitWhileStatement(WhileStatement* stmt) {
1094
1073
  __ bind(&test);
1095
1074
  VisitForControl(stmt->cond(),
1096
1075
  &body,
1097
- loop_statement.break_target(),
1098
- loop_statement.break_target());
1076
+ loop_statement.break_label(),
1077
+ loop_statement.break_label());
1099
1078
 
1100
1079
  PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1101
- __ bind(loop_statement.break_target());
1080
+ __ bind(loop_statement.break_label());
1102
1081
  decrement_loop_depth();
1103
1082
  }
1104
1083
 
@@ -1121,7 +1100,7 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
1121
1100
  Visit(stmt->body());
1122
1101
 
1123
1102
  PrepareForBailoutForId(stmt->ContinueId(), NO_REGISTERS);
1124
- __ bind(loop_statement.continue_target());
1103
+ __ bind(loop_statement.continue_label());
1125
1104
  SetStatementPosition(stmt);
1126
1105
  if (stmt->next() != NULL) {
1127
1106
  Visit(stmt->next());
@@ -1138,14 +1117,14 @@ void FullCodeGenerator::VisitForStatement(ForStatement* stmt) {
1138
1117
  if (stmt->cond() != NULL) {
1139
1118
  VisitForControl(stmt->cond(),
1140
1119
  &body,
1141
- loop_statement.break_target(),
1142
- loop_statement.break_target());
1120
+ loop_statement.break_label(),
1121
+ loop_statement.break_label());
1143
1122
  } else {
1144
1123
  __ jmp(&body);
1145
1124
  }
1146
1125
 
1147
1126
  PrepareForBailoutForId(stmt->ExitId(), NO_REGISTERS);
1148
- __ bind(loop_statement.break_target());
1127
+ __ bind(loop_statement.break_label());
1149
1128
  decrement_loop_depth();
1150
1129
  }
1151
1130
 
@@ -1163,31 +1142,39 @@ void FullCodeGenerator::VisitTryCatchStatement(TryCatchStatement* stmt) {
1163
1142
  // to introduce a new scope to bind the catch variable and to remove
1164
1143
  // that scope again afterwards.
1165
1144
 
1166
- Label try_handler_setup, catch_entry, done;
1145
+ Label try_handler_setup, done;
1167
1146
  __ Call(&try_handler_setup);
1168
1147
  // Try handler code, exception in result register.
1169
1148
 
1170
- // Store exception in local .catch variable before executing catch block.
1171
- {
1172
- // The catch variable is *always* a variable proxy for a local variable.
1173
- Variable* catch_var = stmt->catch_var()->AsVariableProxy()->AsVariable();
1174
- ASSERT_NOT_NULL(catch_var);
1175
- Slot* variable_slot = catch_var->AsSlot();
1176
- ASSERT_NOT_NULL(variable_slot);
1177
- ASSERT_EQ(Slot::LOCAL, variable_slot->type());
1178
- StoreToFrameField(SlotOffset(variable_slot), result_register());
1149
+ // Extend the context before executing the catch block.
1150
+ { Comment cmnt(masm_, "[ Extend catch context");
1151
+ __ Push(stmt->variable()->name());
1152
+ __ push(result_register());
1153
+ PushFunctionArgumentForContextAllocation();
1154
+ __ CallRuntime(Runtime::kPushCatchContext, 3);
1155
+ StoreToFrameField(StandardFrameConstants::kContextOffset,
1156
+ context_register());
1179
1157
  }
1180
1158
 
1181
- Visit(stmt->catch_block());
1159
+ Scope* saved_scope = scope();
1160
+ scope_ = stmt->scope();
1161
+ ASSERT(scope_->declarations()->is_empty());
1162
+ { WithOrCatch body(this);
1163
+ Visit(stmt->catch_block());
1164
+ }
1165
+ scope_ = saved_scope;
1182
1166
  __ jmp(&done);
1183
1167
 
1184
1168
  // Try block code. Sets up the exception handler chain.
1185
1169
  __ bind(&try_handler_setup);
1186
1170
  {
1187
- TryCatch try_block(this, &catch_entry);
1171
+ const int delta = StackHandlerConstants::kSize / kPointerSize;
1172
+ TryCatch try_block(this);
1188
1173
  __ PushTryHandler(IN_JAVASCRIPT, TRY_CATCH_HANDLER);
1174
+ increment_stack_height(delta);
1189
1175
  Visit(stmt->try_block());
1190
1176
  __ PopTryHandler();
1177
+ decrement_stack_height(delta);
1191
1178
  }
1192
1179
  __ bind(&done);
1193
1180
  }
@@ -1219,6 +1206,7 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
1219
1206
  // cooked before GC.
1220
1207
  Label finally_entry;
1221
1208
  Label try_handler_setup;
1209
+ const int original_stack_height = stack_height();
1222
1210
 
1223
1211
  // Setup the try-handler chain. Use a call to
1224
1212
  // Jump to try-handler setup and try-block code. Use call to put try-handler
@@ -1227,9 +1215,9 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
1227
1215
  // Try handler code. Return address of call is pushed on handler stack.
1228
1216
  {
1229
1217
  // This code is only executed during stack-handler traversal when an
1230
- // exception is thrown. The execption is in the result register, which
1218
+ // exception is thrown. The exception is in the result register, which
1231
1219
  // is retained by the finally block.
1232
- // Call the finally block and then rethrow the exception.
1220
+ // Call the finally block and then rethrow the exception if it returns.
1233
1221
  __ Call(&finally_entry);
1234
1222
  __ push(result_register());
1235
1223
  __ CallRuntime(Runtime::kReThrow, 1);
@@ -1240,6 +1228,7 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
1240
1228
  // Finally block implementation.
1241
1229
  Finally finally_block(this);
1242
1230
  EnterFinallyBlock();
1231
+ set_stack_height(original_stack_height + Finally::kElementCount);
1243
1232
  Visit(stmt->finally_block());
1244
1233
  ExitFinallyBlock(); // Return to the calling code.
1245
1234
  }
@@ -1247,10 +1236,13 @@ void FullCodeGenerator::VisitTryFinallyStatement(TryFinallyStatement* stmt) {
1247
1236
  __ bind(&try_handler_setup);
1248
1237
  {
1249
1238
  // Setup try handler (stack pointer registers).
1239
+ const int delta = StackHandlerConstants::kSize / kPointerSize;
1250
1240
  TryFinally try_block(this, &finally_entry);
1251
1241
  __ PushTryHandler(IN_JAVASCRIPT, TRY_FINALLY_HANDLER);
1242
+ set_stack_height(original_stack_height + delta);
1252
1243
  Visit(stmt->try_block());
1253
1244
  __ PopTryHandler();
1245
+ set_stack_height(original_stack_height);
1254
1246
  }
1255
1247
  // Execute the finally block on the way out. Clobber the unpredictable
1256
1248
  // value in the accumulator with one that's safe for GC. The finally
@@ -1280,6 +1272,7 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) {
1280
1272
  __ bind(&true_case);
1281
1273
  SetExpressionPosition(expr->then_expression(),
1282
1274
  expr->then_expression_position());
1275
+ int start_stack_height = stack_height();
1283
1276
  if (context()->IsTest()) {
1284
1277
  const TestContext* for_test = TestContext::cast(context());
1285
1278
  VisitForControl(expr->then_expression(),
@@ -1287,16 +1280,17 @@ void FullCodeGenerator::VisitConditional(Conditional* expr) {
1287
1280
  for_test->false_label(),
1288
1281
  NULL);
1289
1282
  } else {
1290
- context()->HandleExpression(expr->then_expression());
1283
+ VisitInCurrentContext(expr->then_expression());
1291
1284
  __ jmp(&done);
1292
1285
  }
1293
1286
 
1294
1287
  PrepareForBailoutForId(expr->ElseId(), NO_REGISTERS);
1295
1288
  __ bind(&false_case);
1289
+ set_stack_height(start_stack_height);
1296
1290
  if (context()->IsTest()) ForwardBailoutToChild(expr);
1297
1291
  SetExpressionPosition(expr->else_expression(),
1298
1292
  expr->else_expression_position());
1299
- context()->HandleExpression(expr->else_expression());
1293
+ VisitInCurrentContext(expr->else_expression());
1300
1294
  // If control flow falls through Visit, merge it with true case here.
1301
1295
  if (!context()->IsTest()) {
1302
1296
  __ bind(&done);
@@ -1331,40 +1325,64 @@ void FullCodeGenerator::VisitSharedFunctionInfoLiteral(
1331
1325
  }
1332
1326
 
1333
1327
 
1334
- void FullCodeGenerator::VisitCatchExtensionObject(CatchExtensionObject* expr) {
1335
- // Call runtime routine to allocate the catch extension object and
1336
- // assign the exception value to the catch variable.
1337
- Comment cmnt(masm_, "[ CatchExtensionObject");
1338
- VisitForStackValue(expr->key());
1339
- VisitForStackValue(expr->value());
1340
- // Create catch extension object.
1341
- __ CallRuntime(Runtime::kCreateCatchExtensionObject, 2);
1342
- context()->Plug(result_register());
1343
- }
1344
-
1345
-
1346
1328
  void FullCodeGenerator::VisitThrow(Throw* expr) {
1347
1329
  Comment cmnt(masm_, "[ Throw");
1330
+ // Throw has no effect on the stack height or the current expression context.
1331
+ // Usually the expression context is null, because throw is a statement.
1348
1332
  VisitForStackValue(expr->exception());
1349
1333
  __ CallRuntime(Runtime::kThrow, 1);
1334
+ decrement_stack_height();
1350
1335
  // Never returns here.
1351
1336
  }
1352
1337
 
1353
1338
 
1354
- int FullCodeGenerator::TryFinally::Exit(int stack_depth) {
1339
+ FullCodeGenerator::NestedStatement* FullCodeGenerator::TryFinally::Exit(
1340
+ int* stack_depth,
1341
+ int* context_length) {
1355
1342
  // The macros used here must preserve the result register.
1356
- __ Drop(stack_depth);
1343
+ __ Drop(*stack_depth);
1357
1344
  __ PopTryHandler();
1345
+ *stack_depth = 0;
1346
+
1347
+ Register context = FullCodeGenerator::context_register();
1348
+ while (*context_length > 0) {
1349
+ codegen_->LoadContextField(context, Context::PREVIOUS_INDEX);
1350
+ --(*context_length);
1351
+ }
1352
+
1358
1353
  __ Call(finally_entry_);
1359
- return 0;
1354
+ return previous_;
1360
1355
  }
1361
1356
 
1362
1357
 
1363
- int FullCodeGenerator::TryCatch::Exit(int stack_depth) {
1358
+ FullCodeGenerator::NestedStatement* FullCodeGenerator::TryCatch::Exit(
1359
+ int* stack_depth,
1360
+ int* context_length) {
1364
1361
  // The macros used here must preserve the result register.
1365
- __ Drop(stack_depth);
1362
+ __ Drop(*stack_depth);
1366
1363
  __ PopTryHandler();
1367
- return 0;
1364
+ *stack_depth = 0;
1365
+ return previous_;
1366
+ }
1367
+
1368
+
1369
+ bool FullCodeGenerator::TryLiteralCompare(CompareOperation* compare,
1370
+ Label* if_true,
1371
+ Label* if_false,
1372
+ Label* fall_through) {
1373
+ Expression *expr;
1374
+ Handle<String> check;
1375
+ if (compare->IsLiteralCompareTypeof(&expr, &check)) {
1376
+ EmitLiteralCompareTypeof(expr, check, if_true, if_false, fall_through);
1377
+ return true;
1378
+ }
1379
+
1380
+ if (compare->IsLiteralCompareUndefined(&expr)) {
1381
+ EmitLiteralCompareUndefined(expr, if_true, if_false, fall_through);
1382
+ return true;
1383
+ }
1384
+
1385
+ return false;
1368
1386
  }
1369
1387
 
1370
1388