libv8 3.3.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (700) hide show
  1. data/.gitignore +8 -0
  2. data/.gitmodules +3 -0
  3. data/Gemfile +4 -0
  4. data/README.md +44 -0
  5. data/Rakefile +73 -0
  6. data/ext/libv8/extconf.rb +9 -0
  7. data/lib/libv8.rb +15 -0
  8. data/lib/libv8/Makefile +38 -0
  9. data/lib/libv8/detect_cpu.rb +27 -0
  10. data/lib/libv8/fpic-on-linux-amd64.patch +13 -0
  11. data/lib/libv8/scons/CHANGES.txt +5334 -0
  12. data/lib/libv8/scons/LICENSE.txt +20 -0
  13. data/lib/libv8/scons/MANIFEST +199 -0
  14. data/lib/libv8/scons/PKG-INFO +13 -0
  15. data/lib/libv8/scons/README.txt +243 -0
  16. data/lib/libv8/scons/RELEASE.txt +98 -0
  17. data/lib/libv8/scons/engine/SCons/Action.py +1241 -0
  18. data/lib/libv8/scons/engine/SCons/Builder.py +877 -0
  19. data/lib/libv8/scons/engine/SCons/CacheDir.py +216 -0
  20. data/lib/libv8/scons/engine/SCons/Conftest.py +793 -0
  21. data/lib/libv8/scons/engine/SCons/Debug.py +220 -0
  22. data/lib/libv8/scons/engine/SCons/Defaults.py +480 -0
  23. data/lib/libv8/scons/engine/SCons/Environment.py +2318 -0
  24. data/lib/libv8/scons/engine/SCons/Errors.py +205 -0
  25. data/lib/libv8/scons/engine/SCons/Executor.py +633 -0
  26. data/lib/libv8/scons/engine/SCons/Job.py +435 -0
  27. data/lib/libv8/scons/engine/SCons/Memoize.py +244 -0
  28. data/lib/libv8/scons/engine/SCons/Node/Alias.py +152 -0
  29. data/lib/libv8/scons/engine/SCons/Node/FS.py +3142 -0
  30. data/lib/libv8/scons/engine/SCons/Node/Python.py +128 -0
  31. data/lib/libv8/scons/engine/SCons/Node/__init__.py +1328 -0
  32. data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +50 -0
  33. data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +50 -0
  34. data/lib/libv8/scons/engine/SCons/Options/ListOption.py +50 -0
  35. data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +50 -0
  36. data/lib/libv8/scons/engine/SCons/Options/PathOption.py +76 -0
  37. data/lib/libv8/scons/engine/SCons/Options/__init__.py +67 -0
  38. data/lib/libv8/scons/engine/SCons/PathList.py +231 -0
  39. data/lib/libv8/scons/engine/SCons/Platform/__init__.py +241 -0
  40. data/lib/libv8/scons/engine/SCons/Platform/aix.py +69 -0
  41. data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +55 -0
  42. data/lib/libv8/scons/engine/SCons/Platform/darwin.py +46 -0
  43. data/lib/libv8/scons/engine/SCons/Platform/hpux.py +46 -0
  44. data/lib/libv8/scons/engine/SCons/Platform/irix.py +44 -0
  45. data/lib/libv8/scons/engine/SCons/Platform/os2.py +58 -0
  46. data/lib/libv8/scons/engine/SCons/Platform/posix.py +263 -0
  47. data/lib/libv8/scons/engine/SCons/Platform/sunos.py +50 -0
  48. data/lib/libv8/scons/engine/SCons/Platform/win32.py +385 -0
  49. data/lib/libv8/scons/engine/SCons/SConf.py +1030 -0
  50. data/lib/libv8/scons/engine/SCons/SConsign.py +383 -0
  51. data/lib/libv8/scons/engine/SCons/Scanner/C.py +132 -0
  52. data/lib/libv8/scons/engine/SCons/Scanner/D.py +73 -0
  53. data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +109 -0
  54. data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +316 -0
  55. data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +48 -0
  56. data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +384 -0
  57. data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +101 -0
  58. data/lib/libv8/scons/engine/SCons/Scanner/RC.py +55 -0
  59. data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +413 -0
  60. data/lib/libv8/scons/engine/SCons/Script/Interactive.py +384 -0
  61. data/lib/libv8/scons/engine/SCons/Script/Main.py +1334 -0
  62. data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +939 -0
  63. data/lib/libv8/scons/engine/SCons/Script/SConscript.py +640 -0
  64. data/lib/libv8/scons/engine/SCons/Script/__init__.py +412 -0
  65. data/lib/libv8/scons/engine/SCons/Sig.py +63 -0
  66. data/lib/libv8/scons/engine/SCons/Subst.py +904 -0
  67. data/lib/libv8/scons/engine/SCons/Taskmaster.py +1017 -0
  68. data/lib/libv8/scons/engine/SCons/Tool/386asm.py +61 -0
  69. data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +67 -0
  70. data/lib/libv8/scons/engine/SCons/Tool/CVS.py +73 -0
  71. data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +246 -0
  72. data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +323 -0
  73. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +56 -0
  74. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +61 -0
  75. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +240 -0
  76. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +82 -0
  77. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +391 -0
  78. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +456 -0
  79. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +499 -0
  80. data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +103 -0
  81. data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +137 -0
  82. data/lib/libv8/scons/engine/SCons/Tool/RCS.py +64 -0
  83. data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +64 -0
  84. data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +71 -0
  85. data/lib/libv8/scons/engine/SCons/Tool/__init__.py +681 -0
  86. data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +82 -0
  87. data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +74 -0
  88. data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +80 -0
  89. data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +76 -0
  90. data/lib/libv8/scons/engine/SCons/Tool/applelink.py +71 -0
  91. data/lib/libv8/scons/engine/SCons/Tool/ar.py +63 -0
  92. data/lib/libv8/scons/engine/SCons/Tool/as.py +78 -0
  93. data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +81 -0
  94. data/lib/libv8/scons/engine/SCons/Tool/c++.py +99 -0
  95. data/lib/libv8/scons/engine/SCons/Tool/cc.py +102 -0
  96. data/lib/libv8/scons/engine/SCons/Tool/cvf.py +58 -0
  97. data/lib/libv8/scons/engine/SCons/Tool/default.py +50 -0
  98. data/lib/libv8/scons/engine/SCons/Tool/dmd.py +223 -0
  99. data/lib/libv8/scons/engine/SCons/Tool/dvi.py +64 -0
  100. data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +124 -0
  101. data/lib/libv8/scons/engine/SCons/Tool/dvips.py +94 -0
  102. data/lib/libv8/scons/engine/SCons/Tool/f77.py +62 -0
  103. data/lib/libv8/scons/engine/SCons/Tool/f90.py +62 -0
  104. data/lib/libv8/scons/engine/SCons/Tool/f95.py +63 -0
  105. data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +98 -0
  106. data/lib/libv8/scons/engine/SCons/Tool/fortran.py +62 -0
  107. data/lib/libv8/scons/engine/SCons/Tool/g++.py +90 -0
  108. data/lib/libv8/scons/engine/SCons/Tool/g77.py +73 -0
  109. data/lib/libv8/scons/engine/SCons/Tool/gas.py +53 -0
  110. data/lib/libv8/scons/engine/SCons/Tool/gcc.py +80 -0
  111. data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +64 -0
  112. data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +63 -0
  113. data/lib/libv8/scons/engine/SCons/Tool/gs.py +81 -0
  114. data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +84 -0
  115. data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +53 -0
  116. data/lib/libv8/scons/engine/SCons/Tool/hplink.py +77 -0
  117. data/lib/libv8/scons/engine/SCons/Tool/icc.py +59 -0
  118. data/lib/libv8/scons/engine/SCons/Tool/icl.py +52 -0
  119. data/lib/libv8/scons/engine/SCons/Tool/ifl.py +72 -0
  120. data/lib/libv8/scons/engine/SCons/Tool/ifort.py +88 -0
  121. data/lib/libv8/scons/engine/SCons/Tool/ilink.py +59 -0
  122. data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +60 -0
  123. data/lib/libv8/scons/engine/SCons/Tool/install.py +229 -0
  124. data/lib/libv8/scons/engine/SCons/Tool/intelc.py +482 -0
  125. data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +67 -0
  126. data/lib/libv8/scons/engine/SCons/Tool/jar.py +110 -0
  127. data/lib/libv8/scons/engine/SCons/Tool/javac.py +230 -0
  128. data/lib/libv8/scons/engine/SCons/Tool/javah.py +137 -0
  129. data/lib/libv8/scons/engine/SCons/Tool/latex.py +79 -0
  130. data/lib/libv8/scons/engine/SCons/Tool/lex.py +97 -0
  131. data/lib/libv8/scons/engine/SCons/Tool/link.py +121 -0
  132. data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +112 -0
  133. data/lib/libv8/scons/engine/SCons/Tool/m4.py +63 -0
  134. data/lib/libv8/scons/engine/SCons/Tool/masm.py +77 -0
  135. data/lib/libv8/scons/engine/SCons/Tool/midl.py +88 -0
  136. data/lib/libv8/scons/engine/SCons/Tool/mingw.py +158 -0
  137. data/lib/libv8/scons/engine/SCons/Tool/mslib.py +64 -0
  138. data/lib/libv8/scons/engine/SCons/Tool/mslink.py +266 -0
  139. data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +50 -0
  140. data/lib/libv8/scons/engine/SCons/Tool/msvc.py +268 -0
  141. data/lib/libv8/scons/engine/SCons/Tool/msvs.py +1388 -0
  142. data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +207 -0
  143. data/lib/libv8/scons/engine/SCons/Tool/mwld.py +107 -0
  144. data/lib/libv8/scons/engine/SCons/Tool/nasm.py +72 -0
  145. data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +312 -0
  146. data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +185 -0
  147. data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +527 -0
  148. data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +365 -0
  149. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +43 -0
  150. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +43 -0
  151. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +43 -0
  152. data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +44 -0
  153. data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +44 -0
  154. data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +44 -0
  155. data/lib/libv8/scons/engine/SCons/Tool/pdf.py +78 -0
  156. data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +83 -0
  157. data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +108 -0
  158. data/lib/libv8/scons/engine/SCons/Tool/qt.py +336 -0
  159. data/lib/libv8/scons/engine/SCons/Tool/rmic.py +120 -0
  160. data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +70 -0
  161. data/lib/libv8/scons/engine/SCons/Tool/rpm.py +132 -0
  162. data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +68 -0
  163. data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +58 -0
  164. data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +53 -0
  165. data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +63 -0
  166. data/lib/libv8/scons/engine/SCons/Tool/sunar.py +67 -0
  167. data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +142 -0
  168. data/lib/libv8/scons/engine/SCons/Tool/suncc.py +58 -0
  169. data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +63 -0
  170. data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +64 -0
  171. data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +64 -0
  172. data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +77 -0
  173. data/lib/libv8/scons/engine/SCons/Tool/swig.py +182 -0
  174. data/lib/libv8/scons/engine/SCons/Tool/tar.py +73 -0
  175. data/lib/libv8/scons/engine/SCons/Tool/tex.py +813 -0
  176. data/lib/libv8/scons/engine/SCons/Tool/textfile.py +175 -0
  177. data/lib/libv8/scons/engine/SCons/Tool/tlib.py +53 -0
  178. data/lib/libv8/scons/engine/SCons/Tool/wix.py +99 -0
  179. data/lib/libv8/scons/engine/SCons/Tool/yacc.py +130 -0
  180. data/lib/libv8/scons/engine/SCons/Tool/zip.py +99 -0
  181. data/lib/libv8/scons/engine/SCons/Util.py +1492 -0
  182. data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +89 -0
  183. data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +103 -0
  184. data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +135 -0
  185. data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +106 -0
  186. data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +147 -0
  187. data/lib/libv8/scons/engine/SCons/Variables/__init__.py +312 -0
  188. data/lib/libv8/scons/engine/SCons/Warnings.py +246 -0
  189. data/lib/libv8/scons/engine/SCons/__init__.py +49 -0
  190. data/lib/libv8/scons/engine/SCons/compat/__init__.py +237 -0
  191. data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +150 -0
  192. data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +45 -0
  193. data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +45 -0
  194. data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +76 -0
  195. data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +45 -0
  196. data/lib/libv8/scons/engine/SCons/compat/_scons_sets.py +563 -0
  197. data/lib/libv8/scons/engine/SCons/compat/_scons_subprocess.py +1281 -0
  198. data/lib/libv8/scons/engine/SCons/cpp.py +589 -0
  199. data/lib/libv8/scons/engine/SCons/dblite.py +251 -0
  200. data/lib/libv8/scons/engine/SCons/exitfuncs.py +77 -0
  201. data/lib/libv8/scons/os_spawnv_fix.diff +83 -0
  202. data/lib/libv8/scons/scons-time.1 +1017 -0
  203. data/lib/libv8/scons/scons.1 +15219 -0
  204. data/lib/libv8/scons/sconsign.1 +208 -0
  205. data/lib/libv8/scons/script/scons +196 -0
  206. data/lib/libv8/scons/script/scons-time +1544 -0
  207. data/lib/libv8/scons/script/scons.bat +31 -0
  208. data/lib/libv8/scons/script/sconsign +513 -0
  209. data/lib/libv8/scons/setup.cfg +6 -0
  210. data/lib/libv8/scons/setup.py +425 -0
  211. data/lib/libv8/v8/.gitignore +35 -0
  212. data/lib/libv8/v8/AUTHORS +44 -0
  213. data/lib/libv8/v8/ChangeLog +2839 -0
  214. data/lib/libv8/v8/LICENSE +52 -0
  215. data/lib/libv8/v8/LICENSE.strongtalk +29 -0
  216. data/lib/libv8/v8/LICENSE.v8 +26 -0
  217. data/lib/libv8/v8/LICENSE.valgrind +45 -0
  218. data/lib/libv8/v8/SConstruct +1478 -0
  219. data/lib/libv8/v8/build/README.txt +49 -0
  220. data/lib/libv8/v8/build/all.gyp +18 -0
  221. data/lib/libv8/v8/build/armu.gypi +32 -0
  222. data/lib/libv8/v8/build/common.gypi +144 -0
  223. data/lib/libv8/v8/build/gyp_v8 +145 -0
  224. data/lib/libv8/v8/include/v8-debug.h +395 -0
  225. data/lib/libv8/v8/include/v8-preparser.h +117 -0
  226. data/lib/libv8/v8/include/v8-profiler.h +505 -0
  227. data/lib/libv8/v8/include/v8-testing.h +104 -0
  228. data/lib/libv8/v8/include/v8.h +4124 -0
  229. data/lib/libv8/v8/include/v8stdint.h +53 -0
  230. data/lib/libv8/v8/preparser/SConscript +38 -0
  231. data/lib/libv8/v8/preparser/preparser-process.cc +379 -0
  232. data/lib/libv8/v8/src/SConscript +368 -0
  233. data/lib/libv8/v8/src/accessors.cc +767 -0
  234. data/lib/libv8/v8/src/accessors.h +123 -0
  235. data/lib/libv8/v8/src/allocation-inl.h +49 -0
  236. data/lib/libv8/v8/src/allocation.cc +122 -0
  237. data/lib/libv8/v8/src/allocation.h +143 -0
  238. data/lib/libv8/v8/src/api.cc +5845 -0
  239. data/lib/libv8/v8/src/api.h +574 -0
  240. data/lib/libv8/v8/src/apinatives.js +110 -0
  241. data/lib/libv8/v8/src/apiutils.h +73 -0
  242. data/lib/libv8/v8/src/arguments.h +118 -0
  243. data/lib/libv8/v8/src/arm/assembler-arm-inl.h +353 -0
  244. data/lib/libv8/v8/src/arm/assembler-arm.cc +2661 -0
  245. data/lib/libv8/v8/src/arm/assembler-arm.h +1375 -0
  246. data/lib/libv8/v8/src/arm/builtins-arm.cc +1658 -0
  247. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +6398 -0
  248. data/lib/libv8/v8/src/arm/code-stubs-arm.h +673 -0
  249. data/lib/libv8/v8/src/arm/codegen-arm.cc +52 -0
  250. data/lib/libv8/v8/src/arm/codegen-arm.h +91 -0
  251. data/lib/libv8/v8/src/arm/constants-arm.cc +152 -0
  252. data/lib/libv8/v8/src/arm/constants-arm.h +775 -0
  253. data/lib/libv8/v8/src/arm/cpu-arm.cc +120 -0
  254. data/lib/libv8/v8/src/arm/debug-arm.cc +317 -0
  255. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +754 -0
  256. data/lib/libv8/v8/src/arm/disasm-arm.cc +1506 -0
  257. data/lib/libv8/v8/src/arm/frames-arm.cc +45 -0
  258. data/lib/libv8/v8/src/arm/frames-arm.h +168 -0
  259. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +4375 -0
  260. data/lib/libv8/v8/src/arm/ic-arm.cc +1562 -0
  261. data/lib/libv8/v8/src/arm/lithium-arm.cc +2206 -0
  262. data/lib/libv8/v8/src/arm/lithium-arm.h +2348 -0
  263. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +4526 -0
  264. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +403 -0
  265. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +305 -0
  266. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.h +84 -0
  267. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +3163 -0
  268. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +1126 -0
  269. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +1287 -0
  270. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +253 -0
  271. data/lib/libv8/v8/src/arm/simulator-arm.cc +3424 -0
  272. data/lib/libv8/v8/src/arm/simulator-arm.h +431 -0
  273. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +4243 -0
  274. data/lib/libv8/v8/src/array.js +1366 -0
  275. data/lib/libv8/v8/src/assembler.cc +1207 -0
  276. data/lib/libv8/v8/src/assembler.h +858 -0
  277. data/lib/libv8/v8/src/ast-inl.h +112 -0
  278. data/lib/libv8/v8/src/ast.cc +1146 -0
  279. data/lib/libv8/v8/src/ast.h +2188 -0
  280. data/lib/libv8/v8/src/atomicops.h +167 -0
  281. data/lib/libv8/v8/src/atomicops_internals_arm_gcc.h +145 -0
  282. data/lib/libv8/v8/src/atomicops_internals_mips_gcc.h +169 -0
  283. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.cc +133 -0
  284. data/lib/libv8/v8/src/atomicops_internals_x86_gcc.h +287 -0
  285. data/lib/libv8/v8/src/atomicops_internals_x86_macosx.h +301 -0
  286. data/lib/libv8/v8/src/atomicops_internals_x86_msvc.h +203 -0
  287. data/lib/libv8/v8/src/bignum-dtoa.cc +655 -0
  288. data/lib/libv8/v8/src/bignum-dtoa.h +81 -0
  289. data/lib/libv8/v8/src/bignum.cc +768 -0
  290. data/lib/libv8/v8/src/bignum.h +140 -0
  291. data/lib/libv8/v8/src/bootstrapper.cc +2184 -0
  292. data/lib/libv8/v8/src/bootstrapper.h +188 -0
  293. data/lib/libv8/v8/src/builtins.cc +1707 -0
  294. data/lib/libv8/v8/src/builtins.h +371 -0
  295. data/lib/libv8/v8/src/bytecodes-irregexp.h +105 -0
  296. data/lib/libv8/v8/src/cached-powers.cc +177 -0
  297. data/lib/libv8/v8/src/cached-powers.h +65 -0
  298. data/lib/libv8/v8/src/char-predicates-inl.h +94 -0
  299. data/lib/libv8/v8/src/char-predicates.h +67 -0
  300. data/lib/libv8/v8/src/checks.cc +110 -0
  301. data/lib/libv8/v8/src/checks.h +296 -0
  302. data/lib/libv8/v8/src/circular-queue-inl.h +53 -0
  303. data/lib/libv8/v8/src/circular-queue.cc +122 -0
  304. data/lib/libv8/v8/src/circular-queue.h +103 -0
  305. data/lib/libv8/v8/src/code-stubs.cc +267 -0
  306. data/lib/libv8/v8/src/code-stubs.h +1011 -0
  307. data/lib/libv8/v8/src/code.h +70 -0
  308. data/lib/libv8/v8/src/codegen.cc +231 -0
  309. data/lib/libv8/v8/src/codegen.h +84 -0
  310. data/lib/libv8/v8/src/compilation-cache.cc +540 -0
  311. data/lib/libv8/v8/src/compilation-cache.h +287 -0
  312. data/lib/libv8/v8/src/compiler.cc +786 -0
  313. data/lib/libv8/v8/src/compiler.h +312 -0
  314. data/lib/libv8/v8/src/contexts.cc +347 -0
  315. data/lib/libv8/v8/src/contexts.h +391 -0
  316. data/lib/libv8/v8/src/conversions-inl.h +106 -0
  317. data/lib/libv8/v8/src/conversions.cc +1131 -0
  318. data/lib/libv8/v8/src/conversions.h +135 -0
  319. data/lib/libv8/v8/src/counters.cc +93 -0
  320. data/lib/libv8/v8/src/counters.h +254 -0
  321. data/lib/libv8/v8/src/cpu-profiler-inl.h +101 -0
  322. data/lib/libv8/v8/src/cpu-profiler.cc +609 -0
  323. data/lib/libv8/v8/src/cpu-profiler.h +302 -0
  324. data/lib/libv8/v8/src/cpu.h +69 -0
  325. data/lib/libv8/v8/src/d8-debug.cc +367 -0
  326. data/lib/libv8/v8/src/d8-debug.h +158 -0
  327. data/lib/libv8/v8/src/d8-posix.cc +695 -0
  328. data/lib/libv8/v8/src/d8-readline.cc +130 -0
  329. data/lib/libv8/v8/src/d8-windows.cc +42 -0
  330. data/lib/libv8/v8/src/d8.cc +803 -0
  331. data/lib/libv8/v8/src/d8.gyp +91 -0
  332. data/lib/libv8/v8/src/d8.h +235 -0
  333. data/lib/libv8/v8/src/d8.js +2798 -0
  334. data/lib/libv8/v8/src/data-flow.cc +66 -0
  335. data/lib/libv8/v8/src/data-flow.h +205 -0
  336. data/lib/libv8/v8/src/date.js +1103 -0
  337. data/lib/libv8/v8/src/dateparser-inl.h +127 -0
  338. data/lib/libv8/v8/src/dateparser.cc +178 -0
  339. data/lib/libv8/v8/src/dateparser.h +266 -0
  340. data/lib/libv8/v8/src/debug-agent.cc +447 -0
  341. data/lib/libv8/v8/src/debug-agent.h +129 -0
  342. data/lib/libv8/v8/src/debug-debugger.js +2569 -0
  343. data/lib/libv8/v8/src/debug.cc +3165 -0
  344. data/lib/libv8/v8/src/debug.h +1057 -0
  345. data/lib/libv8/v8/src/deoptimizer.cc +1256 -0
  346. data/lib/libv8/v8/src/deoptimizer.h +602 -0
  347. data/lib/libv8/v8/src/disasm.h +80 -0
  348. data/lib/libv8/v8/src/disassembler.cc +343 -0
  349. data/lib/libv8/v8/src/disassembler.h +58 -0
  350. data/lib/libv8/v8/src/diy-fp.cc +58 -0
  351. data/lib/libv8/v8/src/diy-fp.h +117 -0
  352. data/lib/libv8/v8/src/double.h +238 -0
  353. data/lib/libv8/v8/src/dtoa.cc +103 -0
  354. data/lib/libv8/v8/src/dtoa.h +85 -0
  355. data/lib/libv8/v8/src/execution.cc +849 -0
  356. data/lib/libv8/v8/src/execution.h +297 -0
  357. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +250 -0
  358. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +89 -0
  359. data/lib/libv8/v8/src/extensions/experimental/collator.cc +218 -0
  360. data/lib/libv8/v8/src/extensions/experimental/collator.h +69 -0
  361. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +94 -0
  362. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +78 -0
  363. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +54 -0
  364. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +112 -0
  365. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +60 -0
  366. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +43 -0
  367. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +49 -0
  368. data/lib/libv8/v8/src/extensions/experimental/i18n.js +180 -0
  369. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +251 -0
  370. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +95 -0
  371. data/lib/libv8/v8/src/extensions/externalize-string-extension.cc +141 -0
  372. data/lib/libv8/v8/src/extensions/externalize-string-extension.h +50 -0
  373. data/lib/libv8/v8/src/extensions/gc-extension.cc +58 -0
  374. data/lib/libv8/v8/src/extensions/gc-extension.h +49 -0
  375. data/lib/libv8/v8/src/factory.cc +1222 -0
  376. data/lib/libv8/v8/src/factory.h +442 -0
  377. data/lib/libv8/v8/src/fast-dtoa.cc +736 -0
  378. data/lib/libv8/v8/src/fast-dtoa.h +83 -0
  379. data/lib/libv8/v8/src/fixed-dtoa.cc +405 -0
  380. data/lib/libv8/v8/src/fixed-dtoa.h +55 -0
  381. data/lib/libv8/v8/src/flag-definitions.h +560 -0
  382. data/lib/libv8/v8/src/flags.cc +551 -0
  383. data/lib/libv8/v8/src/flags.h +79 -0
  384. data/lib/libv8/v8/src/frames-inl.h +247 -0
  385. data/lib/libv8/v8/src/frames.cc +1243 -0
  386. data/lib/libv8/v8/src/frames.h +870 -0
  387. data/lib/libv8/v8/src/full-codegen.cc +1374 -0
  388. data/lib/libv8/v8/src/full-codegen.h +771 -0
  389. data/lib/libv8/v8/src/func-name-inferrer.cc +92 -0
  390. data/lib/libv8/v8/src/func-name-inferrer.h +111 -0
  391. data/lib/libv8/v8/src/gdb-jit.cc +1555 -0
  392. data/lib/libv8/v8/src/gdb-jit.h +143 -0
  393. data/lib/libv8/v8/src/global-handles.cc +665 -0
  394. data/lib/libv8/v8/src/global-handles.h +284 -0
  395. data/lib/libv8/v8/src/globals.h +325 -0
  396. data/lib/libv8/v8/src/handles-inl.h +177 -0
  397. data/lib/libv8/v8/src/handles.cc +987 -0
  398. data/lib/libv8/v8/src/handles.h +382 -0
  399. data/lib/libv8/v8/src/hashmap.cc +230 -0
  400. data/lib/libv8/v8/src/hashmap.h +123 -0
  401. data/lib/libv8/v8/src/heap-inl.h +704 -0
  402. data/lib/libv8/v8/src/heap-profiler.cc +1173 -0
  403. data/lib/libv8/v8/src/heap-profiler.h +397 -0
  404. data/lib/libv8/v8/src/heap.cc +5930 -0
  405. data/lib/libv8/v8/src/heap.h +2268 -0
  406. data/lib/libv8/v8/src/hydrogen-instructions.cc +1769 -0
  407. data/lib/libv8/v8/src/hydrogen-instructions.h +3971 -0
  408. data/lib/libv8/v8/src/hydrogen.cc +6239 -0
  409. data/lib/libv8/v8/src/hydrogen.h +1202 -0
  410. data/lib/libv8/v8/src/ia32/assembler-ia32-inl.h +446 -0
  411. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +2487 -0
  412. data/lib/libv8/v8/src/ia32/assembler-ia32.h +1144 -0
  413. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +1621 -0
  414. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +6198 -0
  415. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +517 -0
  416. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +265 -0
  417. data/lib/libv8/v8/src/ia32/codegen-ia32.h +79 -0
  418. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +88 -0
  419. data/lib/libv8/v8/src/ia32/debug-ia32.cc +312 -0
  420. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +774 -0
  421. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +1628 -0
  422. data/lib/libv8/v8/src/ia32/frames-ia32.cc +45 -0
  423. data/lib/libv8/v8/src/ia32/frames-ia32.h +142 -0
  424. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +4338 -0
  425. data/lib/libv8/v8/src/ia32/ic-ia32.cc +1597 -0
  426. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +4461 -0
  427. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +375 -0
  428. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +475 -0
  429. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.h +110 -0
  430. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +2261 -0
  431. data/lib/libv8/v8/src/ia32/lithium-ia32.h +2396 -0
  432. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +2136 -0
  433. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +775 -0
  434. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +1263 -0
  435. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +216 -0
  436. data/lib/libv8/v8/src/ia32/simulator-ia32.cc +30 -0
  437. data/lib/libv8/v8/src/ia32/simulator-ia32.h +74 -0
  438. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +3847 -0
  439. data/lib/libv8/v8/src/ic-inl.h +130 -0
  440. data/lib/libv8/v8/src/ic.cc +2577 -0
  441. data/lib/libv8/v8/src/ic.h +736 -0
  442. data/lib/libv8/v8/src/inspector.cc +63 -0
  443. data/lib/libv8/v8/src/inspector.h +62 -0
  444. data/lib/libv8/v8/src/interpreter-irregexp.cc +659 -0
  445. data/lib/libv8/v8/src/interpreter-irregexp.h +49 -0
  446. data/lib/libv8/v8/src/isolate-inl.h +50 -0
  447. data/lib/libv8/v8/src/isolate.cc +1869 -0
  448. data/lib/libv8/v8/src/isolate.h +1382 -0
  449. data/lib/libv8/v8/src/json-parser.cc +504 -0
  450. data/lib/libv8/v8/src/json-parser.h +161 -0
  451. data/lib/libv8/v8/src/json.js +342 -0
  452. data/lib/libv8/v8/src/jsregexp.cc +5385 -0
  453. data/lib/libv8/v8/src/jsregexp.h +1492 -0
  454. data/lib/libv8/v8/src/list-inl.h +212 -0
  455. data/lib/libv8/v8/src/list.h +174 -0
  456. data/lib/libv8/v8/src/lithium-allocator-inl.h +142 -0
  457. data/lib/libv8/v8/src/lithium-allocator.cc +2123 -0
  458. data/lib/libv8/v8/src/lithium-allocator.h +630 -0
  459. data/lib/libv8/v8/src/lithium.cc +190 -0
  460. data/lib/libv8/v8/src/lithium.h +597 -0
  461. data/lib/libv8/v8/src/liveedit-debugger.js +1082 -0
  462. data/lib/libv8/v8/src/liveedit.cc +1691 -0
  463. data/lib/libv8/v8/src/liveedit.h +180 -0
  464. data/lib/libv8/v8/src/liveobjectlist-inl.h +126 -0
  465. data/lib/libv8/v8/src/liveobjectlist.cc +2589 -0
  466. data/lib/libv8/v8/src/liveobjectlist.h +322 -0
  467. data/lib/libv8/v8/src/log-inl.h +59 -0
  468. data/lib/libv8/v8/src/log-utils.cc +428 -0
  469. data/lib/libv8/v8/src/log-utils.h +231 -0
  470. data/lib/libv8/v8/src/log.cc +1993 -0
  471. data/lib/libv8/v8/src/log.h +476 -0
  472. data/lib/libv8/v8/src/macro-assembler.h +120 -0
  473. data/lib/libv8/v8/src/macros.py +178 -0
  474. data/lib/libv8/v8/src/mark-compact.cc +3143 -0
  475. data/lib/libv8/v8/src/mark-compact.h +506 -0
  476. data/lib/libv8/v8/src/math.js +264 -0
  477. data/lib/libv8/v8/src/messages.cc +179 -0
  478. data/lib/libv8/v8/src/messages.h +113 -0
  479. data/lib/libv8/v8/src/messages.js +1096 -0
  480. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +312 -0
  481. data/lib/libv8/v8/src/mips/assembler-mips.cc +1960 -0
  482. data/lib/libv8/v8/src/mips/assembler-mips.h +1138 -0
  483. data/lib/libv8/v8/src/mips/builtins-mips.cc +1628 -0
  484. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +6656 -0
  485. data/lib/libv8/v8/src/mips/code-stubs-mips.h +682 -0
  486. data/lib/libv8/v8/src/mips/codegen-mips.cc +52 -0
  487. data/lib/libv8/v8/src/mips/codegen-mips.h +98 -0
  488. data/lib/libv8/v8/src/mips/constants-mips.cc +352 -0
  489. data/lib/libv8/v8/src/mips/constants-mips.h +739 -0
  490. data/lib/libv8/v8/src/mips/cpu-mips.cc +96 -0
  491. data/lib/libv8/v8/src/mips/debug-mips.cc +308 -0
  492. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +91 -0
  493. data/lib/libv8/v8/src/mips/disasm-mips.cc +1050 -0
  494. data/lib/libv8/v8/src/mips/frames-mips.cc +47 -0
  495. data/lib/libv8/v8/src/mips/frames-mips.h +219 -0
  496. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +4388 -0
  497. data/lib/libv8/v8/src/mips/ic-mips.cc +1580 -0
  498. data/lib/libv8/v8/src/mips/lithium-codegen-mips.h +65 -0
  499. data/lib/libv8/v8/src/mips/lithium-mips.h +307 -0
  500. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +4056 -0
  501. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +1214 -0
  502. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +1251 -0
  503. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +252 -0
  504. data/lib/libv8/v8/src/mips/simulator-mips.cc +2621 -0
  505. data/lib/libv8/v8/src/mips/simulator-mips.h +401 -0
  506. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +4285 -0
  507. data/lib/libv8/v8/src/mirror-debugger.js +2382 -0
  508. data/lib/libv8/v8/src/mksnapshot.cc +328 -0
  509. data/lib/libv8/v8/src/natives.h +64 -0
  510. data/lib/libv8/v8/src/objects-debug.cc +738 -0
  511. data/lib/libv8/v8/src/objects-inl.h +4323 -0
  512. data/lib/libv8/v8/src/objects-printer.cc +829 -0
  513. data/lib/libv8/v8/src/objects-visiting.cc +148 -0
  514. data/lib/libv8/v8/src/objects-visiting.h +424 -0
  515. data/lib/libv8/v8/src/objects.cc +10585 -0
  516. data/lib/libv8/v8/src/objects.h +6838 -0
  517. data/lib/libv8/v8/src/parser.cc +4997 -0
  518. data/lib/libv8/v8/src/parser.h +765 -0
  519. data/lib/libv8/v8/src/platform-cygwin.cc +779 -0
  520. data/lib/libv8/v8/src/platform-freebsd.cc +826 -0
  521. data/lib/libv8/v8/src/platform-linux.cc +1149 -0
  522. data/lib/libv8/v8/src/platform-macos.cc +830 -0
  523. data/lib/libv8/v8/src/platform-nullos.cc +479 -0
  524. data/lib/libv8/v8/src/platform-openbsd.cc +640 -0
  525. data/lib/libv8/v8/src/platform-posix.cc +424 -0
  526. data/lib/libv8/v8/src/platform-solaris.cc +762 -0
  527. data/lib/libv8/v8/src/platform-tls-mac.h +62 -0
  528. data/lib/libv8/v8/src/platform-tls-win32.h +62 -0
  529. data/lib/libv8/v8/src/platform-tls.h +50 -0
  530. data/lib/libv8/v8/src/platform-win32.cc +2021 -0
  531. data/lib/libv8/v8/src/platform.h +667 -0
  532. data/lib/libv8/v8/src/preparse-data-format.h +62 -0
  533. data/lib/libv8/v8/src/preparse-data.cc +183 -0
  534. data/lib/libv8/v8/src/preparse-data.h +225 -0
  535. data/lib/libv8/v8/src/preparser-api.cc +220 -0
  536. data/lib/libv8/v8/src/preparser.cc +1450 -0
  537. data/lib/libv8/v8/src/preparser.h +493 -0
  538. data/lib/libv8/v8/src/prettyprinter.cc +1493 -0
  539. data/lib/libv8/v8/src/prettyprinter.h +223 -0
  540. data/lib/libv8/v8/src/profile-generator-inl.h +128 -0
  541. data/lib/libv8/v8/src/profile-generator.cc +3098 -0
  542. data/lib/libv8/v8/src/profile-generator.h +1126 -0
  543. data/lib/libv8/v8/src/property.cc +105 -0
  544. data/lib/libv8/v8/src/property.h +365 -0
  545. data/lib/libv8/v8/src/proxy.js +83 -0
  546. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp-inl.h +78 -0
  547. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.cc +471 -0
  548. data/lib/libv8/v8/src/regexp-macro-assembler-irregexp.h +142 -0
  549. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.cc +373 -0
  550. data/lib/libv8/v8/src/regexp-macro-assembler-tracer.h +104 -0
  551. data/lib/libv8/v8/src/regexp-macro-assembler.cc +267 -0
  552. data/lib/libv8/v8/src/regexp-macro-assembler.h +243 -0
  553. data/lib/libv8/v8/src/regexp-stack.cc +111 -0
  554. data/lib/libv8/v8/src/regexp-stack.h +147 -0
  555. data/lib/libv8/v8/src/regexp.js +483 -0
  556. data/lib/libv8/v8/src/rewriter.cc +360 -0
  557. data/lib/libv8/v8/src/rewriter.h +50 -0
  558. data/lib/libv8/v8/src/runtime-profiler.cc +489 -0
  559. data/lib/libv8/v8/src/runtime-profiler.h +201 -0
  560. data/lib/libv8/v8/src/runtime.cc +12227 -0
  561. data/lib/libv8/v8/src/runtime.h +652 -0
  562. data/lib/libv8/v8/src/runtime.js +649 -0
  563. data/lib/libv8/v8/src/safepoint-table.cc +256 -0
  564. data/lib/libv8/v8/src/safepoint-table.h +270 -0
  565. data/lib/libv8/v8/src/scanner-base.cc +952 -0
  566. data/lib/libv8/v8/src/scanner-base.h +670 -0
  567. data/lib/libv8/v8/src/scanner.cc +345 -0
  568. data/lib/libv8/v8/src/scanner.h +146 -0
  569. data/lib/libv8/v8/src/scopeinfo.cc +646 -0
  570. data/lib/libv8/v8/src/scopeinfo.h +254 -0
  571. data/lib/libv8/v8/src/scopes.cc +1150 -0
  572. data/lib/libv8/v8/src/scopes.h +507 -0
  573. data/lib/libv8/v8/src/serialize.cc +1574 -0
  574. data/lib/libv8/v8/src/serialize.h +589 -0
  575. data/lib/libv8/v8/src/shell.h +55 -0
  576. data/lib/libv8/v8/src/simulator.h +43 -0
  577. data/lib/libv8/v8/src/small-pointer-list.h +163 -0
  578. data/lib/libv8/v8/src/smart-pointer.h +109 -0
  579. data/lib/libv8/v8/src/snapshot-common.cc +83 -0
  580. data/lib/libv8/v8/src/snapshot-empty.cc +54 -0
  581. data/lib/libv8/v8/src/snapshot.h +91 -0
  582. data/lib/libv8/v8/src/spaces-inl.h +529 -0
  583. data/lib/libv8/v8/src/spaces.cc +3145 -0
  584. data/lib/libv8/v8/src/spaces.h +2369 -0
  585. data/lib/libv8/v8/src/splay-tree-inl.h +310 -0
  586. data/lib/libv8/v8/src/splay-tree.h +205 -0
  587. data/lib/libv8/v8/src/string-search.cc +41 -0
  588. data/lib/libv8/v8/src/string-search.h +568 -0
  589. data/lib/libv8/v8/src/string-stream.cc +592 -0
  590. data/lib/libv8/v8/src/string-stream.h +191 -0
  591. data/lib/libv8/v8/src/string.js +994 -0
  592. data/lib/libv8/v8/src/strtod.cc +440 -0
  593. data/lib/libv8/v8/src/strtod.h +40 -0
  594. data/lib/libv8/v8/src/stub-cache.cc +1965 -0
  595. data/lib/libv8/v8/src/stub-cache.h +924 -0
  596. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +3925 -0
  597. data/lib/libv8/v8/src/token.cc +63 -0
  598. data/lib/libv8/v8/src/token.h +288 -0
  599. data/lib/libv8/v8/src/type-info.cc +507 -0
  600. data/lib/libv8/v8/src/type-info.h +272 -0
  601. data/lib/libv8/v8/src/unbound-queue-inl.h +95 -0
  602. data/lib/libv8/v8/src/unbound-queue.h +69 -0
  603. data/lib/libv8/v8/src/unicode-inl.h +238 -0
  604. data/lib/libv8/v8/src/unicode.cc +1624 -0
  605. data/lib/libv8/v8/src/unicode.h +280 -0
  606. data/lib/libv8/v8/src/uri.js +408 -0
  607. data/lib/libv8/v8/src/utils-inl.h +48 -0
  608. data/lib/libv8/v8/src/utils.cc +371 -0
  609. data/lib/libv8/v8/src/utils.h +800 -0
  610. data/lib/libv8/v8/src/v8-counters.cc +62 -0
  611. data/lib/libv8/v8/src/v8-counters.h +314 -0
  612. data/lib/libv8/v8/src/v8.cc +213 -0
  613. data/lib/libv8/v8/src/v8.h +131 -0
  614. data/lib/libv8/v8/src/v8checks.h +64 -0
  615. data/lib/libv8/v8/src/v8dll-main.cc +44 -0
  616. data/lib/libv8/v8/src/v8globals.h +512 -0
  617. data/lib/libv8/v8/src/v8memory.h +82 -0
  618. data/lib/libv8/v8/src/v8natives.js +1310 -0
  619. data/lib/libv8/v8/src/v8preparserdll-main.cc +39 -0
  620. data/lib/libv8/v8/src/v8threads.cc +464 -0
  621. data/lib/libv8/v8/src/v8threads.h +165 -0
  622. data/lib/libv8/v8/src/v8utils.h +319 -0
  623. data/lib/libv8/v8/src/variables.cc +114 -0
  624. data/lib/libv8/v8/src/variables.h +167 -0
  625. data/lib/libv8/v8/src/version.cc +116 -0
  626. data/lib/libv8/v8/src/version.h +68 -0
  627. data/lib/libv8/v8/src/vm-state-inl.h +138 -0
  628. data/lib/libv8/v8/src/vm-state.h +71 -0
  629. data/lib/libv8/v8/src/win32-headers.h +96 -0
  630. data/lib/libv8/v8/src/x64/assembler-x64-inl.h +462 -0
  631. data/lib/libv8/v8/src/x64/assembler-x64.cc +3027 -0
  632. data/lib/libv8/v8/src/x64/assembler-x64.h +1633 -0
  633. data/lib/libv8/v8/src/x64/builtins-x64.cc +1520 -0
  634. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +5132 -0
  635. data/lib/libv8/v8/src/x64/code-stubs-x64.h +514 -0
  636. data/lib/libv8/v8/src/x64/codegen-x64.cc +146 -0
  637. data/lib/libv8/v8/src/x64/codegen-x64.h +76 -0
  638. data/lib/libv8/v8/src/x64/cpu-x64.cc +88 -0
  639. data/lib/libv8/v8/src/x64/debug-x64.cc +319 -0
  640. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +815 -0
  641. data/lib/libv8/v8/src/x64/disasm-x64.cc +1832 -0
  642. data/lib/libv8/v8/src/x64/frames-x64.cc +45 -0
  643. data/lib/libv8/v8/src/x64/frames-x64.h +130 -0
  644. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +4318 -0
  645. data/lib/libv8/v8/src/x64/ic-x64.cc +1608 -0
  646. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +4267 -0
  647. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +367 -0
  648. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.cc +320 -0
  649. data/lib/libv8/v8/src/x64/lithium-gap-resolver-x64.h +74 -0
  650. data/lib/libv8/v8/src/x64/lithium-x64.cc +2202 -0
  651. data/lib/libv8/v8/src/x64/lithium-x64.h +2333 -0
  652. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +3745 -0
  653. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +1290 -0
  654. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +1398 -0
  655. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +282 -0
  656. data/lib/libv8/v8/src/x64/simulator-x64.cc +27 -0
  657. data/lib/libv8/v8/src/x64/simulator-x64.h +72 -0
  658. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +3610 -0
  659. data/lib/libv8/v8/src/zone-inl.h +140 -0
  660. data/lib/libv8/v8/src/zone.cc +196 -0
  661. data/lib/libv8/v8/src/zone.h +240 -0
  662. data/lib/libv8/v8/tools/codemap.js +265 -0
  663. data/lib/libv8/v8/tools/consarray.js +93 -0
  664. data/lib/libv8/v8/tools/csvparser.js +78 -0
  665. data/lib/libv8/v8/tools/disasm.py +92 -0
  666. data/lib/libv8/v8/tools/freebsd-tick-processor +10 -0
  667. data/lib/libv8/v8/tools/gc-nvp-trace-processor.py +342 -0
  668. data/lib/libv8/v8/tools/gcmole/README +62 -0
  669. data/lib/libv8/v8/tools/gcmole/gccause.lua +60 -0
  670. data/lib/libv8/v8/tools/gcmole/gcmole.cc +1261 -0
  671. data/lib/libv8/v8/tools/gcmole/gcmole.lua +378 -0
  672. data/lib/libv8/v8/tools/generate-ten-powers.scm +286 -0
  673. data/lib/libv8/v8/tools/grokdump.py +841 -0
  674. data/lib/libv8/v8/tools/gyp/v8.gyp +995 -0
  675. data/lib/libv8/v8/tools/js2c.py +364 -0
  676. data/lib/libv8/v8/tools/jsmin.py +280 -0
  677. data/lib/libv8/v8/tools/linux-tick-processor +35 -0
  678. data/lib/libv8/v8/tools/ll_prof.py +942 -0
  679. data/lib/libv8/v8/tools/logreader.js +185 -0
  680. data/lib/libv8/v8/tools/mac-nm +18 -0
  681. data/lib/libv8/v8/tools/mac-tick-processor +6 -0
  682. data/lib/libv8/v8/tools/oom_dump/README +31 -0
  683. data/lib/libv8/v8/tools/oom_dump/SConstruct +42 -0
  684. data/lib/libv8/v8/tools/oom_dump/oom_dump.cc +288 -0
  685. data/lib/libv8/v8/tools/presubmit.py +305 -0
  686. data/lib/libv8/v8/tools/process-heap-prof.py +120 -0
  687. data/lib/libv8/v8/tools/profile.js +751 -0
  688. data/lib/libv8/v8/tools/profile_view.js +219 -0
  689. data/lib/libv8/v8/tools/run-valgrind.py +77 -0
  690. data/lib/libv8/v8/tools/splaytree.js +316 -0
  691. data/lib/libv8/v8/tools/stats-viewer.py +468 -0
  692. data/lib/libv8/v8/tools/test.py +1510 -0
  693. data/lib/libv8/v8/tools/tickprocessor-driver.js +59 -0
  694. data/lib/libv8/v8/tools/tickprocessor.js +877 -0
  695. data/lib/libv8/v8/tools/utils.py +96 -0
  696. data/lib/libv8/v8/tools/visual_studio/README.txt +12 -0
  697. data/lib/libv8/v8/tools/windows-tick-processor.bat +30 -0
  698. data/lib/libv8/version.rb +4 -0
  699. data/libv8.gemspec +31 -0
  700. metadata +800 -0
