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,1261 @@
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
+ // This is clang plugin used by gcmole tool. See README for more details.
29
+
30
+ #include "clang/AST/AST.h"
31
+ #include "clang/AST/ASTConsumer.h"
32
+ #include "clang/AST/Mangle.h"
33
+ #include "clang/AST/RecursiveASTVisitor.h"
34
+ #include "clang/AST/StmtVisitor.h"
35
+ #include "clang/Frontend/FrontendPluginRegistry.h"
36
+ #include "clang/Frontend/CompilerInstance.h"
37
+ #include "llvm/Support/raw_ostream.h"
38
+
39
+ #include <bitset>
40
+ #include <fstream>
41
+ #include <iostream>
42
+ #include <map>
43
+ #include <set>
44
+ #include <stack>
45
+
46
+ namespace {
47
+
48
+ typedef std::string MangledName;
49
+ typedef std::set<MangledName> CalleesSet;
50
+
51
+ static bool GetMangledName(clang::MangleContext* ctx,
52
+ const clang::NamedDecl* decl,
53
+ MangledName* result) {
54
+ if (!isa<clang::CXXConstructorDecl>(decl) &&
55
+ !isa<clang::CXXDestructorDecl>(decl)) {
56
+ llvm::SmallVector<char, 512> output;
57
+ llvm::raw_svector_ostream out(output);
58
+ ctx->mangleName(decl, out);
59
+ *result = out.str().str();
60
+ return true;
61
+ }
62
+
63
+ return false;
64
+ }
65
+
66
+
67
+ static bool InV8Namespace(const clang::NamedDecl* decl) {
68
+ return decl->getQualifiedNameAsString().compare(0, 4, "v8::") == 0;
69
+ }
70
+
71
+
72
+ struct Resolver {
73
+ explicit Resolver(clang::ASTContext& ctx)
74
+ : ctx_(ctx), decl_ctx_(ctx.getTranslationUnitDecl()) {
75
+ }
76
+
77
+ Resolver(clang::ASTContext& ctx, clang::DeclContext* decl_ctx)
78
+ : ctx_(ctx), decl_ctx_(decl_ctx) {
79
+ }
80
+
81
+ clang::DeclarationName ResolveName(const char* n) {
82
+ clang::IdentifierInfo* ident = &ctx_.Idents.get(n);
83
+ return ctx_.DeclarationNames.getIdentifier(ident);
84
+ }
85
+
86
+ Resolver ResolveNamespace(const char* n) {
87
+ return Resolver(ctx_, Resolve<clang::NamespaceDecl>(n));
88
+ }
89
+
90
+ template<typename T>
91
+ T* Resolve(const char* n) {
92
+ if (decl_ctx_ == NULL) return NULL;
93
+
94
+ clang::DeclContext::lookup_result result =
95
+ decl_ctx_->lookup(ResolveName(n));
96
+
97
+ clang::DeclContext::lookup_iterator end = result.second;
98
+ for (clang::DeclContext::lookup_iterator i = result.first;
99
+ i != end;
100
+ i++) {
101
+ if (isa<T>(*i)) return cast<T>(*i);
102
+ }
103
+
104
+ return NULL;
105
+ }
106
+
107
+ private:
108
+ clang::ASTContext& ctx_;
109
+ clang::DeclContext* decl_ctx_;
110
+ };
111
+
112
+
113
+ class CalleesPrinter : public clang::RecursiveASTVisitor<CalleesPrinter> {
114
+ public:
115
+ explicit CalleesPrinter(clang::MangleContext* ctx) : ctx_(ctx) {
116
+ }
117
+
118
+ virtual bool VisitCallExpr(clang::CallExpr* expr) {
119
+ const clang::FunctionDecl* callee = expr->getDirectCallee();
120
+ if (callee != NULL) AnalyzeFunction(callee);
121
+ return true;
122
+ }
123
+
124
+ void AnalyzeFunction(const clang::FunctionDecl* f) {
125
+ MangledName name;
126
+ if (InV8Namespace(f) && GetMangledName(ctx_, f, &name)) {
127
+ AddCallee(name);
128
+
129
+ const clang::FunctionDecl* body = NULL;
130
+ if (f->hasBody(body) && !Analyzed(name)) {
131
+ EnterScope(name);
132
+ TraverseStmt(body->getBody());
133
+ LeaveScope();
134
+ }
135
+ }
136
+ }
137
+
138
+ typedef std::map<MangledName, CalleesSet* > Callgraph;
139
+
140
+ bool Analyzed(const MangledName& name) {
141
+ return callgraph_[name] != NULL;
142
+ }
143
+
144
+ void EnterScope(const MangledName& name) {
145
+ CalleesSet* callees = callgraph_[name];
146
+
147
+ if (callees == NULL) {
148
+ callgraph_[name] = callees = new CalleesSet();
149
+ }
150
+
151
+ scopes_.push(callees);
152
+ }
153
+
154
+ void LeaveScope() {
155
+ scopes_.pop();
156
+ }
157
+
158
+ void AddCallee(const MangledName& name) {
159
+ if (!scopes_.empty()) scopes_.top()->insert(name);
160
+ }
161
+
162
+ void PrintCallGraph() {
163
+ for (Callgraph::const_iterator i = callgraph_.begin(), e = callgraph_.end();
164
+ i != e;
165
+ ++i) {
166
+ std::cout << i->first << "\n";
167
+
168
+ CalleesSet* callees = i->second;
169
+ for (CalleesSet::const_iterator j = callees->begin(), e = callees->end();
170
+ j != e;
171
+ ++j) {
172
+ std::cout << "\t" << *j << "\n";
173
+ }
174
+ }
175
+ }
176
+
177
+ private:
178
+ clang::MangleContext* ctx_;
179
+
180
+ std::stack<CalleesSet* > scopes_;
181
+ Callgraph callgraph_;
182
+ };
183
+
184
+
185
+ class FunctionDeclarationFinder
186
+ : public clang::ASTConsumer,
187
+ public clang::RecursiveASTVisitor<FunctionDeclarationFinder> {
188
+ public:
189
+ explicit FunctionDeclarationFinder(clang::Diagnostic& d,
190
+ clang::SourceManager& sm,
191
+ const std::vector<std::string>& args)
192
+ : d_(d), sm_(sm) { }
193
+
194
+ virtual void HandleTranslationUnit(clang::ASTContext &ctx) {
195
+ mangle_context_ = clang::createItaniumMangleContext(ctx, d_);
196
+ callees_printer_ = new CalleesPrinter(mangle_context_);
197
+
198
+ TraverseDecl(ctx.getTranslationUnitDecl());
199
+
200
+ callees_printer_->PrintCallGraph();
201
+ }
202
+
203
+ virtual bool VisitFunctionDecl(clang::FunctionDecl* decl) {
204
+ callees_printer_->AnalyzeFunction(decl);
205
+ return true;
206
+ }
207
+
208
+ private:
209
+ clang::Diagnostic& d_;
210
+ clang::SourceManager& sm_;
211
+ clang::MangleContext* mangle_context_;
212
+
213
+ CalleesPrinter* callees_printer_;
214
+ };
215
+
216
+
217
+ static bool loaded = false;
218
+ static CalleesSet gc_suspects;
219
+
220
+
221
+ static void LoadGCSuspects() {
222
+ if (loaded) return;
223
+
224
+ std::ifstream fin("gcsuspects");
225
+ std::string s;
226
+
227
+ while (fin >> s) gc_suspects.insert(s);
228
+
229
+ loaded = true;
230
+ }
231
+
232
+
233
+ static bool KnownToCauseGC(clang::MangleContext* ctx,
234
+ const clang::FunctionDecl* decl) {
235
+ LoadGCSuspects();
236
+
237
+ if (!InV8Namespace(decl)) return false;
238
+
239
+ MangledName name;
240
+ if (GetMangledName(ctx, decl, &name)) {
241
+ return gc_suspects.find(name) != gc_suspects.end();
242
+ }
243
+
244
+ return false;
245
+ }
246
+
247
+
248
+ static const int kNoEffect = 0;
249
+ static const int kCausesGC = 1;
250
+ static const int kRawDef = 2;
251
+ static const int kRawUse = 4;
252
+ static const int kAllEffects = kCausesGC | kRawDef | kRawUse;
253
+
254
+ class Environment;
255
+
256
+ class ExprEffect {
257
+ public:
258
+ bool hasGC() { return (effect_ & kCausesGC) != 0; }
259
+ void setGC() { effect_ |= kCausesGC; }
260
+
261
+ bool hasRawDef() { return (effect_ & kRawDef) != 0; }
262
+ void setRawDef() { effect_ |= kRawDef; }
263
+
264
+ bool hasRawUse() { return (effect_ & kRawUse) != 0; }
265
+ void setRawUse() { effect_ |= kRawUse; }
266
+
267
+ static ExprEffect None() { return ExprEffect(kNoEffect, NULL); }
268
+ static ExprEffect NoneWithEnv(Environment* env) {
269
+ return ExprEffect(kNoEffect, env);
270
+ }
271
+ static ExprEffect RawUse() { return ExprEffect(kRawUse, NULL); }
272
+
273
+ static ExprEffect Merge(ExprEffect a, ExprEffect b);
274
+ static ExprEffect MergeSeq(ExprEffect a, ExprEffect b);
275
+ ExprEffect Define(const std::string& name);
276
+
277
+ Environment* env() {
278
+ return reinterpret_cast<Environment*>(effect_ & ~kAllEffects);
279
+ }
280
+
281
+ private:
282
+ ExprEffect(int effect, Environment* env)
283
+ : effect_((effect & kAllEffects) |
284
+ reinterpret_cast<intptr_t>(env)) { }
285
+
286
+ intptr_t effect_;
287
+ };
288
+
289
+
290
+ const std::string BAD_EXPR_MSG("Possible problem with evaluation order.");
291
+ const std::string DEAD_VAR_MSG("Possibly dead variable.");
292
+
293
+
294
+ class Environment {
295
+ public:
296
+ Environment() { }
297
+
298
+ static Environment Unreachable() {
299
+ Environment env;
300
+ env.live_.set();
301
+ return env;
302
+ }
303
+
304
+ static Environment Merge(const Environment& l,
305
+ const Environment& r) {
306
+ return Environment(l, r);
307
+ }
308
+
309
+ Environment ApplyEffect(ExprEffect effect) const {
310
+ Environment out = effect.hasGC() ? Environment() : Environment(*this);
311
+ if (effect.env() != NULL) out.live_ |= effect.env()->live_;
312
+ return out;
313
+ }
314
+
315
+ typedef std::map<std::string, int> SymbolTable;
316
+
317
+ bool IsAlive(const std::string& name) const {
318
+ SymbolTable::iterator code = symbol_table_.find(name);
319
+ if (code == symbol_table_.end()) return false;
320
+ return live_[code->second];
321
+ }
322
+
323
+ bool Equal(const Environment& env) {
324
+ return live_ == env.live_;
325
+ }
326
+
327
+ Environment Define(const std::string& name) const {
328
+ return Environment(*this, SymbolToCode(name));
329
+ }
330
+
331
+ void MDefine(const std::string& name) {
332
+ live_.set(SymbolToCode(name));
333
+ }
334
+
335
+ static int SymbolToCode(const std::string& name) {
336
+ SymbolTable::iterator code = symbol_table_.find(name);
337
+
338
+ if (code == symbol_table_.end()) {
339
+ int new_code = symbol_table_.size();
340
+ symbol_table_.insert(std::make_pair(name, new_code));
341
+ return new_code;
342
+ }
343
+
344
+ return code->second;
345
+ }
346
+
347
+ static void ClearSymbolTable() {
348
+ std::vector<Environment*>::iterator end = envs_.end();
349
+ for (std::vector<Environment*>::iterator i = envs_.begin();
350
+ i != end;
351
+ ++i) {
352
+ delete *i;
353
+ }
354
+ envs_.clear();
355
+ symbol_table_.clear();
356
+ }
357
+
358
+ void Print() const {
359
+ bool comma = false;
360
+ std::cout << "{";
361
+ SymbolTable::iterator end = symbol_table_.end();
362
+ for (SymbolTable::iterator i = symbol_table_.begin();
363
+ i != end;
364
+ ++i) {
365
+ if (live_[i->second]) {
366
+ if (comma) std::cout << ", ";
367
+ std::cout << i->first;
368
+ comma = true;
369
+ }
370
+ }
371
+ std::cout << "}";
372
+ }
373
+
374
+ static Environment* Allocate(const Environment& env) {
375
+ Environment* allocated_env = new Environment(env);
376
+ envs_.push_back(allocated_env);
377
+ return allocated_env;
378
+ }
379
+
380
+ private:
381
+ Environment(const Environment& l, const Environment& r)
382
+ : live_(l.live_ & r.live_) {
383
+ }
384
+
385
+ Environment(const Environment& l, int code)
386
+ : live_(l.live_) {
387
+ live_.set(code);
388
+ }
389
+
390
+ static SymbolTable symbol_table_;
391
+ static std::vector<Environment* > envs_;
392
+
393
+ static const int kMaxNumberOfLocals = 256;
394
+ std::bitset<kMaxNumberOfLocals> live_;
395
+
396
+ friend class ExprEffect;
397
+ friend class CallProps;
398
+ };
399
+
400
+
401
+ class CallProps {
402
+ public:
403
+ CallProps() : env_(NULL) { }
404
+
405
+ void SetEffect(int arg, ExprEffect in) {
406
+ if (in.hasGC()) gc_.set(arg);
407
+ if (in.hasRawDef()) raw_def_.set(arg);
408
+ if (in.hasRawUse()) raw_use_.set(arg);
409
+ if (in.env() != NULL) {
410
+ if (env_ == NULL) env_ = in.env();
411
+ env_->live_ |= in.env()->live_;
412
+ }
413
+ }
414
+
415
+ ExprEffect ComputeCumulativeEffect(bool result_is_raw) {
416
+ ExprEffect out = ExprEffect::NoneWithEnv(env_);
417
+ if (gc_.any()) out.setGC();
418
+ if (raw_use_.any()) out.setRawUse();
419
+ if (result_is_raw) out.setRawDef();
420
+ return out;
421
+ }
422
+
423
+ bool IsSafe() {
424
+ if (!gc_.any()) return true;
425
+ std::bitset<kMaxNumberOfArguments> raw = (raw_def_ | raw_use_);
426
+ if (!raw.any()) return true;
427
+ return gc_.count() == 1 && !((raw ^ gc_).any());
428
+ }
429
+
430
+ private:
431
+ static const int kMaxNumberOfArguments = 64;
432
+ std::bitset<kMaxNumberOfArguments> raw_def_;
433
+ std::bitset<kMaxNumberOfArguments> raw_use_;
434
+ std::bitset<kMaxNumberOfArguments> gc_;
435
+ Environment* env_;
436
+ };
437
+
438
+
439
+ Environment::SymbolTable Environment::symbol_table_;
440
+ std::vector<Environment* > Environment::envs_;
441
+
442
+
443
+ ExprEffect ExprEffect::Merge(ExprEffect a, ExprEffect b) {
444
+ Environment* a_env = a.env();
445
+ Environment* b_env = b.env();
446
+ Environment* out = NULL;
447
+ if (a_env != NULL && b_env != NULL) {
448
+ out = Environment::Allocate(*a_env);
449
+ out->live_ &= b_env->live_;
450
+ }
451
+ return ExprEffect(a.effect_ | b.effect_, out);
452
+ }
453
+
454
+
455
+ ExprEffect ExprEffect::MergeSeq(ExprEffect a, ExprEffect b) {
456
+ Environment* a_env = b.hasGC() ? NULL : a.env();
457
+ Environment* b_env = b.env();
458
+ Environment* out = (b_env == NULL) ? a_env : b_env;
459
+ if (a_env != NULL && b_env != NULL) {
460
+ out = Environment::Allocate(*b_env);
461
+ out->live_ |= a_env->live_;
462
+ }
463
+ return ExprEffect(a.effect_ | b.effect_, out);
464
+ }
465
+
466
+
467
+ ExprEffect ExprEffect::Define(const std::string& name) {
468
+ Environment* e = env();
469
+ if (e == NULL) {
470
+ e = Environment::Allocate(Environment());
471
+ }
472
+ e->MDefine(name);
473
+ return ExprEffect(effect_, e);
474
+ }
475
+
476
+
477
+ static std::string THIS ("this");
478
+
479
+
480
+ class FunctionAnalyzer {
481
+ public:
482
+ FunctionAnalyzer(clang::MangleContext* ctx,
483
+ clang::DeclarationName handle_decl_name,
484
+ clang::CXXRecordDecl* object_decl,
485
+ clang::CXXRecordDecl* smi_decl,
486
+ clang::Diagnostic& d,
487
+ clang::SourceManager& sm,
488
+ bool dead_vars_analysis)
489
+ : ctx_(ctx),
490
+ handle_decl_name_(handle_decl_name),
491
+ object_decl_(object_decl),
492
+ smi_decl_(smi_decl),
493
+ d_(d),
494
+ sm_(sm),
495
+ block_(NULL),
496
+ dead_vars_analysis_(dead_vars_analysis) {
497
+ }
498
+
499
+
500
+ // --------------------------------------------------------------------------
501
+ // Expressions
502
+ // --------------------------------------------------------------------------
503
+
504
+ ExprEffect VisitExpr(clang::Expr* expr, const Environment& env) {
505
+ #define VISIT(type) do { \
506
+ clang::type* concrete_expr = dyn_cast_or_null<clang::type>(expr); \
507
+ if (concrete_expr != NULL) { \
508
+ return Visit##type (concrete_expr, env); \
509
+ } \
510
+ } while(0);
511
+
512
+ VISIT(AbstractConditionalOperator);
513
+ VISIT(AddrLabelExpr);
514
+ VISIT(ArraySubscriptExpr);
515
+ VISIT(BinaryOperator);
516
+ VISIT(BinaryTypeTraitExpr);
517
+ VISIT(BlockDeclRefExpr);
518
+ VISIT(BlockExpr);
519
+ VISIT(CallExpr);
520
+ VISIT(CastExpr);
521
+ VISIT(CharacterLiteral);
522
+ VISIT(ChooseExpr);
523
+ VISIT(CompoundLiteralExpr);
524
+ VISIT(CXXBindTemporaryExpr);
525
+ VISIT(CXXBoolLiteralExpr);
526
+ VISIT(CXXConstructExpr);
527
+ VISIT(CXXDefaultArgExpr);
528
+ VISIT(CXXDeleteExpr);
529
+ VISIT(CXXDependentScopeMemberExpr);
530
+ VISIT(CXXNewExpr);
531
+ VISIT(CXXNoexceptExpr);
532
+ VISIT(CXXNullPtrLiteralExpr);
533
+ VISIT(CXXPseudoDestructorExpr);
534
+ VISIT(CXXScalarValueInitExpr);
535
+ VISIT(CXXThisExpr);
536
+ VISIT(CXXThrowExpr);
537
+ VISIT(CXXTypeidExpr);
538
+ VISIT(CXXUnresolvedConstructExpr);
539
+ VISIT(CXXUuidofExpr);
540
+ VISIT(DeclRefExpr);
541
+ VISIT(DependentScopeDeclRefExpr);
542
+ VISIT(DesignatedInitExpr);
543
+ VISIT(ExprWithCleanups);
544
+ VISIT(ExtVectorElementExpr);
545
+ VISIT(FloatingLiteral);
546
+ VISIT(GNUNullExpr);
547
+ VISIT(ImaginaryLiteral);
548
+ VISIT(ImplicitValueInitExpr);
549
+ VISIT(InitListExpr);
550
+ VISIT(IntegerLiteral);
551
+ VISIT(MemberExpr);
552
+ VISIT(OffsetOfExpr);
553
+ VISIT(OpaqueValueExpr);
554
+ VISIT(OverloadExpr);
555
+ VISIT(PackExpansionExpr);
556
+ VISIT(ParenExpr);
557
+ VISIT(ParenListExpr);
558
+ VISIT(PredefinedExpr);
559
+ VISIT(ShuffleVectorExpr);
560
+ VISIT(SizeOfPackExpr);
561
+ VISIT(StmtExpr);
562
+ VISIT(StringLiteral);
563
+ VISIT(SubstNonTypeTemplateParmPackExpr);
564
+ VISIT(UnaryExprOrTypeTraitExpr);
565
+ VISIT(UnaryOperator);
566
+ VISIT(UnaryTypeTraitExpr);
567
+ VISIT(VAArgExpr);
568
+ #undef VISIT
569
+
570
+ return ExprEffect::None();
571
+ }
572
+
573
+ #define DECL_VISIT_EXPR(type) \
574
+ ExprEffect Visit##type (clang::type* expr, const Environment& env)
575
+
576
+ #define IGNORE_EXPR(type) \
577
+ ExprEffect Visit##type (clang::type* expr, const Environment& env) { \
578
+ return ExprEffect::None(); \
579
+ }
580
+
581
+ IGNORE_EXPR(AddrLabelExpr);
582
+ IGNORE_EXPR(BinaryTypeTraitExpr);
583
+ IGNORE_EXPR(BlockExpr);
584
+ IGNORE_EXPR(CharacterLiteral);
585
+ IGNORE_EXPR(ChooseExpr);
586
+ IGNORE_EXPR(CompoundLiteralExpr);
587
+ IGNORE_EXPR(CXXBoolLiteralExpr);
588
+ IGNORE_EXPR(CXXDependentScopeMemberExpr);
589
+ IGNORE_EXPR(CXXNullPtrLiteralExpr);
590
+ IGNORE_EXPR(CXXPseudoDestructorExpr);
591
+ IGNORE_EXPR(CXXScalarValueInitExpr);
592
+ IGNORE_EXPR(CXXNoexceptExpr);
593
+ IGNORE_EXPR(CXXTypeidExpr);
594
+ IGNORE_EXPR(CXXUnresolvedConstructExpr);
595
+ IGNORE_EXPR(CXXUuidofExpr);
596
+ IGNORE_EXPR(DependentScopeDeclRefExpr);
597
+ IGNORE_EXPR(DesignatedInitExpr);
598
+ IGNORE_EXPR(ExtVectorElementExpr);
599
+ IGNORE_EXPR(FloatingLiteral);
600
+ IGNORE_EXPR(ImaginaryLiteral);
601
+ IGNORE_EXPR(IntegerLiteral);
602
+ IGNORE_EXPR(OffsetOfExpr);
603
+ IGNORE_EXPR(ImplicitValueInitExpr);
604
+ IGNORE_EXPR(PackExpansionExpr);
605
+ IGNORE_EXPR(PredefinedExpr);
606
+ IGNORE_EXPR(ShuffleVectorExpr);
607
+ IGNORE_EXPR(SizeOfPackExpr);
608
+ IGNORE_EXPR(StmtExpr);
609
+ IGNORE_EXPR(StringLiteral);
610
+ IGNORE_EXPR(SubstNonTypeTemplateParmPackExpr);
611
+ IGNORE_EXPR(UnaryExprOrTypeTraitExpr);
612
+ IGNORE_EXPR(UnaryTypeTraitExpr);
613
+ IGNORE_EXPR(VAArgExpr);
614
+ IGNORE_EXPR(GNUNullExpr);
615
+ IGNORE_EXPR(OverloadExpr);
616
+
617
+ DECL_VISIT_EXPR(CXXThisExpr) {
618
+ return Use(expr, expr->getType(), THIS, env);
619
+ }
620
+
621
+ DECL_VISIT_EXPR(AbstractConditionalOperator) {
622
+ Environment after_cond = env.ApplyEffect(VisitExpr(expr->getCond(), env));
623
+ return ExprEffect::Merge(VisitExpr(expr->getTrueExpr(), after_cond),
624
+ VisitExpr(expr->getFalseExpr(), after_cond));
625
+ }
626
+
627
+ DECL_VISIT_EXPR(ArraySubscriptExpr) {
628
+ clang::Expr* exprs[2] = {expr->getBase(), expr->getIdx()};
629
+ return Par(expr, 2, exprs, env);
630
+ }
631
+
632
+ bool IsRawPointerVar(clang::Expr* expr, std::string* var_name) {
633
+ if (isa<clang::BlockDeclRefExpr>(expr)) {
634
+ *var_name = cast<clang::BlockDeclRefExpr>(expr)->getDecl()->
635
+ getNameAsString();
636
+ return true;
637
+ } else if (isa<clang::DeclRefExpr>(expr)) {
638
+ *var_name = cast<clang::DeclRefExpr>(expr)->getDecl()->getNameAsString();
639
+ return true;
640
+ }
641
+ return false;
642
+ }
643
+
644
+ DECL_VISIT_EXPR(BinaryOperator) {
645
+ clang::Expr* lhs = expr->getLHS();
646
+ clang::Expr* rhs = expr->getRHS();
647
+ clang::Expr* exprs[2] = {lhs, rhs};
648
+
649
+ switch (expr->getOpcode()) {
650
+ case clang::BO_Comma:
651
+ return Seq(expr, 2, exprs, env);
652
+
653
+ case clang::BO_LAnd:
654
+ case clang::BO_LOr:
655
+ return ExprEffect::Merge(VisitExpr(lhs, env), VisitExpr(rhs, env));
656
+
657
+ case clang::BO_Assign: {
658
+ std::string var_name;
659
+ if (IsRawPointerVar(lhs, &var_name)) {
660
+ return VisitExpr(rhs, env).Define(var_name);
661
+ }
662
+ return Par(expr, 2, exprs, env);
663
+ }
664
+
665
+ default:
666
+ return Par(expr, 2, exprs, env);
667
+ }
668
+ }
669
+
670
+ DECL_VISIT_EXPR(CXXBindTemporaryExpr) {
671
+ return VisitExpr(expr->getSubExpr(), env);
672
+ }
673
+
674
+ DECL_VISIT_EXPR(CXXConstructExpr) {
675
+ return VisitArguments<>(expr, env);
676
+ }
677
+
678
+ DECL_VISIT_EXPR(CXXDefaultArgExpr) {
679
+ return VisitExpr(expr->getExpr(), env);
680
+ }
681
+
682
+ DECL_VISIT_EXPR(CXXDeleteExpr) {
683
+ return VisitExpr(expr->getArgument(), env);
684
+ }
685
+
686
+ DECL_VISIT_EXPR(CXXNewExpr) {
687
+ return Par(expr,
688
+ expr->getNumConstructorArgs(),
689
+ expr->getConstructorArgs(),
690
+ env);
691
+ }
692
+
693
+ DECL_VISIT_EXPR(ExprWithCleanups) {
694
+ return VisitExpr(expr->getSubExpr(), env);
695
+ }
696
+
697
+ DECL_VISIT_EXPR(CXXThrowExpr) {
698
+ return VisitExpr(expr->getSubExpr(), env);
699
+ }
700
+
701
+ DECL_VISIT_EXPR(InitListExpr) {
702
+ return Seq(expr, expr->getNumInits(), expr->getInits(), env);
703
+ }
704
+
705
+ DECL_VISIT_EXPR(MemberExpr) {
706
+ return VisitExpr(expr->getBase(), env);
707
+ }
708
+
709
+ DECL_VISIT_EXPR(OpaqueValueExpr) {
710
+ return VisitExpr(expr->getSourceExpr(), env);
711
+ }
712
+
713
+ DECL_VISIT_EXPR(ParenExpr) {
714
+ return VisitExpr(expr->getSubExpr(), env);
715
+ }
716
+
717
+ DECL_VISIT_EXPR(ParenListExpr) {
718
+ return Par(expr, expr->getNumExprs(), expr->getExprs(), env);
719
+ }
720
+
721
+ DECL_VISIT_EXPR(UnaryOperator) {
722
+ // TODO We are treating all expressions that look like &raw_pointer_var
723
+ // as definitions of raw_pointer_var. This should be changed to
724
+ // recognize less generic pattern:
725
+ //
726
+ // if (maybe_object->ToObject(&obj)) return maybe_object;
727
+ //
728
+ if (expr->getOpcode() == clang::UO_AddrOf) {
729
+ std::string var_name;
730
+ if (IsRawPointerVar(expr->getSubExpr(), &var_name)) {
731
+ return ExprEffect::None().Define(var_name);
732
+ }
733
+ }
734
+ return VisitExpr(expr->getSubExpr(), env);
735
+ }
736
+
737
+ DECL_VISIT_EXPR(CastExpr) {
738
+ return VisitExpr(expr->getSubExpr(), env);
739
+ }
740
+
741
+ DECL_VISIT_EXPR(DeclRefExpr) {
742
+ return Use(expr, expr->getDecl(), env);
743
+ }
744
+
745
+ DECL_VISIT_EXPR(BlockDeclRefExpr) {
746
+ return Use(expr, expr->getDecl(), env);
747
+ }
748
+
749
+ ExprEffect Par(clang::Expr* parent,
750
+ int n,
751
+ clang::Expr** exprs,
752
+ const Environment& env) {
753
+ CallProps props;
754
+
755
+ for (int i = 0; i < n; ++i) {
756
+ props.SetEffect(i, VisitExpr(exprs[i], env));
757
+ }
758
+
759
+ if (!props.IsSafe()) ReportUnsafe(parent, BAD_EXPR_MSG);
760
+
761
+ return props.ComputeCumulativeEffect(IsRawPointerType(parent->getType()));
762
+ }
763
+
764
+ ExprEffect Seq(clang::Stmt* parent,
765
+ int n,
766
+ clang::Expr** exprs,
767
+ const Environment& env) {
768
+ ExprEffect out = ExprEffect::None();
769
+ Environment out_env = env;
770
+ for (int i = 0; i < n; ++i) {
771
+ out = ExprEffect::MergeSeq(out, VisitExpr(exprs[i], out_env));
772
+ out_env = out_env.ApplyEffect(out);
773
+ }
774
+ return out;
775
+ }
776
+
777
+ ExprEffect Use(const clang::Expr* parent,
778
+ const clang::QualType& var_type,
779
+ const std::string& var_name,
780
+ const Environment& env) {
781
+ if (IsRawPointerType(var_type)) {
782
+ if (!env.IsAlive(var_name) && dead_vars_analysis_) {
783
+ ReportUnsafe(parent, DEAD_VAR_MSG);
784
+ }
785
+ return ExprEffect::RawUse();
786
+ }
787
+ return ExprEffect::None();
788
+ }
789
+
790
+ ExprEffect Use(const clang::Expr* parent,
791
+ const clang::ValueDecl* var,
792
+ const Environment& env) {
793
+ return Use(parent, var->getType(), var->getNameAsString(), env);
794
+ }
795
+
796
+
797
+ template<typename ExprType>
798
+ ExprEffect VisitArguments(ExprType* call, const Environment& env) {
799
+ CallProps props;
800
+ VisitArguments<>(call, &props, env);
801
+ if (!props.IsSafe()) ReportUnsafe(call, BAD_EXPR_MSG);
802
+ return props.ComputeCumulativeEffect(IsRawPointerType(call->getType()));
803
+ }
804
+
805
+ template<typename ExprType>
806
+ void VisitArguments(ExprType* call,
807
+ CallProps* props,
808
+ const Environment& env) {
809
+ for (unsigned arg = 0; arg < call->getNumArgs(); arg++) {
810
+ props->SetEffect(arg + 1, VisitExpr(call->getArg(arg), env));
811
+ }
812
+ }
813
+
814
+
815
+ ExprEffect VisitCallExpr(clang::CallExpr* call,
816
+ const Environment& env) {
817
+ CallProps props;
818
+
819
+ clang::CXXMemberCallExpr* memcall =
820
+ dyn_cast_or_null<clang::CXXMemberCallExpr>(call);
821
+ if (memcall != NULL) {
822
+ clang::Expr* receiver = memcall->getImplicitObjectArgument();
823
+ props.SetEffect(0, VisitExpr(receiver, env));
824
+ }
825
+
826
+ VisitArguments<>(call, &props, env);
827
+
828
+ if (!props.IsSafe()) ReportUnsafe(call, BAD_EXPR_MSG);
829
+
830
+ ExprEffect out =
831
+ props.ComputeCumulativeEffect(IsRawPointerType(call->getType()));
832
+
833
+ clang::FunctionDecl* callee = call->getDirectCallee();
834
+ if ((callee != NULL) && KnownToCauseGC(ctx_, callee)) {
835
+ out.setGC();
836
+ }
837
+
838
+ return out;
839
+ }
840
+
841
+ // --------------------------------------------------------------------------
842
+ // Statements
843
+ // --------------------------------------------------------------------------
844
+
845
+ Environment VisitStmt(clang::Stmt* stmt, const Environment& env) {
846
+ #define VISIT(type) do { \
847
+ clang::type* concrete_stmt = dyn_cast_or_null<clang::type>(stmt); \
848
+ if (concrete_stmt != NULL) { \
849
+ return Visit##type (concrete_stmt, env); \
850
+ } \
851
+ } while(0);
852
+
853
+ if (clang::Expr* expr = dyn_cast_or_null<clang::Expr>(stmt)) {
854
+ return env.ApplyEffect(VisitExpr(expr, env));
855
+ }
856
+
857
+ VISIT(AsmStmt);
858
+ VISIT(BreakStmt);
859
+ VISIT(CompoundStmt);
860
+ VISIT(ContinueStmt);
861
+ VISIT(CXXCatchStmt);
862
+ VISIT(CXXTryStmt);
863
+ VISIT(DeclStmt);
864
+ VISIT(DoStmt);
865
+ VISIT(ForStmt);
866
+ VISIT(GotoStmt);
867
+ VISIT(IfStmt);
868
+ VISIT(IndirectGotoStmt);
869
+ VISIT(LabelStmt);
870
+ VISIT(NullStmt);
871
+ VISIT(ReturnStmt);
872
+ VISIT(CaseStmt);
873
+ VISIT(DefaultStmt);
874
+ VISIT(SwitchStmt);
875
+ VISIT(WhileStmt);
876
+ #undef VISIT
877
+
878
+ return env;
879
+ }
880
+
881
+ #define DECL_VISIT_STMT(type) \
882
+ Environment Visit##type (clang::type* stmt, const Environment& env)
883
+
884
+ #define IGNORE_STMT(type) \
885
+ Environment Visit##type (clang::type* stmt, const Environment& env) { \
886
+ return env; \
887
+ }
888
+
889
+ IGNORE_STMT(IndirectGotoStmt);
890
+ IGNORE_STMT(NullStmt);
891
+ IGNORE_STMT(AsmStmt);
892
+
893
+ // We are ignoring control flow for simplicity.
894
+ IGNORE_STMT(GotoStmt);
895
+ IGNORE_STMT(LabelStmt);
896
+
897
+ // We are ignoring try/catch because V8 does not use them.
898
+ IGNORE_STMT(CXXCatchStmt);
899
+ IGNORE_STMT(CXXTryStmt);
900
+
901
+ class Block {
902
+ public:
903
+ Block(const Environment& in,
904
+ FunctionAnalyzer* owner)
905
+ : in_(in),
906
+ out_(Environment::Unreachable()),
907
+ changed_(false),
908
+ owner_(owner) {
909
+ parent_ = owner_->EnterBlock(this);
910
+ }
911
+
912
+ ~Block() {
913
+ owner_->LeaveBlock(parent_);
914
+ }
915
+
916
+ void MergeIn(const Environment& env) {
917
+ Environment old_in = in_;
918
+ in_ = Environment::Merge(in_, env);
919
+ changed_ = !old_in.Equal(in_);
920
+ }
921
+
922
+ bool changed() {
923
+ if (changed_) {
924
+ changed_ = false;
925
+ return true;
926
+ }
927
+ return false;
928
+ }
929
+
930
+ const Environment& in() {
931
+ return in_;
932
+ }
933
+
934
+ const Environment& out() {
935
+ return out_;
936
+ }
937
+
938
+ void MergeOut(const Environment& env) {
939
+ out_ = Environment::Merge(out_, env);
940
+ }
941
+
942
+ void Seq(clang::Stmt* a, clang::Stmt* b, clang::Stmt* c) {
943
+ Environment a_out = owner_->VisitStmt(a, in());
944
+ Environment b_out = owner_->VisitStmt(b, a_out);
945
+ Environment c_out = owner_->VisitStmt(c, b_out);
946
+ MergeOut(c_out);
947
+ }
948
+
949
+ void Seq(clang::Stmt* a, clang::Stmt* b) {
950
+ Environment a_out = owner_->VisitStmt(a, in());
951
+ Environment b_out = owner_->VisitStmt(b, a_out);
952
+ MergeOut(b_out);
953
+ }
954
+
955
+ void Loop(clang::Stmt* a, clang::Stmt* b, clang::Stmt* c) {
956
+ Seq(a, b, c);
957
+ MergeIn(out());
958
+ }
959
+
960
+ void Loop(clang::Stmt* a, clang::Stmt* b) {
961
+ Seq(a, b);
962
+ MergeIn(out());
963
+ }
964
+
965
+
966
+ private:
967
+ Environment in_;
968
+ Environment out_;
969
+ bool changed_;
970
+ FunctionAnalyzer* owner_;
971
+ Block* parent_;
972
+ };
973
+
974
+
975
+ DECL_VISIT_STMT(BreakStmt) {
976
+ block_->MergeOut(env);
977
+ return Environment::Unreachable();
978
+ }
979
+
980
+ DECL_VISIT_STMT(ContinueStmt) {
981
+ block_->MergeIn(env);
982
+ return Environment::Unreachable();
983
+ }
984
+
985
+ DECL_VISIT_STMT(CompoundStmt) {
986
+ Environment out = env;
987
+ clang::CompoundStmt::body_iterator end = stmt->body_end();
988
+ for (clang::CompoundStmt::body_iterator s = stmt->body_begin();
989
+ s != end;
990
+ ++s) {
991
+ out = VisitStmt(*s, out);
992
+ }
993
+ return out;
994
+ }
995
+
996
+ DECL_VISIT_STMT(WhileStmt) {
997
+ Block block (env, this);
998
+ do {
999
+ block.Loop(stmt->getCond(), stmt->getBody());
1000
+ } while (block.changed());
1001
+ return block.out();
1002
+ }
1003
+
1004
+ DECL_VISIT_STMT(DoStmt) {
1005
+ Block block (env, this);
1006
+ do {
1007
+ block.Loop(stmt->getBody(), stmt->getCond());
1008
+ } while (block.changed());
1009
+ return block.out();
1010
+ }
1011
+
1012
+ DECL_VISIT_STMT(ForStmt) {
1013
+ Block block (VisitStmt(stmt->getInit(), env), this);
1014
+ do {
1015
+ block.Loop(stmt->getCond(),
1016
+ stmt->getBody(),
1017
+ stmt->getInc());
1018
+ } while (block.changed());
1019
+ return block.out();
1020
+ }
1021
+
1022
+ DECL_VISIT_STMT(IfStmt) {
1023
+ Environment cond_out = VisitStmt(stmt->getCond(), env);
1024
+ Environment then_out = VisitStmt(stmt->getThen(), cond_out);
1025
+ Environment else_out = VisitStmt(stmt->getElse(), cond_out);
1026
+ return Environment::Merge(then_out, else_out);
1027
+ }
1028
+
1029
+ DECL_VISIT_STMT(SwitchStmt) {
1030
+ Block block (env, this);
1031
+ block.Seq(stmt->getCond(), stmt->getBody());
1032
+ return block.out();
1033
+ }
1034
+
1035
+ DECL_VISIT_STMT(CaseStmt) {
1036
+ Environment in = Environment::Merge(env, block_->in());
1037
+ Environment after_lhs = VisitStmt(stmt->getLHS(), in);
1038
+ return VisitStmt(stmt->getSubStmt(), after_lhs);
1039
+ }
1040
+
1041
+ DECL_VISIT_STMT(DefaultStmt) {
1042
+ Environment in = Environment::Merge(env, block_->in());
1043
+ return VisitStmt(stmt->getSubStmt(), in);
1044
+ }
1045
+
1046
+ DECL_VISIT_STMT(ReturnStmt) {
1047
+ VisitExpr(stmt->getRetValue(), env);
1048
+ return Environment::Unreachable();
1049
+ }
1050
+
1051
+ const clang::TagType* ToTagType(const clang::Type* t) {
1052
+ if (t == NULL) {
1053
+ return NULL;
1054
+ } else if (isa<clang::TagType>(t)) {
1055
+ return cast<clang::TagType>(t);
1056
+ } else if (isa<clang::SubstTemplateTypeParmType>(t)) {
1057
+ return ToTagType(cast<clang::SubstTemplateTypeParmType>(t)->
1058
+ getReplacementType().getTypePtr());
1059
+ } else {
1060
+ return NULL;
1061
+ }
1062
+ }
1063
+
1064
+ bool IsDerivedFrom(clang::CXXRecordDecl* record,
1065
+ clang::CXXRecordDecl* base) {
1066
+ return (record == base) || record->isDerivedFrom(base);
1067
+ }
1068
+
1069
+ bool IsRawPointerType(clang::QualType qtype) {
1070
+ const clang::PointerType* type =
1071
+ dyn_cast_or_null<clang::PointerType>(qtype.getTypePtrOrNull());
1072
+ if (type == NULL) return false;
1073
+
1074
+ const clang::TagType* pointee =
1075
+ ToTagType(type->getPointeeType().getTypePtr());
1076
+ if (pointee == NULL) return false;
1077
+
1078
+ clang::CXXRecordDecl* record =
1079
+ dyn_cast_or_null<clang::CXXRecordDecl>(pointee->getDecl());
1080
+ if (record == NULL) return false;
1081
+
1082
+ if (!InV8Namespace(record)) return false;
1083
+
1084
+ if (!record->hasDefinition()) return false;
1085
+
1086
+ record = record->getDefinition();
1087
+
1088
+ return IsDerivedFrom(record, object_decl_) &&
1089
+ !IsDerivedFrom(record, smi_decl_);
1090
+ }
1091
+
1092
+ Environment VisitDecl(clang::Decl* decl, const Environment& env) {
1093
+ if (clang::VarDecl* var = dyn_cast<clang::VarDecl>(decl)) {
1094
+ Environment out = var->hasInit() ? VisitStmt(var->getInit(), env) : env;
1095
+
1096
+ if (IsRawPointerType(var->getType())) {
1097
+ out = out.Define(var->getNameAsString());
1098
+ }
1099
+
1100
+ return out;
1101
+ }
1102
+ // TODO: handle other declarations?
1103
+ return env;
1104
+ }
1105
+
1106
+ DECL_VISIT_STMT(DeclStmt) {
1107
+ Environment out = env;
1108
+ clang::DeclStmt::decl_iterator end = stmt->decl_end();
1109
+ for (clang::DeclStmt::decl_iterator decl = stmt->decl_begin();
1110
+ decl != end;
1111
+ ++decl) {
1112
+ out = VisitDecl(*decl, out);
1113
+ }
1114
+ return out;
1115
+ }
1116
+
1117
+
1118
+ void DefineParameters(const clang::FunctionDecl* f,
1119
+ Environment* env) {
1120
+ env->MDefine(THIS);
1121
+ clang::FunctionDecl::param_const_iterator end = f->param_end();
1122
+ for (clang::FunctionDecl::param_const_iterator p = f->param_begin();
1123
+ p != end;
1124
+ ++p) {
1125
+ env->MDefine((*p)->getNameAsString());
1126
+ }
1127
+ }
1128
+
1129
+
1130
+ void AnalyzeFunction(const clang::FunctionDecl* f) {
1131
+ const clang::FunctionDecl* body = NULL;
1132
+ if (f->hasBody(body)) {
1133
+ Environment env;
1134
+ DefineParameters(body, &env);
1135
+ VisitStmt(body->getBody(), env);
1136
+ Environment::ClearSymbolTable();
1137
+ }
1138
+ }
1139
+
1140
+ Block* EnterBlock(Block* block) {
1141
+ Block* parent = block_;
1142
+ block_ = block;
1143
+ return parent;
1144
+ }
1145
+
1146
+ void LeaveBlock(Block* block) {
1147
+ block_ = block;
1148
+ }
1149
+
1150
+ private:
1151
+ void ReportUnsafe(const clang::Expr* expr, const std::string& msg) {
1152
+ d_.Report(clang::FullSourceLoc(expr->getExprLoc(), sm_),
1153
+ d_.getCustomDiagID(clang::Diagnostic::Warning, msg));
1154
+ }
1155
+
1156
+
1157
+ clang::MangleContext* ctx_;
1158
+ clang::DeclarationName handle_decl_name_;
1159
+ clang::CXXRecordDecl* object_decl_;
1160
+ clang::CXXRecordDecl* smi_decl_;
1161
+
1162
+ clang::Diagnostic& d_;
1163
+ clang::SourceManager& sm_;
1164
+
1165
+ Block* block_;
1166
+ bool dead_vars_analysis_;
1167
+ };
1168
+
1169
+
1170
+ class ProblemsFinder : public clang::ASTConsumer,
1171
+ public clang::RecursiveASTVisitor<ProblemsFinder> {
1172
+ public:
1173
+ ProblemsFinder(clang::Diagnostic& d,
1174
+ clang::SourceManager& sm,
1175
+ const std::vector<std::string>& args)
1176
+ : d_(d), sm_(sm), dead_vars_analysis_(false) {
1177
+ for (unsigned i = 0; i < args.size(); ++i) {
1178
+ if (args[i] == "--dead-vars") {
1179
+ dead_vars_analysis_ = true;
1180
+ }
1181
+ }
1182
+ }
1183
+
1184
+ virtual void HandleTranslationUnit(clang::ASTContext &ctx) {
1185
+ Resolver r(ctx);
1186
+
1187
+ clang::CXXRecordDecl* object_decl =
1188
+ r.ResolveNamespace("v8").ResolveNamespace("internal").
1189
+ Resolve<clang::CXXRecordDecl>("Object");
1190
+
1191
+ clang::CXXRecordDecl* smi_decl =
1192
+ r.ResolveNamespace("v8").ResolveNamespace("internal").
1193
+ Resolve<clang::CXXRecordDecl>("Smi");
1194
+
1195
+ if (object_decl != NULL) object_decl = object_decl->getDefinition();
1196
+
1197
+ if (smi_decl != NULL) smi_decl = smi_decl->getDefinition();
1198
+
1199
+ if (object_decl != NULL && smi_decl != NULL) {
1200
+ function_analyzer_ =
1201
+ new FunctionAnalyzer(clang::createItaniumMangleContext(ctx, d_),
1202
+ r.ResolveName("Handle"),
1203
+ object_decl,
1204
+ smi_decl,
1205
+ d_,
1206
+ sm_,
1207
+ dead_vars_analysis_);
1208
+ TraverseDecl(ctx.getTranslationUnitDecl());
1209
+ } else {
1210
+ if (object_decl == NULL) {
1211
+ llvm::errs() << "Failed to resolve v8::internal::Object\n";
1212
+ }
1213
+ if (smi_decl == NULL) {
1214
+ llvm::errs() << "Failed to resolve v8::internal::Smi\n";
1215
+ }
1216
+ }
1217
+ }
1218
+
1219
+ virtual bool VisitFunctionDecl(clang::FunctionDecl* decl) {
1220
+ function_analyzer_->AnalyzeFunction(decl);
1221
+ return true;
1222
+ }
1223
+
1224
+ private:
1225
+ clang::Diagnostic& d_;
1226
+ clang::SourceManager& sm_;
1227
+ bool dead_vars_analysis_;
1228
+
1229
+ FunctionAnalyzer* function_analyzer_;
1230
+ };
1231
+
1232
+
1233
+ template<typename ConsumerType>
1234
+ class Action : public clang::PluginASTAction {
1235
+ protected:
1236
+ clang::ASTConsumer *CreateASTConsumer(clang::CompilerInstance &CI,
1237
+ llvm::StringRef InFile) {
1238
+ return new ConsumerType(CI.getDiagnostics(), CI.getSourceManager(), args_);
1239
+ }
1240
+
1241
+ bool ParseArgs(const clang::CompilerInstance &CI,
1242
+ const std::vector<std::string>& args) {
1243
+ args_ = args;
1244
+ return true;
1245
+ }
1246
+
1247
+ void PrintHelp(llvm::raw_ostream& ros) {
1248
+ }
1249
+ private:
1250
+ std::vector<std::string> args_;
1251
+ };
1252
+
1253
+
1254
+ }
1255
+
1256
+ static clang::FrontendPluginRegistry::Add<Action<ProblemsFinder> >
1257
+ FindProblems("find-problems", "Find GC-unsafe places.");
1258
+
1259
+ static clang::FrontendPluginRegistry::Add<
1260
+ Action<FunctionDeclarationFinder> >
1261
+ DumpCallees("dump-callees", "Dump callees for each function.");