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
@@ -193,6 +193,11 @@ class MarkCompactCollector {
193
193
  inline bool is_code_flushing_enabled() const { return code_flusher_ != NULL; }
194
194
  void EnableCodeFlushing(bool enable);
195
195
 
196
+ inline Object* encountered_weak_maps() { return encountered_weak_maps_; }
197
+ inline void set_encountered_weak_maps(Object* weak_map) {
198
+ encountered_weak_maps_ = weak_map;
199
+ }
200
+
196
201
  private:
197
202
  MarkCompactCollector();
198
203
  ~MarkCompactCollector();
@@ -306,6 +311,10 @@ class MarkCompactCollector {
306
311
  // flag on the marking stack.
307
312
  void RefillMarkingStack();
308
313
 
314
+ // After reachable maps have been marked process per context object
315
+ // literal map caches removing unmarked entries.
316
+ void ProcessMapCaches();
317
+
309
318
  // Callback function for telling whether the object *p is an unmarked
310
319
  // heap object.
311
320
  static bool IsUnmarkedHeapObject(Object** p);
@@ -325,6 +334,16 @@ class MarkCompactCollector {
325
334
  // We replace them with a null descriptor, with the same key.
326
335
  void ClearNonLiveTransitions();
327
336
 
337
+ // Mark all values associated with reachable keys in weak maps encountered
338
+ // so far. This might push new object or even new weak maps onto the
339
+ // marking stack.
340
+ void ProcessWeakMaps();
341
+
342
+ // After all reachable objects have been marked those weak map entries
343
+ // with an unreachable key are removed from all encountered weak maps.
344
+ // The linked list of all encountered weak maps is destroyed.
345
+ void ClearWeakMaps();
346
+
328
347
  // -----------------------------------------------------------------------
329
348
  // Phase 2: Sweeping to clear mark bits and free non-live objects for
330
349
  // a non-compacting collection, or else computing and encoding
@@ -495,6 +514,7 @@ class MarkCompactCollector {
495
514
  Heap* heap_;
496
515
  MarkingStack marking_stack_;
497
516
  CodeFlusher* code_flusher_;
517
+ Object* encountered_weak_maps_;
498
518
 
499
519
  friend class Heap;
500
520
  friend class OverflowedObjectsScanner;
@@ -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:
@@ -57,11 +57,13 @@ function FormatString(format, message) {
57
57
  for (var i = 0; i < format.length; i++) {
58
58
  var str = format[i];
59
59
  for (arg_num = 0; arg_num < kReplacementMarkers.length; arg_num++) {
60
- if (format[i] !== kReplacementMarkers[arg_num]) continue;
61
- try {
62
- str = ToDetailString(args[arg_num]);
63
- } catch (e) {
64
- str = "#<error>";
60
+ if (str == kReplacementMarkers[arg_num]) {
61
+ try {
62
+ str = ToDetailString(args[arg_num]);
63
+ } catch (e) {
64
+ str = "#<error>";
65
+ }
66
+ break;
65
67
  }
66
68
  }
67
69
  result += str;
@@ -100,7 +102,8 @@ function ToStringCheckErrorObject(obj) {
100
102
 
101
103
 
102
104
  function ToDetailString(obj) {
103
- if (obj != null && IS_OBJECT(obj) && obj.toString === $Object.prototype.toString) {
105
+ if (obj != null && IS_OBJECT(obj) &&
106
+ obj.toString === $Object.prototype.toString) {
104
107
  var constructor = obj.constructor;
105
108
  if (!constructor) return ToStringCheckErrorObject(obj);
106
109
  var constructorName = constructor.name;
@@ -148,6 +151,7 @@ function FormatMessage(message) {
148
151
  unexpected_token_number: ["Unexpected number"],
149
152
  unexpected_token_string: ["Unexpected string"],
150
153
  unexpected_token_identifier: ["Unexpected identifier"],
154
+ unexpected_reserved: ["Unexpected reserved word"],
151
155
  unexpected_strict_reserved: ["Unexpected strict mode reserved word"],
152
156
  unexpected_eos: ["Unexpected end of input"],
153
157
  malformed_regexp: ["Invalid regular expression: /", "%0", "/: ", "%1"],
@@ -190,15 +194,23 @@ function FormatMessage(message) {
190
194
  proto_object_or_null: ["Object prototype may only be an Object or null"],
191
195
  property_desc_object: ["Property description must be an object: ", "%0"],
192
196
  redefine_disallowed: ["Cannot redefine property: ", "%0"],
193
- define_disallowed: ["Cannot define property, object is not extensible: ", "%0"],
197
+ define_disallowed: ["Cannot define property:", "%0", ", object is not extensible."],
194
198
  non_extensible_proto: ["%0", " is not extensible"],
199
+ handler_non_object: ["Proxy.", "%0", " called with non-object as handler"],
195
200
  handler_trap_missing: ["Proxy handler ", "%0", " has no '", "%1", "' trap"],
201
+ handler_trap_must_be_callable: ["Proxy handler ", "%0", " has non-callable '", "%1", "' trap"],
202
+ handler_returned_false: ["Proxy handler ", "%0", " returned false for '", "%1", "' trap"],
203
+ handler_returned_undefined: ["Proxy handler ", "%0", " returned undefined for '", "%1", "' trap"],
204
+ proxy_prop_not_configurable: ["Trap ", "%1", " of proxy handler ", "%0", " returned non-configurable descriptor for property ", "%2"],
205
+ proxy_non_object_prop_names: ["Trap ", "%1", " returned non-object ", "%0"],
206
+ proxy_repeated_prop_name: ["Trap ", "%1", " returned repeated property name ", "%2"],
207
+ invalid_weakmap_key: ["Invalid value used as weak map key"],
196
208
  // RangeError
197
209
  invalid_array_length: ["Invalid array length"],
198
210
  stack_overflow: ["Maximum call stack size exceeded"],
199
211
  // SyntaxError
200
212
  unable_to_parse: ["Parse error"],
201
- duplicate_regexp_flag: ["Duplicate RegExp flag ", "%0"],
213
+ invalid_regexp_flags: ["Invalid flags supplied to RegExp constructor '", "%0", "'"],
202
214
  invalid_regexp: ["Invalid RegExp pattern /", "%0", "/"],
203
215
  illegal_break: ["Illegal break statement"],
204
216
  illegal_continue: ["Illegal continue statement"],
@@ -215,6 +227,7 @@ function FormatMessage(message) {
215
227
  invalid_preparser_data: ["Invalid preparser data for function ", "%0"],
216
228
  strict_mode_with: ["Strict mode code may not include a with statement"],
217
229
  strict_catch_variable: ["Catch variable may not be eval or arguments in strict mode"],
230
+ too_many_arguments: ["Too many arguments in function call (only 32766 allowed)"],
218
231
  too_many_parameters: ["Too many parameters in function definition (only 32766 allowed)"],
219
232
  too_many_variables: ["Too many variables declared (only 32767 allowed)"],
220
233
  strict_param_name: ["Parameter name eval or arguments is not allowed in strict mode"],
@@ -237,6 +250,7 @@ function FormatMessage(message) {
237
250
  strict_cannot_assign: ["Cannot assign to read only '", "%0", "' in strict mode"],
238
251
  strict_poison_pill: ["'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them"],
239
252
  strict_caller: ["Illegal access to a strict mode caller function."],
253
+ unprotected_let: ["Illegal let declaration in unprotected statement context."],
240
254
  };
241
255
  }
242
256
  var message_type = %MessageGetType(message);
@@ -549,6 +563,7 @@ function SourceLocation(script, position, line, column, start, end) {
549
563
  this.end = end;
550
564
  }
551
565
 
566
+ SourceLocation.prototype.__proto__ = null;
552
567
 
553
568
  const kLineLengthLimit = 78;
554
569
 
@@ -638,6 +653,7 @@ function SourceSlice(script, from_line, to_line, from_position, to_position) {
638
653
  this.to_position = to_position;
639
654
  }
640
655
 
656
+ SourceSlice.prototype.__proto__ = null;
641
657
 
642
658
  /**
643
659
  * Get the source text for a SourceSlice
@@ -679,18 +695,24 @@ function DefineOneShotAccessor(obj, name, fun) {
679
695
  // can't rely on 'this' being the same as 'obj'.
680
696
  var hasBeenSet = false;
681
697
  var value;
682
- obj.__defineGetter__(name, function () {
698
+ function getter() {
683
699
  if (hasBeenSet) {
684
700
  return value;
685
701
  }
686
702
  hasBeenSet = true;
687
703
  value = fun(obj);
688
704
  return value;
689
- });
690
- obj.__defineSetter__(name, function (v) {
705
+ }
706
+ function setter(v) {
691
707
  hasBeenSet = true;
692
708
  value = v;
693
- });
709
+ }
710
+ var desc = { get: getter,
711
+ set: setter,
712
+ enumerable: false,
713
+ configurable: true };
714
+ desc = ToPropertyDescriptor(desc);
715
+ DefineOwnProperty(obj, name, desc, true);
694
716
  }
695
717
 
696
718
  function CallSite(receiver, fun, pos) {
@@ -699,23 +721,28 @@ function CallSite(receiver, fun, pos) {
699
721
  this.pos = pos;
700
722
  }
701
723
 
724
+ CallSite.prototype.__proto__ = null;
725
+
702
726
  CallSite.prototype.getThis = function () {
703
727
  return this.receiver;
704
728
  };
705
729
 
706
730
  CallSite.prototype.getTypeName = function () {
707
731
  var constructor = this.receiver.constructor;
708
- if (!constructor)
732
+ if (!constructor) {
709
733
  return %_CallFunction(this.receiver, ObjectToString);
734
+ }
710
735
  var constructorName = constructor.name;
711
- if (!constructorName)
736
+ if (!constructorName) {
712
737
  return %_CallFunction(this.receiver, ObjectToString);
738
+ }
713
739
  return constructorName;
714
740
  };
715
741
 
716
742
  CallSite.prototype.isToplevel = function () {
717
- if (this.receiver == null)
743
+ if (this.receiver == null) {
718
744
  return true;
745
+ }
719
746
  return IS_GLOBAL(this.receiver);
720
747
  };
721
748
 
@@ -748,8 +775,9 @@ CallSite.prototype.getFunctionName = function () {
748
775
  }
749
776
  // Maybe this is an evaluation?
750
777
  var script = %FunctionGetScript(this.fun);
751
- if (script && script.compilation_type == COMPILATION_TYPE_EVAL)
778
+ if (script && script.compilation_type == COMPILATION_TYPE_EVAL) {
752
779
  return "eval";
780
+ }
753
781
  return null;
754
782
  };
755
783
 
@@ -771,13 +799,15 @@ CallSite.prototype.getMethodName = function () {
771
799
  this.receiver.__lookupSetter__(prop) === this.fun ||
772
800
  (!this.receiver.__lookupGetter__(prop) && this.receiver[prop] === this.fun)) {
773
801
  // If we find more than one match bail out to avoid confusion.
774
- if (name)
802
+ if (name) {
775
803
  return null;
804
+ }
776
805
  name = prop;
777
806
  }
778
807
  }
779
- if (name)
808
+ if (name) {
780
809
  return name;
810
+ }
781
811
  return null;
782
812
  };
783
813
 
@@ -787,8 +817,9 @@ CallSite.prototype.getFileName = function () {
787
817
  };
788
818
 
789
819
  CallSite.prototype.getLineNumber = function () {
790
- if (this.pos == -1)
820
+ if (this.pos == -1) {
791
821
  return null;
822
+ }
792
823
  var script = %FunctionGetScript(this.fun);
793
824
  var location = null;
794
825
  if (script) {
@@ -798,8 +829,9 @@ CallSite.prototype.getLineNumber = function () {
798
829
  };
799
830
 
800
831
  CallSite.prototype.getColumnNumber = function () {
801
- if (this.pos == -1)
832
+ if (this.pos == -1) {
802
833
  return null;
834
+ }
803
835
  var script = %FunctionGetScript(this.fun);
804
836
  var location = null;
805
837
  if (script) {
@@ -819,15 +851,17 @@ CallSite.prototype.getPosition = function () {
819
851
 
820
852
  CallSite.prototype.isConstructor = function () {
821
853
  var constructor = this.receiver ? this.receiver.constructor : null;
822
- if (!constructor)
854
+ if (!constructor) {
823
855
  return false;
856
+ }
824
857
  return this.fun === constructor;
825
858
  };
826
859
 
827
860
  function FormatEvalOrigin(script) {
828
861
  var sourceURL = script.nameOrSourceURL();
829
- if (sourceURL)
862
+ if (sourceURL) {
830
863
  return sourceURL;
864
+ }
831
865
 
832
866
  var eval_origin = "eval at ";
833
867
  if (script.eval_from_function_name) {
@@ -994,15 +1028,15 @@ function DefineError(f) {
994
1028
  // overwriting allows leaks of error objects between script blocks
995
1029
  // in the same context in a browser setting. Therefore we fix the
996
1030
  // name.
997
- %SetProperty(f.prototype, "name", name, READ_ONLY | DONT_DELETE);
1031
+ %SetProperty(f.prototype, "name", name, DONT_ENUM | DONT_DELETE | READ_ONLY);
998
1032
  %SetCode(f, function(m) {
999
1033
  if (%_IsConstructCall()) {
1000
1034
  // Define all the expected properties directly on the error
1001
1035
  // object. This avoids going through getters and setters defined
1002
1036
  // on prototype objects.
1003
- %IgnoreAttributesAndSetProperty(this, 'stack', void 0);
1004
- %IgnoreAttributesAndSetProperty(this, 'arguments', void 0);
1005
- %IgnoreAttributesAndSetProperty(this, 'type', void 0);
1037
+ %IgnoreAttributesAndSetProperty(this, 'stack', void 0, DONT_ENUM);
1038
+ %IgnoreAttributesAndSetProperty(this, 'arguments', void 0, DONT_ENUM);
1039
+ %IgnoreAttributesAndSetProperty(this, 'type', void 0, DONT_ENUM);
1006
1040
  if (m === kAddMessageAccessorsMarker) {
1007
1041
  // DefineOneShotAccessor always inserts a message property and
1008
1042
  // ignores setters.
@@ -1010,7 +1044,10 @@ function DefineError(f) {
1010
1044
  return FormatMessage(%NewMessageObject(obj.type, obj.arguments));
1011
1045
  });
1012
1046
  } else if (!IS_UNDEFINED(m)) {
1013
- %IgnoreAttributesAndSetProperty(this, 'message', ToString(m));
1047
+ %IgnoreAttributesAndSetProperty(this,
1048
+ 'message',
1049
+ ToString(m),
1050
+ DONT_ENUM);
1014
1051
  }
1015
1052
  captureStackTrace(this, f);
1016
1053
  } else {
@@ -1022,8 +1059,9 @@ function DefineError(f) {
1022
1059
  function captureStackTrace(obj, cons_opt) {
1023
1060
  var stackTraceLimit = $Error.stackTraceLimit;
1024
1061
  if (!stackTraceLimit || !IS_NUMBER(stackTraceLimit)) return;
1025
- if (stackTraceLimit < 0 || stackTraceLimit > 10000)
1062
+ if (stackTraceLimit < 0 || stackTraceLimit > 10000) {
1026
1063
  stackTraceLimit = 10000;
1064
+ }
1027
1065
  var raw_stack = %CollectStackTrace(cons_opt
1028
1066
  ? cons_opt
1029
1067
  : captureStackTrace, stackTraceLimit);
@@ -1034,18 +1072,32 @@ function captureStackTrace(obj, cons_opt) {
1034
1072
 
1035
1073
  $Math.__proto__ = global.Object.prototype;
1036
1074
 
1037
- DefineError(function Error() { });
1038
- DefineError(function TypeError() { });
1039
- DefineError(function RangeError() { });
1040
- DefineError(function SyntaxError() { });
1041
- DefineError(function ReferenceError() { });
1042
- DefineError(function EvalError() { });
1043
- DefineError(function URIError() { });
1075
+ // DefineError is a native function. Use explicit receiver. Otherwise
1076
+ // the receiver will be 'undefined'.
1077
+ this.DefineError(function Error() { });
1078
+ this.DefineError(function TypeError() { });
1079
+ this.DefineError(function RangeError() { });
1080
+ this.DefineError(function SyntaxError() { });
1081
+ this.DefineError(function ReferenceError() { });
1082
+ this.DefineError(function EvalError() { });
1083
+ this.DefineError(function URIError() { });
1044
1084
 
1045
1085
  $Error.captureStackTrace = captureStackTrace;
1046
1086
 
1047
1087
  // Setup extra properties of the Error.prototype object.
1048
- $Error.prototype.message = '';
1088
+ function setErrorMessage() {
1089
+ var desc = {value: '',
1090
+ enumerable: false,
1091
+ configurable: true,
1092
+ writable: true };
1093
+ DefineOwnProperty($Error.prototype,
1094
+ 'message',
1095
+ ToPropertyDescriptor(desc),
1096
+ true);
1097
+
1098
+ }
1099
+
1100
+ setErrorMessage();
1049
1101
 
1050
1102
  // Global list of error objects visited during errorToString. This is
1051
1103
  // used to detect cycles in error toString formatting.
@@ -1083,8 +1135,10 @@ function errorToString() {
1083
1135
  } catch(e) {
1084
1136
  // If this error message was encountered already return the empty
1085
1137
  // string for it instead of recursively formatting it.
1086
- if (isCyclicErrorMarker(e)) return '';
1087
- else throw e;
1138
+ if (isCyclicErrorMarker(e)) {
1139
+ return '';
1140
+ }
1141
+ throw e;
1088
1142
  }
1089
1143
  }
1090
1144
 
@@ -83,8 +83,12 @@ bool Operand::is_reg() const {
83
83
  // RelocInfo.
84
84
 
85
85
  void RelocInfo::apply(intptr_t delta) {
86
- // On MIPS we do not use pc relative addressing, so we don't need to patch the
87
- // code here.
86
+ if (IsInternalReference(rmode_)) {
87
+ // Absolute code pointer inside code object moves with the code object.
88
+ byte* p = reinterpret_cast<byte*>(pc_);
89
+ int count = Assembler::RelocateInternalReference(p, delta);
90
+ CPU::FlushICache(p, count * sizeof(uint32_t));
91
+ }
88
92
  }
89
93
 
90
94
 
@@ -300,7 +304,9 @@ void Assembler::CheckTrampolinePoolQuick() {
300
304
 
301
305
 
302
306
  void Assembler::emit(Instr x) {
303
- CheckBuffer();
307
+ if (!is_buffer_growth_blocked()) {
308
+ CheckBuffer();
309
+ }
304
310
  *reinterpret_cast<Instr*>(pc_) = x;
305
311
  pc_ += kInstrSize;
306
312
  CheckTrampolinePoolQuick();
@@ -140,7 +140,7 @@ Register ToRegister(int num) {
140
140
  // -----------------------------------------------------------------------------
141
141
  // Implementation of RelocInfo.
142
142
 
143
- const int RelocInfo::kApplyMask = 0;
143
+ const int RelocInfo::kApplyMask = 1 << RelocInfo::INTERNAL_REFERENCE;
144
144
 
145
145
 
146
146
  bool RelocInfo::IsCodedSpecially() {
@@ -275,11 +275,17 @@ Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size)
275
275
  last_trampoline_pool_end_ = 0;
276
276
  no_trampoline_pool_before_ = 0;
277
277
  trampoline_pool_blocked_nesting_ = 0;
278
- next_buffer_check_ = kMaxBranchOffset - kTrampolineSize;
278
+ // We leave space (16 * kTrampolineSlotsSize)
279
+ // for BlockTrampolinePoolScope buffer.
280
+ next_buffer_check_ = kMaxBranchOffset - kTrampolineSlotsSize * 16;
279
281
  internal_trampoline_exception_ = false;
280
282
  last_bound_pos_ = 0;
281
283
 
282
- ast_id_for_reloc_info_ = kNoASTId;
284
+ trampoline_emitted_ = false;
285
+ unbound_labels_count_ = 0;
286
+ block_buffer_growth_ = false;
287
+
288
+ ClearRecordedAstId();
283
289
  }
284
290
 
285
291
 
@@ -386,6 +392,16 @@ uint32_t Assembler::GetOpcodeField(Instr instr) {
386
392
  }
387
393
 
388
394
 
395
+ uint32_t Assembler::GetFunction(Instr instr) {
396
+ return (instr & kFunctionFieldMask) >> kFunctionShift;
397
+ }
398
+
399
+
400
+ uint32_t Assembler::GetFunctionField(Instr instr) {
401
+ return instr & kFunctionFieldMask;
402
+ }
403
+
404
+
389
405
  uint32_t Assembler::GetImmediate16(Instr instr) {
390
406
  return instr & kImm16Mask;
391
407
  }
@@ -444,6 +460,8 @@ bool Assembler::IsLwRegFpNegOffset(Instr instr) {
444
460
  // code is conv to an 18-bit value addressing bytes, hence the -4 value.
445
461
 
446
462
  const int kEndOfChain = -4;
463
+ // Determines the end of the Jump chain (a subset of the label link chain).
464
+ const int kEndOfJumpChain = 0;
447
465
 
448
466
 
449
467
  bool Assembler::IsBranch(Instr instr) {
@@ -477,6 +495,39 @@ bool Assembler::IsBne(Instr instr) {
477
495
  }
478
496
 
479
497
 
498
+ bool Assembler::IsJump(Instr instr) {
499
+ uint32_t opcode = GetOpcodeField(instr);
500
+ uint32_t rt_field = GetRtField(instr);
501
+ uint32_t rd_field = GetRdField(instr);
502
+ uint32_t function_field = GetFunctionField(instr);
503
+ // Checks if the instruction is a jump.
504
+ return opcode == J || opcode == JAL ||
505
+ (opcode == SPECIAL && rt_field == 0 &&
506
+ ((function_field == JALR) || (rd_field == 0 && (function_field == JR))));
507
+ }
508
+
509
+
510
+ bool Assembler::IsJ(Instr instr) {
511
+ uint32_t opcode = GetOpcodeField(instr);
512
+ // Checks if the instruction is a jump.
513
+ return opcode == J;
514
+ }
515
+
516
+
517
+ bool Assembler::IsLui(Instr instr) {
518
+ uint32_t opcode = GetOpcodeField(instr);
519
+ // Checks if the instruction is a load upper immediate.
520
+ return opcode == LUI;
521
+ }
522
+
523
+
524
+ bool Assembler::IsOri(Instr instr) {
525
+ uint32_t opcode = GetOpcodeField(instr);
526
+ // Checks if the instruction is a load upper immediate.
527
+ return opcode == ORI;
528
+ }
529
+
530
+
480
531
  bool Assembler::IsNop(Instr instr, unsigned int type) {
481
532
  // See Assembler::nop(type).
482
533
  ASSERT(type < 32);
@@ -564,17 +615,47 @@ int Assembler::target_at(int32_t pos) {
564
615
  return (imm18 + pos);
565
616
  }
566
617
  }
567
- // Check we have a branch instruction.
568
- ASSERT(IsBranch(instr));
618
+ // Check we have a branch or jump instruction.
619
+ ASSERT(IsBranch(instr) || IsJ(instr) || IsLui(instr));
569
620
  // Do NOT change this to <<2. We rely on arithmetic shifts here, assuming
570
621
  // the compiler uses arithmectic shifts for signed integers.
571
- int32_t imm18 = ((instr & static_cast<int32_t>(kImm16Mask)) << 16) >> 14;
622
+ if (IsBranch(instr)) {
623
+ int32_t imm18 = ((instr & static_cast<int32_t>(kImm16Mask)) << 16) >> 14;
572
624
 
573
- if (imm18 == kEndOfChain) {
574
- // EndOfChain sentinel is returned directly, not relative to pc or pos.
575
- return kEndOfChain;
625
+ if (imm18 == kEndOfChain) {
626
+ // EndOfChain sentinel is returned directly, not relative to pc or pos.
627
+ return kEndOfChain;
628
+ } else {
629
+ return pos + kBranchPCOffset + imm18;
630
+ }
631
+ } else if (IsLui(instr)) {
632
+ Instr instr_lui = instr_at(pos + 0 * Assembler::kInstrSize);
633
+ Instr instr_ori = instr_at(pos + 1 * Assembler::kInstrSize);
634
+ ASSERT(IsOri(instr_ori));
635
+ int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift;
636
+ imm |= (instr_ori & static_cast<int32_t>(kImm16Mask));
637
+
638
+ if (imm == kEndOfJumpChain) {
639
+ // EndOfChain sentinel is returned directly, not relative to pc or pos.
640
+ return kEndOfChain;
641
+ } else {
642
+ uint32_t instr_address = reinterpret_cast<int32_t>(buffer_ + pos);
643
+ int32_t delta = instr_address - imm;
644
+ ASSERT(pos > delta);
645
+ return pos - delta;
646
+ }
576
647
  } else {
577
- return pos + kBranchPCOffset + imm18;
648
+ int32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2;
649
+ if (imm28 == kEndOfJumpChain) {
650
+ // EndOfChain sentinel is returned directly, not relative to pc or pos.
651
+ return kEndOfChain;
652
+ } else {
653
+ uint32_t instr_address = reinterpret_cast<int32_t>(buffer_ + pos);
654
+ instr_address &= kImm28Mask;
655
+ int32_t delta = instr_address - imm28;
656
+ ASSERT(pos > delta);
657
+ return pos - delta;
658
+ }
578
659
  }
579
660
  }
580
661
 
@@ -589,15 +670,41 @@ void Assembler::target_at_put(int32_t pos, int32_t target_pos) {
589
670
  return;
590
671
  }
591
672
 
592
- ASSERT(IsBranch(instr));
593
- int32_t imm18 = target_pos - (pos + kBranchPCOffset);
594
- ASSERT((imm18 & 3) == 0);
673
+ ASSERT(IsBranch(instr) || IsJ(instr) || IsLui(instr));
674
+ if (IsBranch(instr)) {
675
+ int32_t imm18 = target_pos - (pos + kBranchPCOffset);
676
+ ASSERT((imm18 & 3) == 0);
677
+
678
+ instr &= ~kImm16Mask;
679
+ int32_t imm16 = imm18 >> 2;
680
+ ASSERT(is_int16(imm16));
681
+
682
+ instr_at_put(pos, instr | (imm16 & kImm16Mask));
683
+ } else if (IsLui(instr)) {
684
+ Instr instr_lui = instr_at(pos + 0 * Assembler::kInstrSize);
685
+ Instr instr_ori = instr_at(pos + 1 * Assembler::kInstrSize);
686
+ ASSERT(IsOri(instr_ori));
687
+ uint32_t imm = (uint32_t)buffer_ + target_pos;
688
+ ASSERT((imm & 3) == 0);
689
+
690
+ instr_lui &= ~kImm16Mask;
691
+ instr_ori &= ~kImm16Mask;
692
+
693
+ instr_at_put(pos + 0 * Assembler::kInstrSize,
694
+ instr_lui | ((imm & kHiMask) >> kLuiShift));
695
+ instr_at_put(pos + 1 * Assembler::kInstrSize,
696
+ instr_ori | (imm & kImm16Mask));
697
+ } else {
698
+ uint32_t imm28 = (uint32_t)buffer_ + target_pos;
699
+ imm28 &= kImm28Mask;
700
+ ASSERT((imm28 & 3) == 0);
595
701
 
596
- instr &= ~kImm16Mask;
597
- int32_t imm16 = imm18 >> 2;
598
- ASSERT(is_int16(imm16));
702
+ instr &= ~kImm26Mask;
703
+ uint32_t imm26 = imm28 >> 2;
704
+ ASSERT(is_uint26(imm26));
599
705
 
600
- instr_at_put(pos, instr | (imm16 & kImm16Mask));
706
+ instr_at_put(pos, instr | (imm26 & kImm26Mask));
707
+ }
601
708
  }
602
709
 
603
710
 
@@ -627,36 +734,33 @@ void Assembler::print(Label* L) {
627
734
 
628
735
  void Assembler::bind_to(Label* L, int pos) {
629
736
  ASSERT(0 <= pos && pos <= pc_offset()); // Must have valid binding position.
737
+ int32_t trampoline_pos = kInvalidSlotPos;
738
+ if (L->is_linked() && !trampoline_emitted_) {
739
+ unbound_labels_count_--;
740
+ next_buffer_check_ += kTrampolineSlotsSize;
741
+ }
742
+
630
743
  while (L->is_linked()) {
631
744
  int32_t fixup_pos = L->pos();
632
745
  int32_t dist = pos - fixup_pos;
633
746
  next(L); // Call next before overwriting link with target at fixup_pos.
634
- if (dist > kMaxBranchOffset) {
635
- do {
636
- int32_t trampoline_pos = get_trampoline_entry(fixup_pos);
637
- if (kInvalidSlotPos == trampoline_pos) {
638
- // Internal error.
639
- return;
747
+ Instr instr = instr_at(fixup_pos);
748
+ if (IsBranch(instr)) {
749
+ if (dist > kMaxBranchOffset) {
750
+ if (trampoline_pos == kInvalidSlotPos) {
751
+ trampoline_pos = get_trampoline_entry(fixup_pos);
752
+ CHECK(trampoline_pos != kInvalidSlotPos);
640
753
  }
641
754
  ASSERT((trampoline_pos - fixup_pos) <= kMaxBranchOffset);
642
755
  target_at_put(fixup_pos, trampoline_pos);
643
756
  fixup_pos = trampoline_pos;
644
757
  dist = pos - fixup_pos;
645
- } while (dist > kMaxBranchOffset);
646
- } else if (dist < -kMaxBranchOffset) {
647
- do {
648
- int32_t trampoline_pos = get_trampoline_entry(fixup_pos, false);
649
- if (kInvalidSlotPos == trampoline_pos) {
650
- // Internal error.
651
- return;
652
- }
653
- ASSERT((trampoline_pos - fixup_pos) >= -kMaxBranchOffset);
654
- target_at_put(fixup_pos, trampoline_pos);
655
- fixup_pos = trampoline_pos;
656
- dist = pos - fixup_pos;
657
- } while (dist < -kMaxBranchOffset);
658
- };
659
- target_at_put(fixup_pos, pos);
758
+ }
759
+ target_at_put(fixup_pos, pos);
760
+ } else {
761
+ ASSERT(IsJ(instr) || IsLui(instr));
762
+ target_at_put(fixup_pos, pos);
763
+ }
660
764
  }
661
765
  L->bind_to(pos);
662
766
 
@@ -667,27 +771,6 @@ void Assembler::bind_to(Label* L, int pos) {
667
771
  }
668
772
 
669
773
 
670
- void Assembler::link_to(Label* L, Label* appendix) {
671
- if (appendix->is_linked()) {
672
- if (L->is_linked()) {
673
- // Append appendix to L's list.
674
- int fixup_pos;
675
- int link = L->pos();
676
- do {
677
- fixup_pos = link;
678
- link = target_at(fixup_pos);
679
- } while (link > 0);
680
- ASSERT(link == kEndOfChain);
681
- target_at_put(fixup_pos, appendix->pos());
682
- } else {
683
- // L is empty, simply use appendix.
684
- *L = *appendix;
685
- }
686
- }
687
- appendix->Unuse(); // Appendix should not be used anymore.
688
- }
689
-
690
-
691
774
  void Assembler::bind(Label* L) {
692
775
  ASSERT(!L->is_bound()); // Label can only be bound once.
693
776
  bind_to(L, pc_offset());
@@ -697,14 +780,20 @@ void Assembler::bind(Label* L) {
697
780
  void Assembler::next(Label* L) {
698
781
  ASSERT(L->is_linked());
699
782
  int link = target_at(L->pos());
700
- ASSERT(link > 0 || link == kEndOfChain);
701
783
  if (link == kEndOfChain) {
702
784
  L->Unuse();
703
- } else if (link > 0) {
785
+ } else {
786
+ ASSERT(link >= 0);
704
787
  L->link_to(link);
705
788
  }
706
789
  }
707
790
 
791
+ bool Assembler::is_near(Label* L) {
792
+ if (L->is_bound()) {
793
+ return ((pc_offset() - L->pos()) < kMaxBranchOffset - 4 * kInstrSize);
794
+ }
795
+ return false;
796
+ }
708
797
 
709
798
  // We have to use a temporary register for things that can be relocated even
710
799
  // if they can be encoded in the MIPS's 16 bits of immediate-offset instruction
@@ -817,7 +906,6 @@ void Assembler::GenInstrImmediate(Opcode opcode,
817
906
  }
818
907
 
819
908
 
820
- // Registers are in the order of the instruction encoding, from left to right.
821
909
  void Assembler::GenInstrJump(Opcode opcode,
822
910
  uint32_t address) {
823
911
  BlockTrampolinePoolScope block_trampoline_pool(this);
@@ -828,119 +916,60 @@ void Assembler::GenInstrJump(Opcode opcode,
828
916
  }
829
917
 
830
918
 
831
- // Returns the next free label entry from the next trampoline pool.
832
- int32_t Assembler::get_label_entry(int32_t pos, bool next_pool) {
833
- int trampoline_count = trampolines_.length();
834
- int32_t label_entry = 0;
835
- ASSERT(trampoline_count > 0);
919
+ // Returns the next free trampoline entry.
920
+ int32_t Assembler::get_trampoline_entry(int32_t pos) {
921
+ int32_t trampoline_entry = kInvalidSlotPos;
836
922
 
837
- if (next_pool) {
838
- for (int i = 0; i < trampoline_count; i++) {
839
- if (trampolines_[i].start() > pos) {
840
- label_entry = trampolines_[i].take_label();
841
- break;
842
- }
923
+ if (!internal_trampoline_exception_) {
924
+ if (trampoline_.start() > pos) {
925
+ trampoline_entry = trampoline_.take_slot();
843
926
  }
844
- } else { // Caller needs a label entry from the previous pool.
845
- for (int i = trampoline_count-1; i >= 0; i--) {
846
- if (trampolines_[i].end() < pos) {
847
- label_entry = trampolines_[i].take_label();
848
- break;
849
- }
927
+
928
+ if (kInvalidSlotPos == trampoline_entry) {
929
+ internal_trampoline_exception_ = true;
850
930
  }
851
931
  }
852
- return label_entry;
932
+ return trampoline_entry;
853
933
  }
854
934
 
855
935
 
856
- // Returns the next free trampoline entry from the next trampoline pool.
857
- int32_t Assembler::get_trampoline_entry(int32_t pos, bool next_pool) {
858
- int trampoline_count = trampolines_.length();
859
- int32_t trampoline_entry = kInvalidSlotPos;
860
- ASSERT(trampoline_count > 0);
936
+ uint32_t Assembler::jump_address(Label* L) {
937
+ int32_t target_pos;
861
938
 
862
- if (!internal_trampoline_exception_) {
863
- if (next_pool) {
864
- for (int i = 0; i < trampoline_count; i++) {
865
- if (trampolines_[i].start() > pos) {
866
- trampoline_entry = trampolines_[i].take_slot();
867
- break;
868
- }
869
- }
870
- } else { // Caller needs a trampoline entry from the previous pool.
871
- for (int i = trampoline_count-1; i >= 0; i--) {
872
- if (trampolines_[i].end() < pos) {
873
- trampoline_entry = trampolines_[i].take_slot();
874
- break;
875
- }
876
- }
877
- }
878
- if (kInvalidSlotPos == trampoline_entry) {
879
- internal_trampoline_exception_ = true;
939
+ if (L->is_bound()) {
940
+ target_pos = L->pos();
941
+ } else {
942
+ if (L->is_linked()) {
943
+ target_pos = L->pos(); // L's link.
944
+ L->link_to(pc_offset());
945
+ } else {
946
+ L->link_to(pc_offset());
947
+ return kEndOfJumpChain;
880
948
  }
881
949
  }
882
- return trampoline_entry;
950
+
951
+ uint32_t imm = (uint32_t)buffer_ + target_pos;
952
+ ASSERT((imm & 3) == 0);
953
+
954
+ return imm;
883
955
  }
884
956
 
885
957
 
886
958
  int32_t Assembler::branch_offset(Label* L, bool jump_elimination_allowed) {
887
959
  int32_t target_pos;
888
- int32_t pc_offset_v = pc_offset();
889
960
 
890
961
  if (L->is_bound()) {
891
962
  target_pos = L->pos();
892
- int32_t dist = pc_offset_v - target_pos;
893
- if (dist > kMaxBranchOffset) {
894
- do {
895
- int32_t trampoline_pos = get_trampoline_entry(target_pos);
896
- if (kInvalidSlotPos == trampoline_pos) {
897
- // Internal error.
898
- return 0;
899
- }
900
- ASSERT((trampoline_pos - target_pos) > 0);
901
- ASSERT((trampoline_pos - target_pos) <= kMaxBranchOffset);
902
- target_at_put(trampoline_pos, target_pos);
903
- target_pos = trampoline_pos;
904
- dist = pc_offset_v - target_pos;
905
- } while (dist > kMaxBranchOffset);
906
- } else if (dist < -kMaxBranchOffset) {
907
- do {
908
- int32_t trampoline_pos = get_trampoline_entry(target_pos, false);
909
- if (kInvalidSlotPos == trampoline_pos) {
910
- // Internal error.
911
- return 0;
912
- }
913
- ASSERT((target_pos - trampoline_pos) > 0);
914
- ASSERT((target_pos - trampoline_pos) <= kMaxBranchOffset);
915
- target_at_put(trampoline_pos, target_pos);
916
- target_pos = trampoline_pos;
917
- dist = pc_offset_v - target_pos;
918
- } while (dist < -kMaxBranchOffset);
919
- }
920
963
  } else {
921
964
  if (L->is_linked()) {
922
- target_pos = L->pos(); // L's link.
923
- int32_t dist = pc_offset_v - target_pos;
924
- if (dist > kMaxBranchOffset) {
925
- do {
926
- int32_t label_pos = get_label_entry(target_pos);
927
- ASSERT((label_pos - target_pos) < kMaxBranchOffset);
928
- label_at_put(L, label_pos);
929
- target_pos = label_pos;
930
- dist = pc_offset_v - target_pos;
931
- } while (dist > kMaxBranchOffset);
932
- } else if (dist < -kMaxBranchOffset) {
933
- do {
934
- int32_t label_pos = get_label_entry(target_pos, false);
935
- ASSERT((label_pos - target_pos) > -kMaxBranchOffset);
936
- label_at_put(L, label_pos);
937
- target_pos = label_pos;
938
- dist = pc_offset_v - target_pos;
939
- } while (dist < -kMaxBranchOffset);
940
- }
965
+ target_pos = L->pos();
941
966
  L->link_to(pc_offset());
942
967
  } else {
943
968
  L->link_to(pc_offset());
969
+ if (!trampoline_emitted_) {
970
+ unbound_labels_count_++;
971
+ next_buffer_check_ -= kTrampolineSlotsSize;
972
+ }
944
973
  return kEndOfChain;
945
974
  }
946
975
  }
@@ -969,6 +998,10 @@ void Assembler::label_at_put(Label* L, int at_offset) {
969
998
  } else {
970
999
  target_pos = kEndOfChain;
971
1000
  instr_at_put(at_offset, 0);
1001
+ if (!trampoline_emitted_) {
1002
+ unbound_labels_count_++;
1003
+ next_buffer_check_ -= kTrampolineSlotsSize;
1004
+ }
972
1005
  }
973
1006
  L->link_to(at_offset);
974
1007
  }
@@ -1336,13 +1369,37 @@ void Assembler::lui(Register rd, int32_t j) {
1336
1369
  //-------------Misc-instructions--------------
1337
1370
 
1338
1371
  // Break / Trap instructions.
1339
- void Assembler::break_(uint32_t code) {
1372
+ void Assembler::break_(uint32_t code, bool break_as_stop) {
1340
1373
  ASSERT((code & ~0xfffff) == 0);
1374
+ // We need to invalidate breaks that could be stops as well because the
1375
+ // simulator expects a char pointer after the stop instruction.
1376
+ // See constants-mips.h for explanation.
1377
+ ASSERT((break_as_stop &&
1378
+ code <= kMaxStopCode &&
1379
+ code > kMaxWatchpointCode) ||
1380
+ (!break_as_stop &&
1381
+ (code > kMaxStopCode ||
1382
+ code <= kMaxWatchpointCode)));
1341
1383
  Instr break_instr = SPECIAL | BREAK | (code << 6);
1342
1384
  emit(break_instr);
1343
1385
  }
1344
1386
 
1345
1387
 
1388
+ void Assembler::stop(const char* msg, uint32_t code) {
1389
+ ASSERT(code > kMaxWatchpointCode);
1390
+ ASSERT(code <= kMaxStopCode);
1391
+ #if defined(V8_HOST_ARCH_MIPS)
1392
+ break_(0x54321);
1393
+ #else // V8_HOST_ARCH_MIPS
1394
+ BlockTrampolinePoolFor(2);
1395
+ // The Simulator will handle the stop instruction and get the message address.
1396
+ // On MIPS stop() is just a special kind of break_().
1397
+ break_(code, true);
1398
+ emit(reinterpret_cast<Instr>(msg));
1399
+ #endif
1400
+ }
1401
+
1402
+
1346
1403
  void Assembler::tge(Register rs, Register rt, uint16_t code) {
1347
1404
  ASSERT(is_uint10(code));
1348
1405
  Instr instr = SPECIAL | TGE | rs.code() << kRsShift
@@ -1767,6 +1824,48 @@ void Assembler::RecordComment(const char* msg) {
1767
1824
  }
1768
1825
 
1769
1826
 
1827
+ int Assembler::RelocateInternalReference(byte* pc, intptr_t pc_delta) {
1828
+ Instr instr = instr_at(pc);
1829
+ ASSERT(IsJ(instr) || IsLui(instr));
1830
+ if (IsLui(instr)) {
1831
+ Instr instr_lui = instr_at(pc + 0 * Assembler::kInstrSize);
1832
+ Instr instr_ori = instr_at(pc + 1 * Assembler::kInstrSize);
1833
+ ASSERT(IsOri(instr_ori));
1834
+ int32_t imm = (instr_lui & static_cast<int32_t>(kImm16Mask)) << kLuiShift;
1835
+ imm |= (instr_ori & static_cast<int32_t>(kImm16Mask));
1836
+ if (imm == kEndOfJumpChain) {
1837
+ return 0; // Number of instructions patched.
1838
+ }
1839
+ imm += pc_delta;
1840
+ ASSERT((imm & 3) == 0);
1841
+
1842
+ instr_lui &= ~kImm16Mask;
1843
+ instr_ori &= ~kImm16Mask;
1844
+
1845
+ instr_at_put(pc + 0 * Assembler::kInstrSize,
1846
+ instr_lui | ((imm >> kLuiShift) & kImm16Mask));
1847
+ instr_at_put(pc + 1 * Assembler::kInstrSize,
1848
+ instr_ori | (imm & kImm16Mask));
1849
+ return 2; // Number of instructions patched.
1850
+ } else {
1851
+ uint32_t imm28 = (instr & static_cast<int32_t>(kImm26Mask)) << 2;
1852
+ if ((int32_t)imm28 == kEndOfJumpChain) {
1853
+ return 0; // Number of instructions patched.
1854
+ }
1855
+ imm28 += pc_delta;
1856
+ imm28 &= kImm28Mask;
1857
+ ASSERT((imm28 & 3) == 0);
1858
+
1859
+ instr &= ~kImm26Mask;
1860
+ uint32_t imm26 = imm28 >> 2;
1861
+ ASSERT(is_uint26(imm26));
1862
+
1863
+ instr_at_put(pc, instr | (imm26 & kImm26Mask));
1864
+ return 1; // Number of instructions patched.
1865
+ }
1866
+ }
1867
+
1868
+
1770
1869
  void Assembler::GrowBuffer() {
1771
1870
  if (!own_buffer_) FATAL("external code buffer is too small");
1772
1871
 
@@ -1802,9 +1901,14 @@ void Assembler::GrowBuffer() {
1802
1901
  reloc_info_writer.Reposition(reloc_info_writer.pos() + rc_delta,
1803
1902
  reloc_info_writer.last_pc() + pc_delta);
1804
1903
 
1805
- // On ia32 and ARM pc relative addressing is used, and we thus need to apply a
1806
- // shift by pc_delta. But on MIPS the target address it directly loaded, so
1807
- // we do not need to relocate here.
1904
+ // Relocate runtime entries.
1905
+ for (RelocIterator it(desc); !it.done(); it.next()) {
1906
+ RelocInfo::Mode rmode = it.rinfo()->rmode();
1907
+ if (rmode == RelocInfo::INTERNAL_REFERENCE) {
1908
+ byte* p = reinterpret_cast<byte*>(it.rinfo()->pc());
1909
+ RelocateInternalReference(p, pc_delta);
1910
+ }
1911
+ }
1808
1912
 
1809
1913
  ASSERT(!overflow());
1810
1914
  }
@@ -1843,9 +1947,8 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
1843
1947
  }
1844
1948
  ASSERT(buffer_space() >= kMaxRelocSize); // Too late to grow buffer here.
1845
1949
  if (rmode == RelocInfo::CODE_TARGET_WITH_ID) {
1846
- ASSERT(ast_id_for_reloc_info_ != kNoASTId);
1847
- RelocInfo reloc_info_with_ast_id(pc_, rmode, ast_id_for_reloc_info_);
1848
- ast_id_for_reloc_info_ = kNoASTId;
1950
+ RelocInfo reloc_info_with_ast_id(pc_, rmode, RecordedAstId());
1951
+ ClearRecordedAstId();
1849
1952
  reloc_info_writer.Write(&reloc_info_with_ast_id);
1850
1953
  } else {
1851
1954
  reloc_info_writer.Write(&rinfo);
@@ -1859,16 +1962,7 @@ void Assembler::BlockTrampolinePoolFor(int instructions) {
1859
1962
  }
1860
1963
 
1861
1964
 
1862
- void Assembler::CheckTrampolinePool(bool force_emit) {
1863
- // Calculate the offset of the next check.
1864
- next_buffer_check_ = pc_offset() + kCheckConstInterval;
1865
-
1866
- int dist = pc_offset() - last_trampoline_pool_end_;
1867
-
1868
- if (dist <= kMaxDistBetweenPools && !force_emit) {
1869
- return;
1870
- }
1871
-
1965
+ void Assembler::CheckTrampolinePool() {
1872
1966
  // Some small sequences of instructions must not be broken up by the
1873
1967
  // insertion of a trampoline pool; such sequences are protected by setting
1874
1968
  // either trampoline_pool_blocked_nesting_ or no_trampoline_pool_before_,
@@ -1886,29 +1980,43 @@ void Assembler::CheckTrampolinePool(bool force_emit) {
1886
1980
  return;
1887
1981
  }
1888
1982
 
1889
- // First we emit jump (2 instructions), then we emit trampoline pool.
1890
- { BlockTrampolinePoolScope block_trampoline_pool(this);
1891
- Label after_pool;
1892
- b(&after_pool);
1893
- nop();
1894
-
1895
- int pool_start = pc_offset();
1896
- for (int i = 0; i < kSlotsPerTrampoline; i++) {
1983
+ ASSERT(!trampoline_emitted_);
1984
+ ASSERT(unbound_labels_count_ >= 0);
1985
+ if (unbound_labels_count_ > 0) {
1986
+ // First we emit jump (2 instructions), then we emit trampoline pool.
1987
+ { BlockTrampolinePoolScope block_trampoline_pool(this);
1988
+ Label after_pool;
1897
1989
  b(&after_pool);
1898
1990
  nop();
1991
+
1992
+ int pool_start = pc_offset();
1993
+ for (int i = 0; i < unbound_labels_count_; i++) {
1994
+ uint32_t imm32;
1995
+ imm32 = jump_address(&after_pool);
1996
+ { BlockGrowBufferScope block_buf_growth(this);
1997
+ // Buffer growth (and relocation) must be blocked for internal
1998
+ // references until associated instructions are emitted and available
1999
+ // to be patched.
2000
+ RecordRelocInfo(RelocInfo::INTERNAL_REFERENCE);
2001
+ lui(at, (imm32 & kHiMask) >> kLuiShift);
2002
+ ori(at, at, (imm32 & kImm16Mask));
2003
+ }
2004
+ jr(at);
2005
+ nop();
2006
+ }
2007
+ bind(&after_pool);
2008
+ trampoline_ = Trampoline(pool_start, unbound_labels_count_);
2009
+
2010
+ trampoline_emitted_ = true;
2011
+ // As we are only going to emit trampoline once, we need to prevent any
2012
+ // further emission.
2013
+ next_buffer_check_ = kMaxInt;
1899
2014
  }
1900
- for (int i = 0; i < kLabelsPerTrampoline; i++) {
1901
- emit(0);
1902
- }
1903
- last_trampoline_pool_end_ = pc_offset() - kInstrSize;
1904
- bind(&after_pool);
1905
- trampolines_.Add(Trampoline(pool_start,
1906
- kSlotsPerTrampoline,
1907
- kLabelsPerTrampoline));
1908
-
1909
- // Since a trampoline pool was just emitted,
1910
- // move the check offset forward by the standard interval.
1911
- next_buffer_check_ = last_trampoline_pool_end_ + kMaxDistBetweenPools;
2015
+ } else {
2016
+ // Number of branches to unbound label at this point is zero, so we can
2017
+ // move next buffer check to maximum.
2018
+ next_buffer_check_ = pc_offset() +
2019
+ kMaxBranchOffset - kTrampolineSlotsSize * 16;
1912
2020
  }
1913
2021
  return;
1914
2022
  }