@@ -0,0 +1,49 @@
1
+ // Copyright 2008 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ // A simple interpreter for the Irregexp byte code.
29
+
30
+ #ifndef V8_INTERPRETER_IRREGEXP_H_
31
+ #define V8_INTERPRETER_IRREGEXP_H_
32
+
33
+ namespace v8 {
34
+ namespace internal {
35
+
36
+
37
+ class IrregexpInterpreter {
38
+ public:
39
+ static bool Match(Isolate* isolate,
40
+ Handle<ByteArray> code,
41
+ Handle<String> subject,
42
+ int* captures,
43
+ int start_position);
44
+ };
45
+
46
+
47
+ } } // namespace v8::internal
48
+
49
+ #endif // V8_INTERPRETER_IRREGEXP_H_
@@ -0,0 +1,50 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef V8_ISOLATE_INL_H_
29
+ #define V8_ISOLATE_INL_H_
30
+
31
+ #include "isolate.h"
32
+
33
+ #include "debug.h"
34
+
35
+ namespace v8 {
36
+ namespace internal {
37
+
38
+
39
+ bool Isolate::DebuggerHasBreakPoints() {
40
+ #ifdef ENABLE_DEBUGGER_SUPPORT
41
+ return debug()->has_break_points();
42
+ #else
43
+ return false;
44
+ #endif
45
+ }
46
+
47
+
48
+ } } // namespace v8::internal
49
+
50
+ #endif // V8_ISOLATE_INL_H_
@@ -0,0 +1,1869 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #include <stdlib.h>
29
+
30
+ #include "v8.h"
31
+
32
+ #include "ast.h"
33
+ #include "bootstrapper.h"
34
+ #include "codegen.h"
35
+ #include "compilation-cache.h"
36
+ #include "debug.h"
37
+ #include "deoptimizer.h"
38
+ #include "heap-profiler.h"
39
+ #include "hydrogen.h"
40
+ #include "isolate.h"
41
+ #include "lithium-allocator.h"
42
+ #include "log.h"
43
+ #include "messages.h"
44
+ #include "regexp-stack.h"
45
+ #include "runtime-profiler.h"
46
+ #include "scanner.h"
47
+ #include "scopeinfo.h"
48
+ #include "serialize.h"
49
+ #include "simulator.h"
50
+ #include "spaces.h"
51
+ #include "stub-cache.h"
52
+ #include "version.h"
53
+ #include "vm-state-inl.h"
54
+
55
+
56
+ namespace v8 {
57
+ namespace internal {
58
+
59
+ Atomic32 ThreadId::highest_thread_id_ = 0;
60
+
61
+ int ThreadId::AllocateThreadId() {
62
+ int new_id = NoBarrier_AtomicIncrement(&highest_thread_id_, 1);
63
+ return new_id;
64
+ }
65
+
66
+
67
+ int ThreadId::GetCurrentThreadId() {
68
+ int thread_id = Thread::GetThreadLocalInt(Isolate::thread_id_key_);
69
+ if (thread_id == 0) {
70
+ thread_id = AllocateThreadId();
71
+ Thread::SetThreadLocalInt(Isolate::thread_id_key_, thread_id);
72
+ }
73
+ return thread_id;
74
+ }
75
+
76
+
77
+ ThreadLocalTop::ThreadLocalTop() {
78
+ InitializeInternal();
79
+ }
80
+
81
+
82
+ void ThreadLocalTop::InitializeInternal() {
83
+ c_entry_fp_ = 0;
84
+ handler_ = 0;
85
+ #ifdef USE_SIMULATOR
86
+ simulator_ = NULL;
87
+ #endif
88
+ #ifdef ENABLE_LOGGING_AND_PROFILING
89
+ js_entry_sp_ = NULL;
90
+ external_callback_ = NULL;
91
+ #endif
92
+ #ifdef ENABLE_VMSTATE_TRACKING
93
+ current_vm_state_ = EXTERNAL;
94
+ #endif
95
+ try_catch_handler_address_ = NULL;
96
+ context_ = NULL;
97
+ thread_id_ = ThreadId::Invalid();
98
+ external_caught_exception_ = false;
99
+ failed_access_check_callback_ = NULL;
100
+ save_context_ = NULL;
101
+ catcher_ = NULL;
102
+ }
103
+
104
+
105
+ void ThreadLocalTop::Initialize() {
106
+ InitializeInternal();
107
+ #ifdef USE_SIMULATOR
108
+ #ifdef V8_TARGET_ARCH_ARM
109
+ simulator_ = Simulator::current(isolate_);
110
+ #elif V8_TARGET_ARCH_MIPS
111
+ simulator_ = Simulator::current(isolate_);
112
+ #endif
113
+ #endif
114
+ thread_id_ = ThreadId::Current();
115
+ }
116
+
117
+
118
+ v8::TryCatch* ThreadLocalTop::TryCatchHandler() {
119
+ return TRY_CATCH_FROM_ADDRESS(try_catch_handler_address());
120
+ }
121
+
122
+
123
+ // Create a dummy thread that will wait forever on a semaphore. The only
124
+ // purpose for this thread is to have some stack area to save essential data
125
+ // into for use by a stacks only core dump (aka minidump).
126
+ class PreallocatedMemoryThread: public Thread {
127
+ public:
128
+ char* data() {
129
+ if (data_ready_semaphore_ != NULL) {
130
+ // Initial access is guarded until the data has been published.
131
+ data_ready_semaphore_->Wait();
132
+ delete data_ready_semaphore_;
133
+ data_ready_semaphore_ = NULL;
134
+ }
135
+ return data_;
136
+ }
137
+
138
+ unsigned length() {
139
+ if (data_ready_semaphore_ != NULL) {
140
+ // Initial access is guarded until the data has been published.
141
+ data_ready_semaphore_->Wait();
142
+ delete data_ready_semaphore_;
143
+ data_ready_semaphore_ = NULL;
144
+ }
145
+ return length_;
146
+ }
147
+
148
+ // Stop the PreallocatedMemoryThread and release its resources.
149
+ void StopThread() {
150
+ keep_running_ = false;
151
+ wait_for_ever_semaphore_->Signal();
152
+
153
+ // Wait for the thread to terminate.
154
+ Join();
155
+
156
+ if (data_ready_semaphore_ != NULL) {
157
+ delete data_ready_semaphore_;
158
+ data_ready_semaphore_ = NULL;
159
+ }
160
+
161
+ delete wait_for_ever_semaphore_;
162
+ wait_for_ever_semaphore_ = NULL;
163
+ }
164
+
165
+ protected:
166
+ // When the thread starts running it will allocate a fixed number of bytes
167
+ // on the stack and publish the location of this memory for others to use.
168
+ void Run() {
169
+ EmbeddedVector<char, 15 * 1024> local_buffer;
170
+
171
+ // Initialize the buffer with a known good value.
172
+ OS::StrNCpy(local_buffer, "Trace data was not generated.\n",
173
+ local_buffer.length());
174
+
175
+ // Publish the local buffer and signal its availability.
176
+ data_ = local_buffer.start();
177
+ length_ = local_buffer.length();
178
+ data_ready_semaphore_->Signal();
179
+
180
+ while (keep_running_) {
181
+ // This thread will wait here until the end of time.
182
+ wait_for_ever_semaphore_->Wait();
183
+ }
184
+
185
+ // Make sure we access the buffer after the wait to remove all possibility
186
+ // of it being optimized away.
187
+ OS::StrNCpy(local_buffer, "PreallocatedMemoryThread shutting down.\n",
188
+ local_buffer.length());
189
+ }
190
+
191
+
192
+ private:
193
+ explicit PreallocatedMemoryThread(Isolate* isolate)
194
+ : Thread(isolate, "v8:PreallocMem"),
195
+ keep_running_(true),
196
+ wait_for_ever_semaphore_(OS::CreateSemaphore(0)),
197
+ data_ready_semaphore_(OS::CreateSemaphore(0)),
198
+ data_(NULL),
199
+ length_(0) {
200
+ }
201
+
202
+ // Used to make sure that the thread keeps looping even for spurious wakeups.
203
+ bool keep_running_;
204
+
205
+ // This semaphore is used by the PreallocatedMemoryThread to wait for ever.
206
+ Semaphore* wait_for_ever_semaphore_;
207
+ // Semaphore to signal that the data has been initialized.
208
+ Semaphore* data_ready_semaphore_;
209
+
210
+ // Location and size of the preallocated memory block.
211
+ char* data_;
212
+ unsigned length_;
213
+
214
+ friend class Isolate;
215
+
216
+ DISALLOW_COPY_AND_ASSIGN(PreallocatedMemoryThread);
217
+ };
218
+
219
+
220
+ void Isolate::PreallocatedMemoryThreadStart() {
221
+ if (preallocated_memory_thread_ != NULL) return;
222
+ preallocated_memory_thread_ = new PreallocatedMemoryThread(this);
223
+ preallocated_memory_thread_->Start();
224
+ }
225
+
226
+
227
+ void Isolate::PreallocatedMemoryThreadStop() {
228
+ if (preallocated_memory_thread_ == NULL) return;
229
+ preallocated_memory_thread_->StopThread();
230
+ // Done with the thread entirely.
231
+ delete preallocated_memory_thread_;
232
+ preallocated_memory_thread_ = NULL;
233
+ }
234
+
235
+
236
+ void Isolate::PreallocatedStorageInit(size_t size) {
237
+ ASSERT(free_list_.next_ == &free_list_);
238
+ ASSERT(free_list_.previous_ == &free_list_);
239
+ PreallocatedStorage* free_chunk =
240
+ reinterpret_cast<PreallocatedStorage*>(new char[size]);
241
+ free_list_.next_ = free_list_.previous_ = free_chunk;
242
+ free_chunk->next_ = free_chunk->previous_ = &free_list_;
243
+ free_chunk->size_ = size - sizeof(PreallocatedStorage);
244
+ preallocated_storage_preallocated_ = true;
245
+ }
246
+
247
+
248
+ void* Isolate::PreallocatedStorageNew(size_t size) {
249
+ if (!preallocated_storage_preallocated_) {
250
+ return FreeStoreAllocationPolicy::New(size);
251
+ }
252
+ ASSERT(free_list_.next_ != &free_list_);
253
+ ASSERT(free_list_.previous_ != &free_list_);
254
+
255
+ size = (size + kPointerSize - 1) & ~(kPointerSize - 1);
256
+ // Search for exact fit.
257
+ for (PreallocatedStorage* storage = free_list_.next_;
258
+ storage != &free_list_;
259
+ storage = storage->next_) {
260
+ if (storage->size_ == size) {
261
+ storage->Unlink();
262
+ storage->LinkTo(&in_use_list_);
263
+ return reinterpret_cast<void*>(storage + 1);
264
+ }
265
+ }
266
+ // Search for first fit.
267
+ for (PreallocatedStorage* storage = free_list_.next_;
268
+ storage != &free_list_;
269
+ storage = storage->next_) {
270
+ if (storage->size_ >= size + sizeof(PreallocatedStorage)) {
271
+ storage->Unlink();
272
+ storage->LinkTo(&in_use_list_);
273
+ PreallocatedStorage* left_over =
274
+ reinterpret_cast<PreallocatedStorage*>(
275
+ reinterpret_cast<char*>(storage + 1) + size);
276
+ left_over->size_ = storage->size_ - size - sizeof(PreallocatedStorage);
277
+ ASSERT(size + left_over->size_ + sizeof(PreallocatedStorage) ==
278
+ storage->size_);
279
+ storage->size_ = size;
280
+ left_over->LinkTo(&free_list_);
281
+ return reinterpret_cast<void*>(storage + 1);
282
+ }
283
+ }
284
+ // Allocation failure.
285
+ ASSERT(false);
286
+ return NULL;
287
+ }
288
+
289
+
290
+ // We don't attempt to coalesce.
291
+ void Isolate::PreallocatedStorageDelete(void* p) {
292
+ if (p == NULL) {
293
+ return;
294
+ }
295
+ if (!preallocated_storage_preallocated_) {
296
+ FreeStoreAllocationPolicy::Delete(p);
297
+ return;
298
+ }
299
+ PreallocatedStorage* storage = reinterpret_cast<PreallocatedStorage*>(p) - 1;
300
+ ASSERT(storage->next_->previous_ == storage);
301
+ ASSERT(storage->previous_->next_ == storage);
302
+ storage->Unlink();
303
+ storage->LinkTo(&free_list_);
304
+ }
305
+
306
+
307
+ Isolate* Isolate::default_isolate_ = NULL;
308
+ Thread::LocalStorageKey Isolate::isolate_key_;
309
+ Thread::LocalStorageKey Isolate::thread_id_key_;
310
+ Thread::LocalStorageKey Isolate::per_isolate_thread_data_key_;
311
+ Mutex* Isolate::process_wide_mutex_ = OS::CreateMutex();
312
+ Isolate::ThreadDataTable* Isolate::thread_data_table_ = NULL;
313
+
314
+
315
+ class IsolateInitializer {
316
+ public:
317
+ IsolateInitializer() {
318
+ Isolate::EnsureDefaultIsolate();
319
+ }
320
+ };
321
+
322
+ static IsolateInitializer* EnsureDefaultIsolateAllocated() {
323
+ // TODO(isolates): Use the system threading API to do this once?
324
+ static IsolateInitializer static_initializer;
325
+ return &static_initializer;
326
+ }
327
+
328
+ // This variable only needed to trigger static intialization.
329
+ static IsolateInitializer* static_initializer = EnsureDefaultIsolateAllocated();
330
+
331
+
332
+
333
+
334
+
335
+ Isolate::PerIsolateThreadData* Isolate::AllocatePerIsolateThreadData(
336
+ ThreadId thread_id) {
337
+ ASSERT(!thread_id.Equals(ThreadId::Invalid()));
338
+ PerIsolateThreadData* per_thread = new PerIsolateThreadData(this, thread_id);
339
+ {
340
+ ScopedLock lock(process_wide_mutex_);
341
+ ASSERT(thread_data_table_->Lookup(this, thread_id) == NULL);
342
+ thread_data_table_->Insert(per_thread);
343
+ ASSERT(thread_data_table_->Lookup(this, thread_id) == per_thread);
344
+ }
345
+ return per_thread;
346
+ }
347
+
348
+
349
+ Isolate::PerIsolateThreadData*
350
+ Isolate::FindOrAllocatePerThreadDataForThisThread() {
351
+ ThreadId thread_id = ThreadId::Current();
352
+ PerIsolateThreadData* per_thread = NULL;
353
+ {
354
+ ScopedLock lock(process_wide_mutex_);
355
+ per_thread = thread_data_table_->Lookup(this, thread_id);
356
+ if (per_thread == NULL) {
357
+ per_thread = AllocatePerIsolateThreadData(thread_id);
358
+ }
359
+ }
360
+ return per_thread;
361
+ }
362
+
363
+
364
+ Isolate::PerIsolateThreadData* Isolate::FindPerThreadDataForThisThread() {
365
+ ThreadId thread_id = ThreadId::Current();
366
+ PerIsolateThreadData* per_thread = NULL;
367
+ {
368
+ ScopedLock lock(process_wide_mutex_);
369
+ per_thread = thread_data_table_->Lookup(this, thread_id);
370
+ }
371
+ return per_thread;
372
+ }
373
+
374
+
375
+ void Isolate::EnsureDefaultIsolate() {
376
+ ScopedLock lock(process_wide_mutex_);
377
+ if (default_isolate_ == NULL) {
378
+ isolate_key_ = Thread::CreateThreadLocalKey();
379
+ thread_id_key_ = Thread::CreateThreadLocalKey();
380
+ per_isolate_thread_data_key_ = Thread::CreateThreadLocalKey();
381
+ thread_data_table_ = new Isolate::ThreadDataTable();
382
+ default_isolate_ = new Isolate();
383
+ }
384
+ // Can't use SetIsolateThreadLocals(default_isolate_, NULL) here
385
+ // becase a non-null thread data may be already set.
386
+ if (Thread::GetThreadLocal(isolate_key_) == NULL) {
387
+ Thread::SetThreadLocal(isolate_key_, default_isolate_);
388
+ }
389
+ CHECK(default_isolate_->PreInit());
390
+ }
391
+
392
+
393
+ #ifdef ENABLE_DEBUGGER_SUPPORT
394
+ Debugger* Isolate::GetDefaultIsolateDebugger() {
395
+ EnsureDefaultIsolate();
396
+ return default_isolate_->debugger();
397
+ }
398
+ #endif
399
+
400
+
401
+ StackGuard* Isolate::GetDefaultIsolateStackGuard() {
402
+ EnsureDefaultIsolate();
403
+ return default_isolate_->stack_guard();
404
+ }
405
+
406
+
407
+ void Isolate::EnterDefaultIsolate() {
408
+ EnsureDefaultIsolate();
409
+ ASSERT(default_isolate_ != NULL);
410
+
411
+ PerIsolateThreadData* data = CurrentPerIsolateThreadData();
412
+ // If not yet in default isolate - enter it.
413
+ if (data == NULL || data->isolate() != default_isolate_) {
414
+ default_isolate_->Enter();
415
+ }
416
+ }
417
+
418
+
419
+ Isolate* Isolate::GetDefaultIsolateForLocking() {
420
+ EnsureDefaultIsolate();
421
+ return default_isolate_;
422
+ }
423
+
424
+
425
+ Address Isolate::get_address_from_id(Isolate::AddressId id) {
426
+ return isolate_addresses_[id];
427
+ }
428
+
429
+
430
+ char* Isolate::Iterate(ObjectVisitor* v, char* thread_storage) {
431
+ ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(thread_storage);
432
+ Iterate(v, thread);
433
+ return thread_storage + sizeof(ThreadLocalTop);
434
+ }
435
+
436
+
437
+ void Isolate::IterateThread(ThreadVisitor* v) {
438
+ v->VisitThread(this, thread_local_top());
439
+ }
440
+
441
+
442
+ void Isolate::IterateThread(ThreadVisitor* v, char* t) {
443
+ ThreadLocalTop* thread = reinterpret_cast<ThreadLocalTop*>(t);
444
+ v->VisitThread(this, thread);
445
+ }
446
+
447
+
448
+ void Isolate::Iterate(ObjectVisitor* v, ThreadLocalTop* thread) {
449
+ // Visit the roots from the top for a given thread.
450
+ Object* pending;
451
+ // The pending exception can sometimes be a failure. We can't show
452
+ // that to the GC, which only understands objects.
453
+ if (thread->pending_exception_->ToObject(&pending)) {
454
+ v->VisitPointer(&pending);
455
+ thread->pending_exception_ = pending; // In case GC updated it.
456
+ }
457
+ v->VisitPointer(&(thread->pending_message_obj_));
458
+ v->VisitPointer(BitCast<Object**>(&(thread->pending_message_script_)));
459
+ v->VisitPointer(BitCast<Object**>(&(thread->context_)));
460
+ Object* scheduled;
461
+ if (thread->scheduled_exception_->ToObject(&scheduled)) {
462
+ v->VisitPointer(&scheduled);
463
+ thread->scheduled_exception_ = scheduled;
464
+ }
465
+
466
+ for (v8::TryCatch* block = thread->TryCatchHandler();
467
+ block != NULL;
468
+ block = TRY_CATCH_FROM_ADDRESS(block->next_)) {
469
+ v->VisitPointer(BitCast<Object**>(&(block->exception_)));
470
+ v->VisitPointer(BitCast<Object**>(&(block->message_)));
471
+ }
472
+
473
+ // Iterate over pointers on native execution stack.
474
+ for (StackFrameIterator it(this, thread); !it.done(); it.Advance()) {
475
+ it.frame()->Iterate(v);
476
+ }
477
+ }
478
+
479
+
480
+ void Isolate::Iterate(ObjectVisitor* v) {
481
+ ThreadLocalTop* current_t = thread_local_top();
482
+ Iterate(v, current_t);
483
+ }
484
+
485
+
486
+ void Isolate::RegisterTryCatchHandler(v8::TryCatch* that) {
487
+ // The ARM simulator has a separate JS stack. We therefore register
488
+ // the C++ try catch handler with the simulator and get back an
489
+ // address that can be used for comparisons with addresses into the
490
+ // JS stack. When running without the simulator, the address
491
+ // returned will be the address of the C++ try catch handler itself.
492
+ Address address = reinterpret_cast<Address>(
493
+ SimulatorStack::RegisterCTryCatch(reinterpret_cast<uintptr_t>(that)));
494
+ thread_local_top()->set_try_catch_handler_address(address);
495
+ }
496
+
497
+
498
+ void Isolate::UnregisterTryCatchHandler(v8::TryCatch* that) {
499
+ ASSERT(thread_local_top()->TryCatchHandler() == that);
500
+ thread_local_top()->set_try_catch_handler_address(
501
+ reinterpret_cast<Address>(that->next_));
502
+ thread_local_top()->catcher_ = NULL;
503
+ SimulatorStack::UnregisterCTryCatch();
504
+ }
505
+
506
+
507
+ Handle<String> Isolate::StackTraceString() {
508
+ if (stack_trace_nesting_level_ == 0) {
509
+ stack_trace_nesting_level_++;
510
+ HeapStringAllocator allocator;
511
+ StringStream::ClearMentionedObjectCache();
512
+ StringStream accumulator(&allocator);
513
+ incomplete_message_ = &accumulator;
514
+ PrintStack(&accumulator);
515
+ Handle<String> stack_trace = accumulator.ToString();
516
+ incomplete_message_ = NULL;
517
+ stack_trace_nesting_level_ = 0;
518
+ return stack_trace;
519
+ } else if (stack_trace_nesting_level_ == 1) {
520
+ stack_trace_nesting_level_++;
521
+ OS::PrintError(
522
+ "\n\nAttempt to print stack while printing stack (double fault)\n");
523
+ OS::PrintError(
524
+ "If you are lucky you may find a partial stack dump on stdout.\n\n");
525
+ incomplete_message_->OutputToStdOut();
526
+ return factory()->empty_symbol();
527
+ } else {
528
+ OS::Abort();
529
+ // Unreachable
530
+ return factory()->empty_symbol();
531
+ }
532
+ }
533
+
534
+
535
+ Handle<JSArray> Isolate::CaptureCurrentStackTrace(
536
+ int frame_limit, StackTrace::StackTraceOptions options) {
537
+ // Ensure no negative values.
538
+ int limit = Max(frame_limit, 0);
539
+ Handle<JSArray> stack_trace = factory()->NewJSArray(frame_limit);
540
+
541
+ Handle<String> column_key = factory()->LookupAsciiSymbol("column");
542
+ Handle<String> line_key = factory()->LookupAsciiSymbol("lineNumber");
543
+ Handle<String> script_key = factory()->LookupAsciiSymbol("scriptName");
544
+ Handle<String> name_or_source_url_key =
545
+ factory()->LookupAsciiSymbol("nameOrSourceURL");
546
+ Handle<String> script_name_or_source_url_key =
547
+ factory()->LookupAsciiSymbol("scriptNameOrSourceURL");
548
+ Handle<String> function_key = factory()->LookupAsciiSymbol("functionName");
549
+ Handle<String> eval_key = factory()->LookupAsciiSymbol("isEval");
550
+ Handle<String> constructor_key =
551
+ factory()->LookupAsciiSymbol("isConstructor");
552
+
553
+ StackTraceFrameIterator it(this);
554
+ int frames_seen = 0;
555
+ while (!it.done() && (frames_seen < limit)) {
556
+ JavaScriptFrame* frame = it.frame();
557
+ // Set initial size to the maximum inlining level + 1 for the outermost
558
+ // function.
559
+ List<FrameSummary> frames(Compiler::kMaxInliningLevels + 1);
560
+ frame->Summarize(&frames);
561
+ for (int i = frames.length() - 1; i >= 0 && frames_seen < limit; i--) {
562
+ // Create a JSObject to hold the information for the StackFrame.
563
+ Handle<JSObject> stackFrame = factory()->NewJSObject(object_function());
564
+
565
+ Handle<JSFunction> fun = frames[i].function();
566
+ Handle<Script> script(Script::cast(fun->shared()->script()));
567
+
568
+ if (options & StackTrace::kLineNumber) {
569
+ int script_line_offset = script->line_offset()->value();
570
+ int position = frames[i].code()->SourcePosition(frames[i].pc());
571
+ int line_number = GetScriptLineNumber(script, position);
572
+ // line_number is already shifted by the script_line_offset.
573
+ int relative_line_number = line_number - script_line_offset;
574
+ if (options & StackTrace::kColumnOffset && relative_line_number >= 0) {
575
+ Handle<FixedArray> line_ends(FixedArray::cast(script->line_ends()));
576
+ int start = (relative_line_number == 0) ? 0 :
577
+ Smi::cast(line_ends->get(relative_line_number - 1))->value() + 1;
578
+ int column_offset = position - start;
579
+ if (relative_line_number == 0) {
580
+ // For the case where the code is on the same line as the script
581
+ // tag.
582
+ column_offset += script->column_offset()->value();
583
+ }
584
+ SetLocalPropertyNoThrow(stackFrame, column_key,
585
+ Handle<Smi>(Smi::FromInt(column_offset + 1)));
586
+ }
587
+ SetLocalPropertyNoThrow(stackFrame, line_key,
588
+ Handle<Smi>(Smi::FromInt(line_number + 1)));
589
+ }
590
+
591
+ if (options & StackTrace::kScriptName) {
592
+ Handle<Object> script_name(script->name(), this);
593
+ SetLocalPropertyNoThrow(stackFrame, script_key, script_name);
594
+ }
595
+
596
+ if (options & StackTrace::kScriptNameOrSourceURL) {
597
+ Handle<Object> script_name(script->name(), this);
598
+ Handle<JSValue> script_wrapper = GetScriptWrapper(script);
599
+ Handle<Object> property = GetProperty(script_wrapper,
600
+ name_or_source_url_key);
601
+ ASSERT(property->IsJSFunction());
602
+ Handle<JSFunction> method = Handle<JSFunction>::cast(property);
603
+ bool caught_exception;
604
+ Handle<Object> result = Execution::TryCall(method, script_wrapper, 0,
605
+ NULL, &caught_exception);
606
+ if (caught_exception) {
607
+ result = factory()->undefined_value();
608
+ }
609
+ SetLocalPropertyNoThrow(stackFrame, script_name_or_source_url_key,
610
+ result);
611
+ }
612
+
613
+ if (options & StackTrace::kFunctionName) {
614
+ Handle<Object> fun_name(fun->shared()->name(), this);
615
+ if (fun_name->ToBoolean()->IsFalse()) {
616
+ fun_name = Handle<Object>(fun->shared()->inferred_name(), this);
617
+ }
618
+ SetLocalPropertyNoThrow(stackFrame, function_key, fun_name);
619
+ }
620
+
621
+ if (options & StackTrace::kIsEval) {
622
+ int type = Smi::cast(script->compilation_type())->value();
623
+ Handle<Object> is_eval = (type == Script::COMPILATION_TYPE_EVAL) ?
624
+ factory()->true_value() : factory()->false_value();
625
+ SetLocalPropertyNoThrow(stackFrame, eval_key, is_eval);
626
+ }
627
+
628
+ if (options & StackTrace::kIsConstructor) {
629
+ Handle<Object> is_constructor = (frames[i].is_constructor()) ?
630
+ factory()->true_value() : factory()->false_value();
631
+ SetLocalPropertyNoThrow(stackFrame, constructor_key, is_constructor);
632
+ }
633
+
634
+ FixedArray::cast(stack_trace->elements())->set(frames_seen, *stackFrame);
635
+ frames_seen++;
636
+ }
637
+ it.Advance();
638
+ }
639
+
640
+ stack_trace->set_length(Smi::FromInt(frames_seen));
641
+ return stack_trace;
642
+ }
643
+
644
+
645
+ void Isolate::PrintStack() {
646
+ if (stack_trace_nesting_level_ == 0) {
647
+ stack_trace_nesting_level_++;
648
+
649
+ StringAllocator* allocator;
650
+ if (preallocated_message_space_ == NULL) {
651
+ allocator = new HeapStringAllocator();
652
+ } else {
653
+ allocator = preallocated_message_space_;
654
+ }
655
+
656
+ StringStream::ClearMentionedObjectCache();
657
+ StringStream accumulator(allocator);
658
+ incomplete_message_ = &accumulator;
659
+ PrintStack(&accumulator);
660
+ accumulator.OutputToStdOut();
661
+ accumulator.Log();
662
+ incomplete_message_ = NULL;
663
+ stack_trace_nesting_level_ = 0;
664
+ if (preallocated_message_space_ == NULL) {
665
+ // Remove the HeapStringAllocator created above.
666
+ delete allocator;
667
+ }
668
+ } else if (stack_trace_nesting_level_ == 1) {
669
+ stack_trace_nesting_level_++;
670
+ OS::PrintError(
671
+ "\n\nAttempt to print stack while printing stack (double fault)\n");
672
+ OS::PrintError(
673
+ "If you are lucky you may find a partial stack dump on stdout.\n\n");
674
+ incomplete_message_->OutputToStdOut();
675
+ }
676
+ }
677
+
678
+
679
+ static void PrintFrames(StringStream* accumulator,
680
+ StackFrame::PrintMode mode) {
681
+ StackFrameIterator it;
682
+ for (int i = 0; !it.done(); it.Advance()) {
683
+ it.frame()->Print(accumulator, mode, i++);
684
+ }
685
+ }
686
+
687
+
688
+ void Isolate::PrintStack(StringStream* accumulator) {
689
+ if (!IsInitialized()) {
690
+ accumulator->Add(
691
+ "\n==== Stack trace is not available ==========================\n\n");
692
+ accumulator->Add(
693
+ "\n==== Isolate for the thread is not initialized =============\n\n");
694
+ return;
695
+ }
696
+ // The MentionedObjectCache is not GC-proof at the moment.
697
+ AssertNoAllocation nogc;
698
+ ASSERT(StringStream::IsMentionedObjectCacheClear());
699
+
700
+ // Avoid printing anything if there are no frames.
701
+ if (c_entry_fp(thread_local_top()) == 0) return;
702
+
703
+ accumulator->Add(
704
+ "\n==== Stack trace ============================================\n\n");
705
+ PrintFrames(accumulator, StackFrame::OVERVIEW);
706
+
707
+ accumulator->Add(
708
+ "\n==== Details ================================================\n\n");
709
+ PrintFrames(accumulator, StackFrame::DETAILS);
710
+
711
+ accumulator->PrintMentionedObjectCache();
712
+ accumulator->Add("=====================\n\n");
713
+ }
714
+
715
+
716
+ void Isolate::SetFailedAccessCheckCallback(
717
+ v8::FailedAccessCheckCallback callback) {
718
+ thread_local_top()->failed_access_check_callback_ = callback;
719
+ }
720
+
721
+
722
+ void Isolate::ReportFailedAccessCheck(JSObject* receiver, v8::AccessType type) {
723
+ if (!thread_local_top()->failed_access_check_callback_) return;
724
+
725
+ ASSERT(receiver->IsAccessCheckNeeded());
726
+ ASSERT(context());
727
+
728
+ // Get the data object from access check info.
729
+ JSFunction* constructor = JSFunction::cast(receiver->map()->constructor());
730
+ if (!constructor->shared()->IsApiFunction()) return;
731
+ Object* data_obj =
732
+ constructor->shared()->get_api_func_data()->access_check_info();
733
+ if (data_obj == heap_.undefined_value()) return;
734
+
735
+ HandleScope scope;
736
+ Handle<JSObject> receiver_handle(receiver);
737
+ Handle<Object> data(AccessCheckInfo::cast(data_obj)->data());
738
+ thread_local_top()->failed_access_check_callback_(
739
+ v8::Utils::ToLocal(receiver_handle),
740
+ type,
741
+ v8::Utils::ToLocal(data));
742
+ }
743
+
744
+
745
+ enum MayAccessDecision {
746
+ YES, NO, UNKNOWN
747
+ };
748
+
749
+
750
+ static MayAccessDecision MayAccessPreCheck(Isolate* isolate,
751
+ JSObject* receiver,
752
+ v8::AccessType type) {
753
+ // During bootstrapping, callback functions are not enabled yet.
754
+ if (isolate->bootstrapper()->IsActive()) return YES;
755
+
756
+ if (receiver->IsJSGlobalProxy()) {
757
+ Object* receiver_context = JSGlobalProxy::cast(receiver)->context();
758
+ if (!receiver_context->IsContext()) return NO;
759
+
760
+ // Get the global context of current top context.
761
+ // avoid using Isolate::global_context() because it uses Handle.
762
+ Context* global_context = isolate->context()->global()->global_context();
763
+ if (receiver_context == global_context) return YES;
764
+
765
+ if (Context::cast(receiver_context)->security_token() ==
766
+ global_context->security_token())
767
+ return YES;
768
+ }
769
+
770
+ return UNKNOWN;
771
+ }
772
+
773
+
774
+ bool Isolate::MayNamedAccess(JSObject* receiver, Object* key,
775
+ v8::AccessType type) {
776
+ ASSERT(receiver->IsAccessCheckNeeded());
777
+
778
+ // The callers of this method are not expecting a GC.
779
+ AssertNoAllocation no_gc;
780
+
781
+ // Skip checks for hidden properties access. Note, we do not
782
+ // require existence of a context in this case.
783
+ if (key == heap_.hidden_symbol()) return true;
784
+
785
+ // Check for compatibility between the security tokens in the
786
+ // current lexical context and the accessed object.
787
+ ASSERT(context());
788
+
789
+ MayAccessDecision decision = MayAccessPreCheck(this, receiver, type);
790
+ if (decision != UNKNOWN) return decision == YES;
791
+
792
+ // Get named access check callback
793
+ JSFunction* constructor = JSFunction::cast(receiver->map()->constructor());
794
+ if (!constructor->shared()->IsApiFunction()) return false;
795
+
796
+ Object* data_obj =
797
+ constructor->shared()->get_api_func_data()->access_check_info();
798
+ if (data_obj == heap_.undefined_value()) return false;
799
+
800
+ Object* fun_obj = AccessCheckInfo::cast(data_obj)->named_callback();
801
+ v8::NamedSecurityCallback callback =
802
+ v8::ToCData<v8::NamedSecurityCallback>(fun_obj);
803
+
804
+ if (!callback) return false;
805
+
806
+ HandleScope scope(this);
807
+ Handle<JSObject> receiver_handle(receiver, this);
808
+ Handle<Object> key_handle(key, this);
809
+ Handle<Object> data(AccessCheckInfo::cast(data_obj)->data(), this);
810
+ LOG(this, ApiNamedSecurityCheck(key));
811
+ bool result = false;
812
+ {
813
+ // Leaving JavaScript.
814
+ VMState state(this, EXTERNAL);
815
+ result = callback(v8::Utils::ToLocal(receiver_handle),
816
+ v8::Utils::ToLocal(key_handle),
817
+ type,
818
+ v8::Utils::ToLocal(data));
819
+ }
820
+ return result;
821
+ }
822
+
823
+
824
+ bool Isolate::MayIndexedAccess(JSObject* receiver,
825
+ uint32_t index,
826
+ v8::AccessType type) {
827
+ ASSERT(receiver->IsAccessCheckNeeded());
828
+ // Check for compatibility between the security tokens in the
829
+ // current lexical context and the accessed object.
830
+ ASSERT(context());
831
+
832
+ MayAccessDecision decision = MayAccessPreCheck(this, receiver, type);
833
+ if (decision != UNKNOWN) return decision == YES;
834
+
835
+ // Get indexed access check callback
836
+ JSFunction* constructor = JSFunction::cast(receiver->map()->constructor());
837
+ if (!constructor->shared()->IsApiFunction()) return false;
838
+
839
+ Object* data_obj =
840
+ constructor->shared()->get_api_func_data()->access_check_info();
841
+ if (data_obj == heap_.undefined_value()) return false;
842
+
843
+ Object* fun_obj = AccessCheckInfo::cast(data_obj)->indexed_callback();
844
+ v8::IndexedSecurityCallback callback =
845
+ v8::ToCData<v8::IndexedSecurityCallback>(fun_obj);
846
+
847
+ if (!callback) return false;
848
+
849
+ HandleScope scope(this);
850
+ Handle<JSObject> receiver_handle(receiver, this);
851
+ Handle<Object> data(AccessCheckInfo::cast(data_obj)->data(), this);
852
+ LOG(this, ApiIndexedSecurityCheck(index));
853
+ bool result = false;
854
+ {
855
+ // Leaving JavaScript.
856
+ VMState state(this, EXTERNAL);
857
+ result = callback(v8::Utils::ToLocal(receiver_handle),
858
+ index,
859
+ type,
860
+ v8::Utils::ToLocal(data));
861
+ }
862
+ return result;
863
+ }
864
+
865
+
866
+ const char* const Isolate::kStackOverflowMessage =
867
+ "Uncaught RangeError: Maximum call stack size exceeded";
868
+
869
+
870
+ Failure* Isolate::StackOverflow() {
871
+ HandleScope scope;
872
+ Handle<String> key = factory()->stack_overflow_symbol();
873
+ Handle<JSObject> boilerplate =
874
+ Handle<JSObject>::cast(GetProperty(js_builtins_object(), key));
875
+ Handle<Object> exception = Copy(boilerplate);
876
+ // TODO(1240995): To avoid having to call JavaScript code to compute
877
+ // the message for stack overflow exceptions which is very likely to
878
+ // double fault with another stack overflow exception, we use a
879
+ // precomputed message.
880
+ DoThrow(*exception, NULL);
881
+ return Failure::Exception();
882
+ }
883
+
884
+
885
+ Failure* Isolate::TerminateExecution() {
886
+ DoThrow(heap_.termination_exception(), NULL);
887
+ return Failure::Exception();
888
+ }
889
+
890
+
891
+ Failure* Isolate::Throw(Object* exception, MessageLocation* location) {
892
+ DoThrow(exception, location);
893
+ return Failure::Exception();
894
+ }
895
+
896
+
897
+ Failure* Isolate::ReThrow(MaybeObject* exception, MessageLocation* location) {
898
+ bool can_be_caught_externally = false;
899
+ bool catchable_by_javascript = is_catchable_by_javascript(exception);
900
+ ShouldReportException(&can_be_caught_externally, catchable_by_javascript);
901
+
902
+ thread_local_top()->catcher_ = can_be_caught_externally ?
903
+ try_catch_handler() : NULL;
904
+
905
+ // Set the exception being re-thrown.
906
+ set_pending_exception(exception);
907
+ if (exception->IsFailure()) return exception->ToFailureUnchecked();
908
+ return Failure::Exception();
909
+ }
910
+
911
+
912
+ Failure* Isolate::ThrowIllegalOperation() {
913
+ return Throw(heap_.illegal_access_symbol());
914
+ }
915
+
916
+
917
+ void Isolate::ScheduleThrow(Object* exception) {
918
+ // When scheduling a throw we first throw the exception to get the
919
+ // error reporting if it is uncaught before rescheduling it.
920
+ Throw(exception);
921
+ thread_local_top()->scheduled_exception_ = pending_exception();
922
+ thread_local_top()->external_caught_exception_ = false;
923
+ clear_pending_exception();
924
+ }
925
+
926
+
927
+ Failure* Isolate::PromoteScheduledException() {
928
+ MaybeObject* thrown = scheduled_exception();
929
+ clear_scheduled_exception();
930
+ // Re-throw the exception to avoid getting repeated error reporting.
931
+ return ReThrow(thrown);
932
+ }
933
+
934
+
935
+ void Isolate::PrintCurrentStackTrace(FILE* out) {
936
+ StackTraceFrameIterator it(this);
937
+ while (!it.done()) {
938
+ HandleScope scope;
939
+ // Find code position if recorded in relocation info.
940
+ JavaScriptFrame* frame = it.frame();
941
+ int pos = frame->LookupCode()->SourcePosition(frame->pc());
942
+ Handle<Object> pos_obj(Smi::FromInt(pos));
943
+ // Fetch function and receiver.
944
+ Handle<JSFunction> fun(JSFunction::cast(frame->function()));
945
+ Handle<Object> recv(frame->receiver());
946
+ // Advance to the next JavaScript frame and determine if the
947
+ // current frame is the top-level frame.
948
+ it.Advance();
949
+ Handle<Object> is_top_level = it.done()
950
+ ? factory()->true_value()
951
+ : factory()->false_value();
952
+ // Generate and print stack trace line.
953
+ Handle<String> line =
954
+ Execution::GetStackTraceLine(recv, fun, pos_obj, is_top_level);
955
+ if (line->length() > 0) {
956
+ line->PrintOn(out);
957
+ fprintf(out, "\n");
958
+ }
959
+ }
960
+ }
961
+
962
+
963
+ void Isolate::ComputeLocation(MessageLocation* target) {
964
+ *target = MessageLocation(Handle<Script>(heap_.empty_script()), -1, -1);
965
+ StackTraceFrameIterator it(this);
966
+ if (!it.done()) {
967
+ JavaScriptFrame* frame = it.frame();
968
+ JSFunction* fun = JSFunction::cast(frame->function());
969
+ Object* script = fun->shared()->script();
970
+ if (script->IsScript() &&
971
+ !(Script::cast(script)->source()->IsUndefined())) {
972
+ int pos = frame->LookupCode()->SourcePosition(frame->pc());
973
+ // Compute the location from the function and the reloc info.
974
+ Handle<Script> casted_script(Script::cast(script));
975
+ *target = MessageLocation(casted_script, pos, pos + 1);
976
+ }
977
+ }
978
+ }
979
+
980
+
981
+ bool Isolate::ShouldReportException(bool* can_be_caught_externally,
982
+ bool catchable_by_javascript) {
983
+ // Find the top-most try-catch handler.
984
+ StackHandler* handler =
985
+ StackHandler::FromAddress(Isolate::handler(thread_local_top()));
986
+ while (handler != NULL && !handler->is_try_catch()) {
987
+ handler = handler->next();
988
+ }
989
+
990
+ // Get the address of the external handler so we can compare the address to
991
+ // determine which one is closer to the top of the stack.
992
+ Address external_handler_address =
993
+ thread_local_top()->try_catch_handler_address();
994
+
995
+ // The exception has been externally caught if and only if there is
996
+ // an external handler which is on top of the top-most try-catch
997
+ // handler.
998
+ *can_be_caught_externally = external_handler_address != NULL &&
999
+ (handler == NULL || handler->address() > external_handler_address ||
1000
+ !catchable_by_javascript);
1001
+
1002
+ if (*can_be_caught_externally) {
1003
+ // Only report the exception if the external handler is verbose.
1004
+ return try_catch_handler()->is_verbose_;
1005
+ } else {
1006
+ // Report the exception if it isn't caught by JavaScript code.
1007
+ return handler == NULL;
1008
+ }
1009
+ }
1010
+
1011
+
1012
+ void Isolate::DoThrow(MaybeObject* exception, MessageLocation* location) {
1013
+ ASSERT(!has_pending_exception());
1014
+
1015
+ HandleScope scope;
1016
+ Object* exception_object = Smi::FromInt(0);
1017
+ bool is_object = exception->ToObject(&exception_object);
1018
+ Handle<Object> exception_handle(exception_object);
1019
+
1020
+ // Determine reporting and whether the exception is caught externally.
1021
+ bool catchable_by_javascript = is_catchable_by_javascript(exception);
1022
+ // Only real objects can be caught by JS.
1023
+ ASSERT(!catchable_by_javascript || is_object);
1024
+ bool can_be_caught_externally = false;
1025
+ bool should_report_exception =
1026
+ ShouldReportException(&can_be_caught_externally, catchable_by_javascript);
1027
+ bool report_exception = catchable_by_javascript && should_report_exception;
1028
+
1029
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1030
+ // Notify debugger of exception.
1031
+ if (catchable_by_javascript) {
1032
+ debugger_->OnException(exception_handle, report_exception);
1033
+ }
1034
+ #endif
1035
+
1036
+ // Generate the message.
1037
+ Handle<Object> message_obj;
1038
+ MessageLocation potential_computed_location;
1039
+ bool try_catch_needs_message =
1040
+ can_be_caught_externally &&
1041
+ try_catch_handler()->capture_message_;
1042
+ if (report_exception || try_catch_needs_message) {
1043
+ if (location == NULL) {
1044
+ // If no location was specified we use a computed one instead
1045
+ ComputeLocation(&potential_computed_location);
1046
+ location = &potential_computed_location;
1047
+ }
1048
+ if (!bootstrapper()->IsActive()) {
1049
+ // It's not safe to try to make message objects or collect stack
1050
+ // traces while the bootstrapper is active since the infrastructure
1051
+ // may not have been properly initialized.
1052
+ Handle<String> stack_trace;
1053
+ if (FLAG_trace_exception) stack_trace = StackTraceString();
1054
+ Handle<JSArray> stack_trace_object;
1055
+ if (report_exception && capture_stack_trace_for_uncaught_exceptions_) {
1056
+ stack_trace_object = CaptureCurrentStackTrace(
1057
+ stack_trace_for_uncaught_exceptions_frame_limit_,
1058
+ stack_trace_for_uncaught_exceptions_options_);
1059
+ }
1060
+ ASSERT(is_object); // Can't use the handle unless there's a real object.
1061
+ message_obj = MessageHandler::MakeMessageObject("uncaught_exception",
1062
+ location, HandleVector<Object>(&exception_handle, 1), stack_trace,
1063
+ stack_trace_object);
1064
+ }
1065
+ }
1066
+
1067
+ // Save the message for reporting if the the exception remains uncaught.
1068
+ thread_local_top()->has_pending_message_ = report_exception;
1069
+ if (!message_obj.is_null()) {
1070
+ thread_local_top()->pending_message_obj_ = *message_obj;
1071
+ if (location != NULL) {
1072
+ thread_local_top()->pending_message_script_ = *location->script();
1073
+ thread_local_top()->pending_message_start_pos_ = location->start_pos();
1074
+ thread_local_top()->pending_message_end_pos_ = location->end_pos();
1075
+ }
1076
+ }
1077
+
1078
+ // Do not forget to clean catcher_ if currently thrown exception cannot
1079
+ // be caught. If necessary, ReThrow will update the catcher.
1080
+ thread_local_top()->catcher_ = can_be_caught_externally ?
1081
+ try_catch_handler() : NULL;
1082
+
1083
+ // NOTE: Notifying the debugger or generating the message
1084
+ // may have caused new exceptions. For now, we just ignore
1085
+ // that and set the pending exception to the original one.
1086
+ if (is_object) {
1087
+ set_pending_exception(*exception_handle);
1088
+ } else {
1089
+ // Failures are not on the heap so they neither need nor work with handles.
1090
+ ASSERT(exception_handle->IsFailure());
1091
+ set_pending_exception(exception);
1092
+ }
1093
+ }
1094
+
1095
+
1096
+ bool Isolate::IsExternallyCaught() {
1097
+ ASSERT(has_pending_exception());
1098
+
1099
+ if ((thread_local_top()->catcher_ == NULL) ||
1100
+ (try_catch_handler() != thread_local_top()->catcher_)) {
1101
+ // When throwing the exception, we found no v8::TryCatch
1102
+ // which should care about this exception.
1103
+ return false;
1104
+ }
1105
+
1106
+ if (!is_catchable_by_javascript(pending_exception())) {
1107
+ return true;
1108
+ }
1109
+
1110
+ // Get the address of the external handler so we can compare the address to
1111
+ // determine which one is closer to the top of the stack.
1112
+ Address external_handler_address =
1113
+ thread_local_top()->try_catch_handler_address();
1114
+ ASSERT(external_handler_address != NULL);
1115
+
1116
+ // The exception has been externally caught if and only if there is
1117
+ // an external handler which is on top of the top-most try-finally
1118
+ // handler.
1119
+ // There should be no try-catch blocks as they would prohibit us from
1120
+ // finding external catcher in the first place (see catcher_ check above).
1121
+ //
1122
+ // Note, that finally clause would rethrow an exception unless it's
1123
+ // aborted by jumps in control flow like return, break, etc. and we'll
1124
+ // have another chances to set proper v8::TryCatch.
1125
+ StackHandler* handler =
1126
+ StackHandler::FromAddress(Isolate::handler(thread_local_top()));
1127
+ while (handler != NULL && handler->address() < external_handler_address) {
1128
+ ASSERT(!handler->is_try_catch());
1129
+ if (handler->is_try_finally()) return false;
1130
+
1131
+ handler = handler->next();
1132
+ }
1133
+
1134
+ return true;
1135
+ }
1136
+
1137
+
1138
+ void Isolate::ReportPendingMessages() {
1139
+ ASSERT(has_pending_exception());
1140
+ PropagatePendingExceptionToExternalTryCatch();
1141
+
1142
+ // If the pending exception is OutOfMemoryException set out_of_memory in
1143
+ // the global context. Note: We have to mark the global context here
1144
+ // since the GenerateThrowOutOfMemory stub cannot make a RuntimeCall to
1145
+ // set it.
1146
+ HandleScope scope;
1147
+ if (thread_local_top_.pending_exception_ == Failure::OutOfMemoryException()) {
1148
+ context()->mark_out_of_memory();
1149
+ } else if (thread_local_top_.pending_exception_ ==
1150
+ heap()->termination_exception()) {
1151
+ // Do nothing: if needed, the exception has been already propagated to
1152
+ // v8::TryCatch.
1153
+ } else {
1154
+ if (thread_local_top_.has_pending_message_) {
1155
+ thread_local_top_.has_pending_message_ = false;
1156
+ if (!thread_local_top_.pending_message_obj_->IsTheHole()) {
1157
+ HandleScope scope;
1158
+ Handle<Object> message_obj(thread_local_top_.pending_message_obj_);
1159
+ if (thread_local_top_.pending_message_script_ != NULL) {
1160
+ Handle<Script> script(thread_local_top_.pending_message_script_);
1161
+ int start_pos = thread_local_top_.pending_message_start_pos_;
1162
+ int end_pos = thread_local_top_.pending_message_end_pos_;
1163
+ MessageLocation location(script, start_pos, end_pos);
1164
+ MessageHandler::ReportMessage(this, &location, message_obj);
1165
+ } else {
1166
+ MessageHandler::ReportMessage(this, NULL, message_obj);
1167
+ }
1168
+ }
1169
+ }
1170
+ }
1171
+ clear_pending_message();
1172
+ }
1173
+
1174
+
1175
+ void Isolate::TraceException(bool flag) {
1176
+ FLAG_trace_exception = flag; // TODO(isolates): This is an unfortunate use.
1177
+ }
1178
+
1179
+
1180
+ bool Isolate::OptionalRescheduleException(bool is_bottom_call) {
1181
+ ASSERT(has_pending_exception());
1182
+ PropagatePendingExceptionToExternalTryCatch();
1183
+
1184
+ // Allways reschedule out of memory exceptions.
1185
+ if (!is_out_of_memory()) {
1186
+ bool is_termination_exception =
1187
+ pending_exception() == heap_.termination_exception();
1188
+
1189
+ // Do not reschedule the exception if this is the bottom call.
1190
+ bool clear_exception = is_bottom_call;
1191
+
1192
+ if (is_termination_exception) {
1193
+ if (is_bottom_call) {
1194
+ thread_local_top()->external_caught_exception_ = false;
1195
+ clear_pending_exception();
1196
+ return false;
1197
+ }
1198
+ } else if (thread_local_top()->external_caught_exception_) {
1199
+ // If the exception is externally caught, clear it if there are no
1200
+ // JavaScript frames on the way to the C++ frame that has the
1201
+ // external handler.
1202
+ ASSERT(thread_local_top()->try_catch_handler_address() != NULL);
1203
+ Address external_handler_address =
1204
+ thread_local_top()->try_catch_handler_address();
1205
+ JavaScriptFrameIterator it;
1206
+ if (it.done() || (it.frame()->sp() > external_handler_address)) {
1207
+ clear_exception = true;
1208
+ }
1209
+ }
1210
+
1211
+ // Clear the exception if needed.
1212
+ if (clear_exception) {
1213
+ thread_local_top()->external_caught_exception_ = false;
1214
+ clear_pending_exception();
1215
+ return false;
1216
+ }
1217
+ }
1218
+
1219
+ // Reschedule the exception.
1220
+ thread_local_top()->scheduled_exception_ = pending_exception();
1221
+ clear_pending_exception();
1222
+ return true;
1223
+ }
1224
+
1225
+
1226
+ void Isolate::SetCaptureStackTraceForUncaughtExceptions(
1227
+ bool capture,
1228
+ int frame_limit,
1229
+ StackTrace::StackTraceOptions options) {
1230
+ capture_stack_trace_for_uncaught_exceptions_ = capture;
1231
+ stack_trace_for_uncaught_exceptions_frame_limit_ = frame_limit;
1232
+ stack_trace_for_uncaught_exceptions_options_ = options;
1233
+ }
1234
+
1235
+
1236
+ bool Isolate::is_out_of_memory() {
1237
+ if (has_pending_exception()) {
1238
+ MaybeObject* e = pending_exception();
1239
+ if (e->IsFailure() && Failure::cast(e)->IsOutOfMemoryException()) {
1240
+ return true;
1241
+ }
1242
+ }
1243
+ if (has_scheduled_exception()) {
1244
+ MaybeObject* e = scheduled_exception();
1245
+ if (e->IsFailure() && Failure::cast(e)->IsOutOfMemoryException()) {
1246
+ return true;
1247
+ }
1248
+ }
1249
+ return false;
1250
+ }
1251
+
1252
+
1253
+ Handle<Context> Isolate::global_context() {
1254
+ GlobalObject* global = thread_local_top()->context_->global();
1255
+ return Handle<Context>(global->global_context());
1256
+ }
1257
+
1258
+
1259
+ Handle<Context> Isolate::GetCallingGlobalContext() {
1260
+ JavaScriptFrameIterator it;
1261
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1262
+ if (debug_->InDebugger()) {
1263
+ while (!it.done()) {
1264
+ JavaScriptFrame* frame = it.frame();
1265
+ Context* context = Context::cast(frame->context());
1266
+ if (context->global_context() == *debug_->debug_context()) {
1267
+ it.Advance();
1268
+ } else {
1269
+ break;
1270
+ }
1271
+ }
1272
+ }
1273
+ #endif // ENABLE_DEBUGGER_SUPPORT
1274
+ if (it.done()) return Handle<Context>::null();
1275
+ JavaScriptFrame* frame = it.frame();
1276
+ Context* context = Context::cast(frame->context());
1277
+ return Handle<Context>(context->global_context());
1278
+ }
1279
+
1280
+
1281
+ char* Isolate::ArchiveThread(char* to) {
1282
+ if (RuntimeProfiler::IsEnabled() && current_vm_state() == JS) {
1283
+ RuntimeProfiler::IsolateExitedJS(this);
1284
+ }
1285
+ memcpy(to, reinterpret_cast<char*>(thread_local_top()),
1286
+ sizeof(ThreadLocalTop));
1287
+ InitializeThreadLocal();
1288
+ return to + sizeof(ThreadLocalTop);
1289
+ }
1290
+
1291
+
1292
+ char* Isolate::RestoreThread(char* from) {
1293
+ memcpy(reinterpret_cast<char*>(thread_local_top()), from,
1294
+ sizeof(ThreadLocalTop));
1295
+ // This might be just paranoia, but it seems to be needed in case a
1296
+ // thread_local_top_ is restored on a separate OS thread.
1297
+ #ifdef USE_SIMULATOR
1298
+ #ifdef V8_TARGET_ARCH_ARM
1299
+ thread_local_top()->simulator_ = Simulator::current(this);
1300
+ #elif V8_TARGET_ARCH_MIPS
1301
+ thread_local_top()->simulator_ = Simulator::current(this);
1302
+ #endif
1303
+ #endif
1304
+ if (RuntimeProfiler::IsEnabled() && current_vm_state() == JS) {
1305
+ RuntimeProfiler::IsolateEnteredJS(this);
1306
+ }
1307
+ return from + sizeof(ThreadLocalTop);
1308
+ }
1309
+
1310
+
1311
+ Isolate::ThreadDataTable::ThreadDataTable()
1312
+ : list_(NULL) {
1313
+ }
1314
+
1315
+
1316
+ Isolate::PerIsolateThreadData*
1317
+ Isolate::ThreadDataTable::Lookup(Isolate* isolate,
1318
+ ThreadId thread_id) {
1319
+ for (PerIsolateThreadData* data = list_; data != NULL; data = data->next_) {
1320
+ if (data->Matches(isolate, thread_id)) return data;
1321
+ }
1322
+ return NULL;
1323
+ }
1324
+
1325
+
1326
+ void Isolate::ThreadDataTable::Insert(Isolate::PerIsolateThreadData* data) {
1327
+ if (list_ != NULL) list_->prev_ = data;
1328
+ data->next_ = list_;
1329
+ list_ = data;
1330
+ }
1331
+
1332
+
1333
+ void Isolate::ThreadDataTable::Remove(PerIsolateThreadData* data) {
1334
+ if (list_ == data) list_ = data->next_;
1335
+ if (data->next_ != NULL) data->next_->prev_ = data->prev_;
1336
+ if (data->prev_ != NULL) data->prev_->next_ = data->next_;
1337
+ }
1338
+
1339
+
1340
+ void Isolate::ThreadDataTable::Remove(Isolate* isolate,
1341
+ ThreadId thread_id) {
1342
+ PerIsolateThreadData* data = Lookup(isolate, thread_id);
1343
+ if (data != NULL) {
1344
+ Remove(data);
1345
+ }
1346
+ }
1347
+
1348
+
1349
+ #ifdef DEBUG
1350
+ #define TRACE_ISOLATE(tag) \
1351
+ do { \
1352
+ if (FLAG_trace_isolates) { \
1353
+ PrintF("Isolate %p " #tag "\n", reinterpret_cast<void*>(this)); \
1354
+ } \
1355
+ } while (false)
1356
+ #else
1357
+ #define TRACE_ISOLATE(tag)
1358
+ #endif
1359
+
1360
+
1361
+ Isolate::Isolate()
1362
+ : state_(UNINITIALIZED),
1363
+ entry_stack_(NULL),
1364
+ stack_trace_nesting_level_(0),
1365
+ incomplete_message_(NULL),
1366
+ preallocated_memory_thread_(NULL),
1367
+ preallocated_message_space_(NULL),
1368
+ bootstrapper_(NULL),
1369
+ runtime_profiler_(NULL),
1370
+ compilation_cache_(NULL),
1371
+ counters_(new Counters()),
1372
+ code_range_(NULL),
1373
+ break_access_(OS::CreateMutex()),
1374
+ logger_(new Logger()),
1375
+ stats_table_(new StatsTable()),
1376
+ stub_cache_(NULL),
1377
+ deoptimizer_data_(NULL),
1378
+ capture_stack_trace_for_uncaught_exceptions_(false),
1379
+ stack_trace_for_uncaught_exceptions_frame_limit_(0),
1380
+ stack_trace_for_uncaught_exceptions_options_(StackTrace::kOverview),
1381
+ transcendental_cache_(NULL),
1382
+ memory_allocator_(NULL),
1383
+ keyed_lookup_cache_(NULL),
1384
+ context_slot_cache_(NULL),
1385
+ descriptor_lookup_cache_(NULL),
1386
+ handle_scope_implementer_(NULL),
1387
+ unicode_cache_(NULL),
1388
+ in_use_list_(0),
1389
+ free_list_(0),
1390
+ preallocated_storage_preallocated_(false),
1391
+ pc_to_code_cache_(NULL),
1392
+ write_input_buffer_(NULL),
1393
+ global_handles_(NULL),
1394
+ context_switcher_(NULL),
1395
+ thread_manager_(NULL),
1396
+ ast_sentinels_(NULL),
1397
+ string_tracker_(NULL),
1398
+ regexp_stack_(NULL),
1399
+ frame_element_constant_list_(0),
1400
+ result_constant_list_(0),
1401
+ embedder_data_(NULL) {
1402
+ TRACE_ISOLATE(constructor);
1403
+
1404
+ memset(isolate_addresses_, 0,
1405
+ sizeof(isolate_addresses_[0]) * (k_isolate_address_count + 1));
1406
+
1407
+ heap_.isolate_ = this;
1408
+ zone_.isolate_ = this;
1409
+ stack_guard_.isolate_ = this;
1410
+
1411
+ // ThreadManager is initialized early to support locking an isolate
1412
+ // before it is entered.
1413
+ thread_manager_ = new ThreadManager();
1414
+ thread_manager_->isolate_ = this;
1415
+
1416
+ #if defined(V8_TARGET_ARCH_ARM) && !defined(__arm__) || \
1417
+ defined(V8_TARGET_ARCH_MIPS) && !defined(__mips__)
1418
+ simulator_initialized_ = false;
1419
+ simulator_i_cache_ = NULL;
1420
+ simulator_redirection_ = NULL;
1421
+ #endif
1422
+
1423
+ #ifdef DEBUG
1424
+ // heap_histograms_ initializes itself.
1425
+ memset(&js_spill_information_, 0, sizeof(js_spill_information_));
1426
+ memset(code_kind_statistics_, 0,
1427
+ sizeof(code_kind_statistics_[0]) * Code::NUMBER_OF_KINDS);
1428
+ #endif
1429
+
1430
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1431
+ debug_ = NULL;
1432
+ debugger_ = NULL;
1433
+ #endif
1434
+
1435
+ #ifdef ENABLE_LOGGING_AND_PROFILING
1436
+ producer_heap_profile_ = NULL;
1437
+ #endif
1438
+
1439
+ handle_scope_data_.Initialize();
1440
+
1441
+ #define ISOLATE_INIT_EXECUTE(type, name, initial_value) \
1442
+ name##_ = (initial_value);
1443
+ ISOLATE_INIT_LIST(ISOLATE_INIT_EXECUTE)
1444
+ #undef ISOLATE_INIT_EXECUTE
1445
+
1446
+ #define ISOLATE_INIT_ARRAY_EXECUTE(type, name, length) \
1447
+ memset(name##_, 0, sizeof(type) * length);
1448
+ ISOLATE_INIT_ARRAY_LIST(ISOLATE_INIT_ARRAY_EXECUTE)
1449
+ #undef ISOLATE_INIT_ARRAY_EXECUTE
1450
+ }
1451
+
1452
+ void Isolate::TearDown() {
1453
+ TRACE_ISOLATE(tear_down);
1454
+
1455
+ // Temporarily set this isolate as current so that various parts of
1456
+ // the isolate can access it in their destructors without having a
1457
+ // direct pointer. We don't use Enter/Exit here to avoid
1458
+ // initializing the thread data.
1459
+ PerIsolateThreadData* saved_data = CurrentPerIsolateThreadData();
1460
+ Isolate* saved_isolate = UncheckedCurrent();
1461
+ SetIsolateThreadLocals(this, NULL);
1462
+
1463
+ Deinit();
1464
+
1465
+ if (!IsDefaultIsolate()) {
1466
+ delete this;
1467
+ }
1468
+
1469
+ // Restore the previous current isolate.
1470
+ SetIsolateThreadLocals(saved_isolate, saved_data);
1471
+ }
1472
+
1473
+
1474
+ void Isolate::Deinit() {
1475
+ if (state_ == INITIALIZED) {
1476
+ TRACE_ISOLATE(deinit);
1477
+
1478
+ if (FLAG_hydrogen_stats) HStatistics::Instance()->Print();
1479
+
1480
+ // We must stop the logger before we tear down other components.
1481
+ logger_->EnsureTickerStopped();
1482
+
1483
+ delete deoptimizer_data_;
1484
+ deoptimizer_data_ = NULL;
1485
+ if (FLAG_preemption) {
1486
+ v8::Locker locker;
1487
+ v8::Locker::StopPreemption();
1488
+ }
1489
+ builtins_.TearDown();
1490
+ bootstrapper_->TearDown();
1491
+
1492
+ // Remove the external reference to the preallocated stack memory.
1493
+ delete preallocated_message_space_;
1494
+ preallocated_message_space_ = NULL;
1495
+ PreallocatedMemoryThreadStop();
1496
+
1497
+ HeapProfiler::TearDown();
1498
+ CpuProfiler::TearDown();
1499
+ if (runtime_profiler_ != NULL) {
1500
+ runtime_profiler_->TearDown();
1501
+ delete runtime_profiler_;
1502
+ runtime_profiler_ = NULL;
1503
+ }
1504
+ heap_.TearDown();
1505
+ logger_->TearDown();
1506
+
1507
+ // The default isolate is re-initializable due to legacy API.
1508
+ state_ = PREINITIALIZED;
1509
+ }
1510
+ }
1511
+
1512
+
1513
+ void Isolate::SetIsolateThreadLocals(Isolate* isolate,
1514
+ PerIsolateThreadData* data) {
1515
+ Thread::SetThreadLocal(isolate_key_, isolate);
1516
+ Thread::SetThreadLocal(per_isolate_thread_data_key_, data);
1517
+ }
1518
+
1519
+
1520
+ Isolate::~Isolate() {
1521
+ TRACE_ISOLATE(destructor);
1522
+
1523
+ #ifdef ENABLE_LOGGING_AND_PROFILING
1524
+ delete producer_heap_profile_;
1525
+ producer_heap_profile_ = NULL;
1526
+ #endif
1527
+
1528
+ delete unicode_cache_;
1529
+ unicode_cache_ = NULL;
1530
+
1531
+ delete regexp_stack_;
1532
+ regexp_stack_ = NULL;
1533
+
1534
+ delete ast_sentinels_;
1535
+ ast_sentinels_ = NULL;
1536
+
1537
+ delete descriptor_lookup_cache_;
1538
+ descriptor_lookup_cache_ = NULL;
1539
+ delete context_slot_cache_;
1540
+ context_slot_cache_ = NULL;
1541
+ delete keyed_lookup_cache_;
1542
+ keyed_lookup_cache_ = NULL;
1543
+
1544
+ delete transcendental_cache_;
1545
+ transcendental_cache_ = NULL;
1546
+ delete stub_cache_;
1547
+ stub_cache_ = NULL;
1548
+ delete stats_table_;
1549
+ stats_table_ = NULL;
1550
+
1551
+ delete logger_;
1552
+ logger_ = NULL;
1553
+
1554
+ delete counters_;
1555
+ counters_ = NULL;
1556
+
1557
+ delete handle_scope_implementer_;
1558
+ handle_scope_implementer_ = NULL;
1559
+ delete break_access_;
1560
+ break_access_ = NULL;
1561
+
1562
+ delete compilation_cache_;
1563
+ compilation_cache_ = NULL;
1564
+ delete bootstrapper_;
1565
+ bootstrapper_ = NULL;
1566
+ delete pc_to_code_cache_;
1567
+ pc_to_code_cache_ = NULL;
1568
+ delete write_input_buffer_;
1569
+ write_input_buffer_ = NULL;
1570
+
1571
+ delete context_switcher_;
1572
+ context_switcher_ = NULL;
1573
+ delete thread_manager_;
1574
+ thread_manager_ = NULL;
1575
+
1576
+ delete string_tracker_;
1577
+ string_tracker_ = NULL;
1578
+
1579
+ delete memory_allocator_;
1580
+ memory_allocator_ = NULL;
1581
+ delete code_range_;
1582
+ code_range_ = NULL;
1583
+ delete global_handles_;
1584
+ global_handles_ = NULL;
1585
+
1586
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1587
+ delete debugger_;
1588
+ debugger_ = NULL;
1589
+ delete debug_;
1590
+ debug_ = NULL;
1591
+ #endif
1592
+ }
1593
+
1594
+
1595
+ bool Isolate::PreInit() {
1596
+ if (state_ != UNINITIALIZED) return true;
1597
+
1598
+ TRACE_ISOLATE(preinit);
1599
+
1600
+ ASSERT(Isolate::Current() == this);
1601
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1602
+ debug_ = new Debug(this);
1603
+ debugger_ = new Debugger();
1604
+ debugger_->isolate_ = this;
1605
+ #endif
1606
+
1607
+ memory_allocator_ = new MemoryAllocator();
1608
+ memory_allocator_->isolate_ = this;
1609
+ code_range_ = new CodeRange();
1610
+ code_range_->isolate_ = this;
1611
+
1612
+ // Safe after setting Heap::isolate_, initializing StackGuard and
1613
+ // ensuring that Isolate::Current() == this.
1614
+ heap_.SetStackLimits();
1615
+
1616
+ #ifdef DEBUG
1617
+ DisallowAllocationFailure disallow_allocation_failure;
1618
+ #endif
1619
+
1620
+ #define C(name) isolate_addresses_[Isolate::k_##name] = \
1621
+ reinterpret_cast<Address>(name());
1622
+ ISOLATE_ADDRESS_LIST(C)
1623
+ ISOLATE_ADDRESS_LIST_PROF(C)
1624
+ #undef C
1625
+
1626
+ string_tracker_ = new StringTracker();
1627
+ string_tracker_->isolate_ = this;
1628
+ compilation_cache_ = new CompilationCache(this);
1629
+ transcendental_cache_ = new TranscendentalCache();
1630
+ keyed_lookup_cache_ = new KeyedLookupCache();
1631
+ context_slot_cache_ = new ContextSlotCache();
1632
+ descriptor_lookup_cache_ = new DescriptorLookupCache();
1633
+ unicode_cache_ = new UnicodeCache();
1634
+ pc_to_code_cache_ = new PcToCodeCache(this);
1635
+ write_input_buffer_ = new StringInputBuffer();
1636
+ global_handles_ = new GlobalHandles(this);
1637
+ bootstrapper_ = new Bootstrapper();
1638
+ handle_scope_implementer_ = new HandleScopeImplementer(this);
1639
+ stub_cache_ = new StubCache(this);
1640
+ ast_sentinels_ = new AstSentinels();
1641
+ regexp_stack_ = new RegExpStack();
1642
+ regexp_stack_->isolate_ = this;
1643
+
1644
+ #ifdef ENABLE_LOGGING_AND_PROFILING
1645
+ producer_heap_profile_ = new ProducerHeapProfile();
1646
+ producer_heap_profile_->isolate_ = this;
1647
+ #endif
1648
+
1649
+ state_ = PREINITIALIZED;
1650
+ return true;
1651
+ }
1652
+
1653
+
1654
+ void Isolate::InitializeThreadLocal() {
1655
+ thread_local_top_.isolate_ = this;
1656
+ thread_local_top_.Initialize();
1657
+ clear_pending_exception();
1658
+ clear_pending_message();
1659
+ clear_scheduled_exception();
1660
+ }
1661
+
1662
+
1663
+ void Isolate::PropagatePendingExceptionToExternalTryCatch() {
1664
+ ASSERT(has_pending_exception());
1665
+
1666
+ bool external_caught = IsExternallyCaught();
1667
+ thread_local_top_.external_caught_exception_ = external_caught;
1668
+
1669
+ if (!external_caught) return;
1670
+
1671
+ if (thread_local_top_.pending_exception_ == Failure::OutOfMemoryException()) {
1672
+ // Do not propagate OOM exception: we should kill VM asap.
1673
+ } else if (thread_local_top_.pending_exception_ ==
1674
+ heap()->termination_exception()) {
1675
+ try_catch_handler()->can_continue_ = false;
1676
+ try_catch_handler()->exception_ = heap()->null_value();
1677
+ } else {
1678
+ // At this point all non-object (failure) exceptions have
1679
+ // been dealt with so this shouldn't fail.
1680
+ ASSERT(!pending_exception()->IsFailure());
1681
+ try_catch_handler()->can_continue_ = true;
1682
+ try_catch_handler()->exception_ = pending_exception();
1683
+ if (!thread_local_top_.pending_message_obj_->IsTheHole()) {
1684
+ try_catch_handler()->message_ = thread_local_top_.pending_message_obj_;
1685
+ }
1686
+ }
1687
+ }
1688
+
1689
+
1690
+ bool Isolate::Init(Deserializer* des) {
1691
+ ASSERT(state_ != INITIALIZED);
1692
+
1693
+ TRACE_ISOLATE(init);
1694
+
1695
+ bool create_heap_objects = des == NULL;
1696
+
1697
+ #ifdef DEBUG
1698
+ // The initialization process does not handle memory exhaustion.
1699
+ DisallowAllocationFailure disallow_allocation_failure;
1700
+ #endif
1701
+
1702
+ if (state_ == UNINITIALIZED && !PreInit()) return false;
1703
+
1704
+ // Enable logging before setting up the heap
1705
+ logger_->Setup();
1706
+
1707
+ CpuProfiler::Setup();
1708
+ HeapProfiler::Setup();
1709
+
1710
+ // Initialize other runtime facilities
1711
+ #if defined(USE_SIMULATOR)
1712
+ #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_MIPS)
1713
+ Simulator::Initialize(this);
1714
+ #endif
1715
+ #endif
1716
+
1717
+ { // NOLINT
1718
+ // Ensure that the thread has a valid stack guard. The v8::Locker object
1719
+ // will ensure this too, but we don't have to use lockers if we are only
1720
+ // using one thread.
1721
+ ExecutionAccess lock(this);
1722
+ stack_guard_.InitThread(lock);
1723
+ }
1724
+
1725
+ // Setup the object heap
1726
+ ASSERT(!heap_.HasBeenSetup());
1727
+ if (!heap_.Setup(create_heap_objects)) {
1728
+ V8::SetFatalError();
1729
+ return false;
1730
+ }
1731
+
1732
+ bootstrapper_->Initialize(create_heap_objects);
1733
+ builtins_.Setup(create_heap_objects);
1734
+
1735
+ InitializeThreadLocal();
1736
+
1737
+ // Only preallocate on the first initialization.
1738
+ if (FLAG_preallocate_message_memory && preallocated_message_space_ == NULL) {
1739
+ // Start the thread which will set aside some memory.
1740
+ PreallocatedMemoryThreadStart();
1741
+ preallocated_message_space_ =
1742
+ new NoAllocationStringAllocator(
1743
+ preallocated_memory_thread_->data(),
1744
+ preallocated_memory_thread_->length());
1745
+ PreallocatedStorageInit(preallocated_memory_thread_->length() / 4);
1746
+ }
1747
+
1748
+ if (FLAG_preemption) {
1749
+ v8::Locker locker;
1750
+ v8::Locker::StartPreemption(100);
1751
+ }
1752
+
1753
+ #ifdef ENABLE_DEBUGGER_SUPPORT
1754
+ debug_->Setup(create_heap_objects);
1755
+ #endif
1756
+ stub_cache_->Initialize(create_heap_objects);
1757
+
1758
+ // If we are deserializing, read the state into the now-empty heap.
1759
+ if (des != NULL) {
1760
+ des->Deserialize();
1761
+ stub_cache_->Clear();
1762
+ }
1763
+
1764
+ // Deserializing may put strange things in the root array's copy of the
1765
+ // stack guard.
1766
+ heap_.SetStackLimits();
1767
+
1768
+ deoptimizer_data_ = new DeoptimizerData;
1769
+ runtime_profiler_ = new RuntimeProfiler(this);
1770
+ runtime_profiler_->Setup();
1771
+
1772
+ // If we are deserializing, log non-function code objects and compiled
1773
+ // functions found in the snapshot.
1774
+ if (des != NULL && (FLAG_log_code || FLAG_ll_prof)) {
1775
+ HandleScope scope;
1776
+ LOG(this, LogCodeObjects());
1777
+ LOG(this, LogCompiledFunctions());
1778
+ }
1779
+
1780
+ state_ = INITIALIZED;
1781
+ return true;
1782
+ }
1783
+
1784
+
1785
+ void Isolate::Enter() {
1786
+ Isolate* current_isolate = NULL;
1787
+ PerIsolateThreadData* current_data = CurrentPerIsolateThreadData();
1788
+ if (current_data != NULL) {
1789
+ current_isolate = current_data->isolate_;
1790
+ ASSERT(current_isolate != NULL);
1791
+ if (current_isolate == this) {
1792
+ ASSERT(Current() == this);
1793
+ ASSERT(entry_stack_ != NULL);
1794
+ ASSERT(entry_stack_->previous_thread_data == NULL ||
1795
+ entry_stack_->previous_thread_data->thread_id().Equals(
1796
+ ThreadId::Current()));
1797
+ // Same thread re-enters the isolate, no need to re-init anything.
1798
+ entry_stack_->entry_count++;
1799
+ return;
1800
+ }
1801
+ }
1802
+
1803
+ // Threads can have default isolate set into TLS as Current but not yet have
1804
+ // PerIsolateThreadData for it, as it requires more advanced phase of the
1805
+ // initialization. For example, a thread might be the one that system used for
1806
+ // static initializers - in this case the default isolate is set in TLS but
1807
+ // the thread did not yet Enter the isolate. If PerisolateThreadData is not
1808
+ // there, use the isolate set in TLS.
1809
+ if (current_isolate == NULL) {
1810
+ current_isolate = Isolate::UncheckedCurrent();
1811
+ }
1812
+
1813
+ PerIsolateThreadData* data = FindOrAllocatePerThreadDataForThisThread();
1814
+ ASSERT(data != NULL);
1815
+ ASSERT(data->isolate_ == this);
1816
+
1817
+ EntryStackItem* item = new EntryStackItem(current_data,
1818
+ current_isolate,
1819
+ entry_stack_);
1820
+ entry_stack_ = item;
1821
+
1822
+ SetIsolateThreadLocals(this, data);
1823
+
1824
+ CHECK(PreInit());
1825
+
1826
+ // In case it's the first time some thread enters the isolate.
1827
+ set_thread_id(data->thread_id());
1828
+ }
1829
+
1830
+
1831
+ void Isolate::Exit() {
1832
+ ASSERT(entry_stack_ != NULL);
1833
+ ASSERT(entry_stack_->previous_thread_data == NULL ||
1834
+ entry_stack_->previous_thread_data->thread_id().Equals(
1835
+ ThreadId::Current()));
1836
+
1837
+ if (--entry_stack_->entry_count > 0) return;
1838
+
1839
+ ASSERT(CurrentPerIsolateThreadData() != NULL);
1840
+ ASSERT(CurrentPerIsolateThreadData()->isolate_ == this);
1841
+
1842
+ // Pop the stack.
1843
+ EntryStackItem* item = entry_stack_;
1844
+ entry_stack_ = item->previous_item;
1845
+
1846
+ PerIsolateThreadData* previous_thread_data = item->previous_thread_data;
1847
+ Isolate* previous_isolate = item->previous_isolate;
1848
+
1849
+ delete item;
1850
+
1851
+ // Reinit the current thread for the isolate it was running before this one.
1852
+ SetIsolateThreadLocals(previous_isolate, previous_thread_data);
1853
+ }
1854
+
1855
+
1856
+ void Isolate::ResetEagerOptimizingData() {
1857
+ compilation_cache_->ResetEagerOptimizingData();
1858
+ }
1859
+
1860
+
1861
+ #ifdef DEBUG
1862
+ #define ISOLATE_FIELD_OFFSET(type, name, ignored) \
1863
+ const intptr_t Isolate::name##_debug_offset_ = OFFSET_OF(Isolate, name##_);
1864
+ ISOLATE_INIT_LIST(ISOLATE_FIELD_OFFSET)
1865
+ ISOLATE_INIT_ARRAY_LIST(ISOLATE_FIELD_OFFSET)
1866
+ #undef ISOLATE_FIELD_OFFSET
1867
+ #endif
1868
+
1869
+ } } // namespace v8::internal