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,305 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright 2008 the V8 project authors. All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following
12
+ # disclaimer in the documentation and/or other materials provided
13
+ # with the distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived
16
+ # from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ try:
31
+ import hashlib
32
+ md5er = hashlib.md5
33
+ except ImportError, e:
34
+ import md5
35
+ md5er = md5.new
36
+
37
+
38
+ import optparse
39
+ import os
40
+ from os.path import abspath, join, dirname, basename, exists
41
+ import pickle
42
+ import re
43
+ import sys
44
+ import subprocess
45
+
46
+ # Disabled LINT rules and reason.
47
+ # build/include_what_you_use: Started giving false positives for variables
48
+ # named "string" and "map" assuming that you needed to include STL headers.
49
+
50
+ ENABLED_LINT_RULES = """
51
+ build/class
52
+ build/deprecated
53
+ build/endif_comment
54
+ build/forward_decl
55
+ build/include_order
56
+ build/printf_format
57
+ build/storage_class
58
+ legal/copyright
59
+ readability/boost
60
+ readability/braces
61
+ readability/casting
62
+ readability/check
63
+ readability/constructors
64
+ readability/fn_size
65
+ readability/function
66
+ readability/multiline_comment
67
+ readability/multiline_string
68
+ readability/streams
69
+ readability/todo
70
+ readability/utf8
71
+ runtime/arrays
72
+ runtime/casting
73
+ runtime/deprecated_fn
74
+ runtime/explicit
75
+ runtime/int
76
+ runtime/memset
77
+ runtime/mutex
78
+ runtime/nonconf
79
+ runtime/printf
80
+ runtime/printf_format
81
+ runtime/references
82
+ runtime/rtti
83
+ runtime/sizeof
84
+ runtime/string
85
+ runtime/virtual
86
+ runtime/vlog
87
+ whitespace/blank_line
88
+ whitespace/braces
89
+ whitespace/comma
90
+ whitespace/comments
91
+ whitespace/end_of_line
92
+ whitespace/ending_newline
93
+ whitespace/indent
94
+ whitespace/labels
95
+ whitespace/line_length
96
+ whitespace/newline
97
+ whitespace/operators
98
+ whitespace/parens
99
+ whitespace/tab
100
+ whitespace/todo
101
+ """.split()
102
+
103
+
104
+ class FileContentsCache(object):
105
+
106
+ def __init__(self, sums_file_name):
107
+ self.sums = {}
108
+ self.sums_file_name = sums_file_name
109
+
110
+ def Load(self):
111
+ try:
112
+ sums_file = None
113
+ try:
114
+ sums_file = open(self.sums_file_name, 'r')
115
+ self.sums = pickle.load(sums_file)
116
+ except IOError:
117
+ # File might not exist, this is OK.
118
+ pass
119
+ finally:
120
+ if sums_file:
121
+ sums_file.close()
122
+
123
+ def Save(self):
124
+ try:
125
+ sums_file = open(self.sums_file_name, 'w')
126
+ pickle.dump(self.sums, sums_file)
127
+ finally:
128
+ sums_file.close()
129
+
130
+ def FilterUnchangedFiles(self, files):
131
+ changed_or_new = []
132
+ for file in files:
133
+ try:
134
+ handle = open(file, "r")
135
+ file_sum = md5er(handle.read()).digest()
136
+ if not file in self.sums or self.sums[file] != file_sum:
137
+ changed_or_new.append(file)
138
+ self.sums[file] = file_sum
139
+ finally:
140
+ handle.close()
141
+ return changed_or_new
142
+
143
+ def RemoveFile(self, file):
144
+ if file in self.sums:
145
+ self.sums.pop(file)
146
+
147
+
148
+ class SourceFileProcessor(object):
149
+ """
150
+ Utility class that can run through a directory structure, find all relevant
151
+ files and invoke a custom check on the files.
152
+ """
153
+
154
+ def Run(self, path):
155
+ all_files = []
156
+ for file in self.GetPathsToSearch():
157
+ all_files += self.FindFilesIn(join(path, file))
158
+ if not self.ProcessFiles(all_files, path):
159
+ return False
160
+ return True
161
+
162
+ def IgnoreDir(self, name):
163
+ return name.startswith('.') or name == 'data' or name == 'sputniktests'
164
+
165
+ def IgnoreFile(self, name):
166
+ return name.startswith('.')
167
+
168
+ def FindFilesIn(self, path):
169
+ result = []
170
+ for (root, dirs, files) in os.walk(path):
171
+ for ignored in [x for x in dirs if self.IgnoreDir(x)]:
172
+ dirs.remove(ignored)
173
+ for file in files:
174
+ if not self.IgnoreFile(file) and self.IsRelevant(file):
175
+ result.append(join(root, file))
176
+ return result
177
+
178
+
179
+ class CppLintProcessor(SourceFileProcessor):
180
+ """
181
+ Lint files to check that they follow the google code style.
182
+ """
183
+
184
+ def IsRelevant(self, name):
185
+ return name.endswith('.cc') or name.endswith('.h')
186
+
187
+ def IgnoreDir(self, name):
188
+ return (super(CppLintProcessor, self).IgnoreDir(name)
189
+ or (name == 'third_party'))
190
+
191
+ IGNORE_LINT = ['flag-definitions.h']
192
+
193
+ def IgnoreFile(self, name):
194
+ return (super(CppLintProcessor, self).IgnoreFile(name)
195
+ or (name in CppLintProcessor.IGNORE_LINT))
196
+
197
+ def GetPathsToSearch(self):
198
+ return ['src', 'preparser', 'include', 'samples', join('test', 'cctest')]
199
+
200
+ def ProcessFiles(self, files, path):
201
+ good_files_cache = FileContentsCache('.cpplint-cache')
202
+ good_files_cache.Load()
203
+ files = good_files_cache.FilterUnchangedFiles(files)
204
+ if len(files) == 0:
205
+ print 'No changes in files detected. Skipping cpplint check.'
206
+ return True
207
+
208
+ filt = '-,' + ",".join(['+' + n for n in ENABLED_LINT_RULES])
209
+ command = ['cpplint.py', '--filter', filt] + join(files)
210
+ local_cpplint = join(path, "tools", "cpplint.py")
211
+ if exists(local_cpplint):
212
+ command = ['python', local_cpplint, '--filter', filt] + join(files)
213
+
214
+ process = subprocess.Popen(command, stderr=subprocess.PIPE)
215
+ LINT_ERROR_PATTERN = re.compile(r'^(.+)[:(]\d+[:)]')
216
+ while True:
217
+ out_line = process.stderr.readline()
218
+ if out_line == '' and process.poll() != None:
219
+ break
220
+ sys.stderr.write(out_line)
221
+ m = LINT_ERROR_PATTERN.match(out_line)
222
+ if m:
223
+ good_files_cache.RemoveFile(m.group(1))
224
+
225
+ good_files_cache.Save()
226
+ return process.returncode == 0
227
+
228
+
229
+ COPYRIGHT_HEADER_PATTERN = re.compile(
230
+ r'Copyright [\d-]*20[0-1][0-9] the V8 project authors. All rights reserved.')
231
+
232
+ class SourceProcessor(SourceFileProcessor):
233
+ """
234
+ Check that all files include a copyright notice.
235
+ """
236
+
237
+ RELEVANT_EXTENSIONS = ['.js', '.cc', '.h', '.py', '.c', 'SConscript',
238
+ 'SConstruct', '.status']
239
+ def IsRelevant(self, name):
240
+ for ext in SourceProcessor.RELEVANT_EXTENSIONS:
241
+ if name.endswith(ext):
242
+ return True
243
+ return False
244
+
245
+ def GetPathsToSearch(self):
246
+ return ['.']
247
+
248
+ def IgnoreDir(self, name):
249
+ return (super(SourceProcessor, self).IgnoreDir(name)
250
+ or (name == 'third_party')
251
+ or (name == 'obj'))
252
+
253
+ IGNORE_COPYRIGHTS = ['earley-boyer.js', 'raytrace.js', 'crypto.js',
254
+ 'libraries.cc', 'libraries-empty.cc', 'jsmin.py', 'regexp-pcre.js']
255
+ IGNORE_TABS = IGNORE_COPYRIGHTS + ['unicode-test.js',
256
+ 'html-comments.js']
257
+
258
+ def ProcessContents(self, name, contents):
259
+ result = True
260
+ base = basename(name)
261
+ if not base in SourceProcessor.IGNORE_TABS:
262
+ if '\t' in contents:
263
+ print "%s contains tabs" % name
264
+ result = False
265
+ if not base in SourceProcessor.IGNORE_COPYRIGHTS:
266
+ if not COPYRIGHT_HEADER_PATTERN.search(contents):
267
+ print "%s is missing a correct copyright header." % name
268
+ result = False
269
+ return result
270
+
271
+ def ProcessFiles(self, files, path):
272
+ success = True
273
+ for file in files:
274
+ try:
275
+ handle = open(file)
276
+ contents = handle.read()
277
+ success = self.ProcessContents(file, contents) and success
278
+ finally:
279
+ handle.close()
280
+ return success
281
+
282
+
283
+ def GetOptions():
284
+ result = optparse.OptionParser()
285
+ result.add_option('--no-lint', help="Do not run cpplint", default=False,
286
+ action="store_true")
287
+ return result
288
+
289
+
290
+ def Main():
291
+ workspace = abspath(join(dirname(sys.argv[0]), '..'))
292
+ parser = GetOptions()
293
+ (options, args) = parser.parse_args()
294
+ success = True
295
+ if not options.no_lint:
296
+ success = CppLintProcessor().Run(workspace) and success
297
+ success = SourceProcessor().Run(workspace) and success
298
+ if success:
299
+ return 0
300
+ else:
301
+ return 1
302
+
303
+
304
+ if __name__ == '__main__':
305
+ sys.exit(Main())
@@ -0,0 +1,120 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright 2009 the V8 project authors. All rights reserved.
4
+ # Redistribution and use in source and binary forms, with or without
5
+ # modification, are permitted provided that the following conditions are
6
+ # met:
7
+ #
8
+ # * Redistributions of source code must retain the above copyright
9
+ # notice, this list of conditions and the following disclaimer.
10
+ # * Redistributions in binary form must reproduce the above
11
+ # copyright notice, this list of conditions and the following
12
+ # disclaimer in the documentation and/or other materials provided
13
+ # with the distribution.
14
+ # * Neither the name of Google Inc. nor the names of its
15
+ # contributors may be used to endorse or promote products derived
16
+ # from this software without specific prior written permission.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+ # This is an utility for converting V8 heap logs into .hp files that can
31
+ # be further processed using 'hp2ps' tool (bundled with GHC and Valgrind)
32
+ # to produce heap usage histograms.
33
+
34
+ # Sample usage:
35
+ # $ ./shell --log-gc script.js
36
+ # $ tools/process-heap-prof.py v8.log | hp2ps -c > script-heap-graph.ps
37
+ # ('-c' enables color, see hp2ps manual page for more options)
38
+ # or
39
+ # $ tools/process-heap-prof.py --js-cons-profile v8.log | hp2ps -c > script-heap-graph.ps
40
+ # to get JS constructor profile
41
+
42
+
43
+ import csv, sys, time, optparse
44
+
45
+ def ProcessLogFile(filename, options):
46
+ if options.js_cons_profile:
47
+ itemname = 'heap-js-cons-item'
48
+ else:
49
+ itemname = 'heap-sample-item'
50
+
51
+ first_call_time = None
52
+ sample_time = 0.0
53
+ sampling = False
54
+ try:
55
+ logfile = open(filename, 'rb')
56
+ try:
57
+ logreader = csv.reader(logfile)
58
+
59
+ print('JOB "v8"')
60
+ print('DATE "%s"' % time.asctime(time.localtime()))
61
+ print('SAMPLE_UNIT "seconds"')
62
+ print('VALUE_UNIT "bytes"')
63
+
64
+ for row in logreader:
65
+ if row[0] == 'heap-sample-begin' and row[1] == 'Heap':
66
+ sample_time = float(row[3])/1000.0
67
+ if first_call_time == None:
68
+ first_call_time = sample_time
69
+ sample_time -= first_call_time
70
+ print('BEGIN_SAMPLE %.2f' % sample_time)
71
+ sampling = True
72
+ elif row[0] == 'heap-sample-end' and row[1] == 'Heap':
73
+ print('END_SAMPLE %.2f' % sample_time)
74
+ sampling = False
75
+ elif row[0] == itemname and sampling:
76
+ print(row[1]),
77
+ if options.count:
78
+ print('%d' % (int(row[2]))),
79
+ if options.size:
80
+ print('%d' % (int(row[3]))),
81
+ print
82
+ finally:
83
+ logfile.close()
84
+ except:
85
+ sys.exit('can\'t open %s' % filename)
86
+
87
+
88
+ def BuildOptions():
89
+ result = optparse.OptionParser()
90
+ result.add_option("--js_cons_profile", help="Constructor profile",
91
+ default=False, action="store_true")
92
+ result.add_option("--size", help="Report object size",
93
+ default=False, action="store_true")
94
+ result.add_option("--count", help="Report object count",
95
+ default=False, action="store_true")
96
+ return result
97
+
98
+
99
+ def ProcessOptions(options):
100
+ if not options.size and not options.count:
101
+ options.size = True
102
+ return True
103
+
104
+
105
+ def Main():
106
+ parser = BuildOptions()
107
+ (options, args) = parser.parse_args()
108
+ if not ProcessOptions(options):
109
+ parser.print_help()
110
+ sys.exit();
111
+
112
+ if not args:
113
+ print "Missing logfile"
114
+ sys.exit();
115
+
116
+ ProcessLogFile(args[0], options)
117
+
118
+
119
+ if __name__ == '__main__':
120
+ sys.exit(Main())
@@ -0,0 +1,751 @@
1
+ // Copyright 2009 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
+
29
+ /**
30
+ * Creates a profile object for processing profiling-related events
31
+ * and calculating function execution times.
32
+ *
33
+ * @constructor
34
+ */
35
+ function Profile() {
36
+ this.codeMap_ = new CodeMap();
37
+ this.topDownTree_ = new CallTree();
38
+ this.bottomUpTree_ = new CallTree();
39
+ };
40
+
41
+
42
+ /**
43
+ * Returns whether a function with the specified name must be skipped.
44
+ * Should be overriden by subclasses.
45
+ *
46
+ * @param {string} name Function name.
47
+ */
48
+ Profile.prototype.skipThisFunction = function(name) {
49
+ return false;
50
+ };
51
+
52
+
53
+ /**
54
+ * Enum for profiler operations that involve looking up existing
55
+ * code entries.
56
+ *
57
+ * @enum {number}
58
+ */
59
+ Profile.Operation = {
60
+ MOVE: 0,
61
+ DELETE: 1,
62
+ TICK: 2
63
+ };
64
+
65
+
66
+ /**
67
+ * Enum for code state regarding its dynamic optimization.
68
+ *
69
+ * @enum {number}
70
+ */
71
+ Profile.CodeState = {
72
+ COMPILED: 0,
73
+ OPTIMIZABLE: 1,
74
+ OPTIMIZED: 2
75
+ };
76
+
77
+
78
+ /**
79
+ * Called whenever the specified operation has failed finding a function
80
+ * containing the specified address. Should be overriden by subclasses.
81
+ * See the Profile.Operation enum for the list of
82
+ * possible operations.
83
+ *
84
+ * @param {number} operation Operation.
85
+ * @param {number} addr Address of the unknown code.
86
+ * @param {number} opt_stackPos If an unknown address is encountered
87
+ * during stack strace processing, specifies a position of the frame
88
+ * containing the address.
89
+ */
90
+ Profile.prototype.handleUnknownCode = function(
91
+ operation, addr, opt_stackPos) {
92
+ };
93
+
94
+
95
+ /**
96
+ * Registers a library.
97
+ *
98
+ * @param {string} name Code entry name.
99
+ * @param {number} startAddr Starting address.
100
+ * @param {number} endAddr Ending address.
101
+ */
102
+ Profile.prototype.addLibrary = function(
103
+ name, startAddr, endAddr) {
104
+ var entry = new CodeMap.CodeEntry(
105
+ endAddr - startAddr, name);
106
+ this.codeMap_.addLibrary(startAddr, entry);
107
+ return entry;
108
+ };
109
+
110
+
111
+ /**
112
+ * Registers statically compiled code entry.
113
+ *
114
+ * @param {string} name Code entry name.
115
+ * @param {number} startAddr Starting address.
116
+ * @param {number} endAddr Ending address.
117
+ */
118
+ Profile.prototype.addStaticCode = function(
119
+ name, startAddr, endAddr) {
120
+ var entry = new CodeMap.CodeEntry(
121
+ endAddr - startAddr, name);
122
+ this.codeMap_.addStaticCode(startAddr, entry);
123
+ return entry;
124
+ };
125
+
126
+
127
+ /**
128
+ * Registers dynamic (JIT-compiled) code entry.
129
+ *
130
+ * @param {string} type Code entry type.
131
+ * @param {string} name Code entry name.
132
+ * @param {number} start Starting address.
133
+ * @param {number} size Code entry size.
134
+ */
135
+ Profile.prototype.addCode = function(
136
+ type, name, start, size) {
137
+ var entry = new Profile.DynamicCodeEntry(size, type, name);
138
+ this.codeMap_.addCode(start, entry);
139
+ return entry;
140
+ };
141
+
142
+
143
+ /**
144
+ * Registers dynamic (JIT-compiled) code entry.
145
+ *
146
+ * @param {string} type Code entry type.
147
+ * @param {string} name Code entry name.
148
+ * @param {number} start Starting address.
149
+ * @param {number} size Code entry size.
150
+ * @param {number} funcAddr Shared function object address.
151
+ * @param {Profile.CodeState} state Optimization state.
152
+ */
153
+ Profile.prototype.addFuncCode = function(
154
+ type, name, start, size, funcAddr, state) {
155
+ // As code and functions are in the same address space,
156
+ // it is safe to put them in a single code map.
157
+ var func = this.codeMap_.findDynamicEntryByStartAddress(funcAddr);
158
+ if (!func) {
159
+ func = new Profile.FunctionEntry(name);
160
+ this.codeMap_.addCode(funcAddr, func);
161
+ } else if (func.name !== name) {
162
+ // Function object has been overwritten with a new one.
163
+ func.name = name;
164
+ }
165
+ var entry = new Profile.DynamicFuncCodeEntry(size, type, func, state);
166
+ this.codeMap_.addCode(start, entry);
167
+ return entry;
168
+ };
169
+
170
+
171
+ /**
172
+ * Reports about moving of a dynamic code entry.
173
+ *
174
+ * @param {number} from Current code entry address.
175
+ * @param {number} to New code entry address.
176
+ */
177
+ Profile.prototype.moveCode = function(from, to) {
178
+ try {
179
+ this.codeMap_.moveCode(from, to);
180
+ } catch (e) {
181
+ this.handleUnknownCode(Profile.Operation.MOVE, from);
182
+ }
183
+ };
184
+
185
+
186
+ /**
187
+ * Reports about deletion of a dynamic code entry.
188
+ *
189
+ * @param {number} start Starting address.
190
+ */
191
+ Profile.prototype.deleteCode = function(start) {
192
+ try {
193
+ this.codeMap_.deleteCode(start);
194
+ } catch (e) {
195
+ this.handleUnknownCode(Profile.Operation.DELETE, start);
196
+ }
197
+ };
198
+
199
+
200
+ /**
201
+ * Reports about moving of a dynamic code entry.
202
+ *
203
+ * @param {number} from Current code entry address.
204
+ * @param {number} to New code entry address.
205
+ */
206
+ Profile.prototype.moveFunc = function(from, to) {
207
+ if (this.codeMap_.findDynamicEntryByStartAddress(from)) {
208
+ this.codeMap_.moveCode(from, to);
209
+ }
210
+ };
211
+
212
+
213
+ /**
214
+ * Retrieves a code entry by an address.
215
+ *
216
+ * @param {number} addr Entry address.
217
+ */
218
+ Profile.prototype.findEntry = function(addr) {
219
+ return this.codeMap_.findEntry(addr);
220
+ };
221
+
222
+
223
+ /**
224
+ * Records a tick event. Stack must contain a sequence of
225
+ * addresses starting with the program counter value.
226
+ *
227
+ * @param {Array<number>} stack Stack sample.
228
+ */
229
+ Profile.prototype.recordTick = function(stack) {
230
+ var processedStack = this.resolveAndFilterFuncs_(stack);
231
+ this.bottomUpTree_.addPath(processedStack);
232
+ processedStack.reverse();
233
+ this.topDownTree_.addPath(processedStack);
234
+ };
235
+
236
+
237
+ /**
238
+ * Translates addresses into function names and filters unneeded
239
+ * functions.
240
+ *
241
+ * @param {Array<number>} stack Stack sample.
242
+ */
243
+ Profile.prototype.resolveAndFilterFuncs_ = function(stack) {
244
+ var result = [];
245
+ for (var i = 0; i < stack.length; ++i) {
246
+ var entry = this.codeMap_.findEntry(stack[i]);
247
+ if (entry) {
248
+ var name = entry.getName();
249
+ if (!this.skipThisFunction(name)) {
250
+ result.push(name);
251
+ }
252
+ } else {
253
+ this.handleUnknownCode(
254
+ Profile.Operation.TICK, stack[i], i);
255
+ }
256
+ }
257
+ return result;
258
+ };
259
+
260
+
261
+ /**
262
+ * Performs a BF traversal of the top down call graph.
263
+ *
264
+ * @param {function(CallTree.Node)} f Visitor function.
265
+ */
266
+ Profile.prototype.traverseTopDownTree = function(f) {
267
+ this.topDownTree_.traverse(f);
268
+ };
269
+
270
+
271
+ /**
272
+ * Performs a BF traversal of the bottom up call graph.
273
+ *
274
+ * @param {function(CallTree.Node)} f Visitor function.
275
+ */
276
+ Profile.prototype.traverseBottomUpTree = function(f) {
277
+ this.bottomUpTree_.traverse(f);
278
+ };
279
+
280
+
281
+ /**
282
+ * Calculates a top down profile for a node with the specified label.
283
+ * If no name specified, returns the whole top down calls tree.
284
+ *
285
+ * @param {string} opt_label Node label.
286
+ */
287
+ Profile.prototype.getTopDownProfile = function(opt_label) {
288
+ return this.getTreeProfile_(this.topDownTree_, opt_label);
289
+ };
290
+
291
+
292
+ /**
293
+ * Calculates a bottom up profile for a node with the specified label.
294
+ * If no name specified, returns the whole bottom up calls tree.
295
+ *
296
+ * @param {string} opt_label Node label.
297
+ */
298
+ Profile.prototype.getBottomUpProfile = function(opt_label) {
299
+ return this.getTreeProfile_(this.bottomUpTree_, opt_label);
300
+ };
301
+
302
+
303
+ /**
304
+ * Helper function for calculating a tree profile.
305
+ *
306
+ * @param {Profile.CallTree} tree Call tree.
307
+ * @param {string} opt_label Node label.
308
+ */
309
+ Profile.prototype.getTreeProfile_ = function(tree, opt_label) {
310
+ if (!opt_label) {
311
+ tree.computeTotalWeights();
312
+ return tree;
313
+ } else {
314
+ var subTree = tree.cloneSubtree(opt_label);
315
+ subTree.computeTotalWeights();
316
+ return subTree;
317
+ }
318
+ };
319
+
320
+
321
+ /**
322
+ * Calculates a flat profile of callees starting from a node with
323
+ * the specified label. If no name specified, starts from the root.
324
+ *
325
+ * @param {string} opt_label Starting node label.
326
+ */
327
+ Profile.prototype.getFlatProfile = function(opt_label) {
328
+ var counters = new CallTree();
329
+ var rootLabel = opt_label || CallTree.ROOT_NODE_LABEL;
330
+ var precs = {};
331
+ precs[rootLabel] = 0;
332
+ var root = counters.findOrAddChild(rootLabel);
333
+
334
+ this.topDownTree_.computeTotalWeights();
335
+ this.topDownTree_.traverseInDepth(
336
+ function onEnter(node) {
337
+ if (!(node.label in precs)) {
338
+ precs[node.label] = 0;
339
+ }
340
+ var nodeLabelIsRootLabel = node.label == rootLabel;
341
+ if (nodeLabelIsRootLabel || precs[rootLabel] > 0) {
342
+ if (precs[rootLabel] == 0) {
343
+ root.selfWeight += node.selfWeight;
344
+ root.totalWeight += node.totalWeight;
345
+ } else {
346
+ var rec = root.findOrAddChild(node.label);
347
+ rec.selfWeight += node.selfWeight;
348
+ if (nodeLabelIsRootLabel || precs[node.label] == 0) {
349
+ rec.totalWeight += node.totalWeight;
350
+ }
351
+ }
352
+ precs[node.label]++;
353
+ }
354
+ },
355
+ function onExit(node) {
356
+ if (node.label == rootLabel || precs[rootLabel] > 0) {
357
+ precs[node.label]--;
358
+ }
359
+ },
360
+ null);
361
+
362
+ if (!opt_label) {
363
+ // If we have created a flat profile for the whole program, we don't
364
+ // need an explicit root in it. Thus, replace the counters tree
365
+ // root with the node corresponding to the whole program.
366
+ counters.root_ = root;
367
+ } else {
368
+ // Propagate weights so percents can be calculated correctly.
369
+ counters.getRoot().selfWeight = root.selfWeight;
370
+ counters.getRoot().totalWeight = root.totalWeight;
371
+ }
372
+ return counters;
373
+ };
374
+
375
+
376
+ /**
377
+ * Creates a dynamic code entry.
378
+ *
379
+ * @param {number} size Code size.
380
+ * @param {string} type Code type.
381
+ * @param {string} name Function name.
382
+ * @constructor
383
+ */
384
+ Profile.DynamicCodeEntry = function(size, type, name) {
385
+ CodeMap.CodeEntry.call(this, size, name);
386
+ this.type = type;
387
+ };
388
+
389
+
390
+ /**
391
+ * Returns node name.
392
+ */
393
+ Profile.DynamicCodeEntry.prototype.getName = function() {
394
+ return this.type + ': ' + this.name;
395
+ };
396
+
397
+
398
+ /**
399
+ * Returns raw node name (without type decoration).
400
+ */
401
+ Profile.DynamicCodeEntry.prototype.getRawName = function() {
402
+ return this.name;
403
+ };
404
+
405
+
406
+ Profile.DynamicCodeEntry.prototype.isJSFunction = function() {
407
+ return false;
408
+ };
409
+
410
+
411
+ /**
412
+ * Creates a dynamic code entry.
413
+ *
414
+ * @param {number} size Code size.
415
+ * @param {string} type Code type.
416
+ * @param {Profile.FunctionEntry} func Shared function entry.
417
+ * @param {Profile.CodeState} state Code optimization state.
418
+ * @constructor
419
+ */
420
+ Profile.DynamicFuncCodeEntry = function(size, type, func, state) {
421
+ CodeMap.CodeEntry.call(this, size);
422
+ this.type = type;
423
+ this.func = func;
424
+ this.state = state;
425
+ };
426
+
427
+ Profile.DynamicFuncCodeEntry.STATE_PREFIX = ["", "~", "*"];
428
+
429
+ /**
430
+ * Returns node name.
431
+ */
432
+ Profile.DynamicFuncCodeEntry.prototype.getName = function() {
433
+ var name = this.func.getName();
434
+ return this.type + ': ' + Profile.DynamicFuncCodeEntry.STATE_PREFIX[this.state] + name;
435
+ };
436
+
437
+
438
+ /**
439
+ * Returns raw node name (without type decoration).
440
+ */
441
+ Profile.DynamicFuncCodeEntry.prototype.getRawName = function() {
442
+ return this.func.getName();
443
+ };
444
+
445
+
446
+ Profile.DynamicFuncCodeEntry.prototype.isJSFunction = function() {
447
+ return true;
448
+ };
449
+
450
+
451
+ /**
452
+ * Creates a shared function object entry.
453
+ *
454
+ * @param {string} name Function name.
455
+ * @constructor
456
+ */
457
+ Profile.FunctionEntry = function(name) {
458
+ CodeMap.CodeEntry.call(this, 0, name);
459
+ };
460
+
461
+
462
+ /**
463
+ * Returns node name.
464
+ */
465
+ Profile.FunctionEntry.prototype.getName = function() {
466
+ var name = this.name;
467
+ if (name.length == 0) {
468
+ name = '<anonymous>';
469
+ } else if (name.charAt(0) == ' ') {
470
+ // An anonymous function with location: " aaa.js:10".
471
+ name = '<anonymous>' + name;
472
+ }
473
+ return name;
474
+ };
475
+
476
+
477
+ /**
478
+ * Constructs a call graph.
479
+ *
480
+ * @constructor
481
+ */
482
+ function CallTree() {
483
+ this.root_ = new CallTree.Node(
484
+ CallTree.ROOT_NODE_LABEL);
485
+ };
486
+
487
+
488
+ /**
489
+ * The label of the root node.
490
+ */
491
+ CallTree.ROOT_NODE_LABEL = '';
492
+
493
+
494
+ /**
495
+ * @private
496
+ */
497
+ CallTree.prototype.totalsComputed_ = false;
498
+
499
+
500
+ /**
501
+ * Returns the tree root.
502
+ */
503
+ CallTree.prototype.getRoot = function() {
504
+ return this.root_;
505
+ };
506
+
507
+
508
+ /**
509
+ * Adds the specified call path, constructing nodes as necessary.
510
+ *
511
+ * @param {Array<string>} path Call path.
512
+ */
513
+ CallTree.prototype.addPath = function(path) {
514
+ if (path.length == 0) {
515
+ return;
516
+ }
517
+ var curr = this.root_;
518
+ for (var i = 0; i < path.length; ++i) {
519
+ curr = curr.findOrAddChild(path[i]);
520
+ }
521
+ curr.selfWeight++;
522
+ this.totalsComputed_ = false;
523
+ };
524
+
525
+
526
+ /**
527
+ * Finds an immediate child of the specified parent with the specified
528
+ * label, creates a child node if necessary. If a parent node isn't
529
+ * specified, uses tree root.
530
+ *
531
+ * @param {string} label Child node label.
532
+ */
533
+ CallTree.prototype.findOrAddChild = function(label) {
534
+ return this.root_.findOrAddChild(label);
535
+ };
536
+
537
+
538
+ /**
539
+ * Creates a subtree by cloning and merging all subtrees rooted at nodes
540
+ * with a given label. E.g. cloning the following call tree on label 'A'
541
+ * will give the following result:
542
+ *
543
+ * <A>--<B> <B>
544
+ * / /
545
+ * <root> == clone on 'A' ==> <root>--<A>
546
+ * \ \
547
+ * <C>--<A>--<D> <D>
548
+ *
549
+ * And <A>'s selfWeight will be the sum of selfWeights of <A>'s from the
550
+ * source call tree.
551
+ *
552
+ * @param {string} label The label of the new root node.
553
+ */
554
+ CallTree.prototype.cloneSubtree = function(label) {
555
+ var subTree = new CallTree();
556
+ this.traverse(function(node, parent) {
557
+ if (!parent && node.label != label) {
558
+ return null;
559
+ }
560
+ var child = (parent ? parent : subTree).findOrAddChild(node.label);
561
+ child.selfWeight += node.selfWeight;
562
+ return child;
563
+ });
564
+ return subTree;
565
+ };
566
+
567
+
568
+ /**
569
+ * Computes total weights in the call graph.
570
+ */
571
+ CallTree.prototype.computeTotalWeights = function() {
572
+ if (this.totalsComputed_) {
573
+ return;
574
+ }
575
+ this.root_.computeTotalWeight();
576
+ this.totalsComputed_ = true;
577
+ };
578
+
579
+
580
+ /**
581
+ * Traverses the call graph in preorder. This function can be used for
582
+ * building optionally modified tree clones. This is the boilerplate code
583
+ * for this scenario:
584
+ *
585
+ * callTree.traverse(function(node, parentClone) {
586
+ * var nodeClone = cloneNode(node);
587
+ * if (parentClone)
588
+ * parentClone.addChild(nodeClone);
589
+ * return nodeClone;
590
+ * });
591
+ *
592
+ * @param {function(CallTree.Node, *)} f Visitor function.
593
+ * The second parameter is the result of calling 'f' on the parent node.
594
+ */
595
+ CallTree.prototype.traverse = function(f) {
596
+ var pairsToProcess = new ConsArray();
597
+ pairsToProcess.concat([{node: this.root_, param: null}]);
598
+ while (!pairsToProcess.atEnd()) {
599
+ var pair = pairsToProcess.next();
600
+ var node = pair.node;
601
+ var newParam = f(node, pair.param);
602
+ var morePairsToProcess = [];
603
+ node.forEachChild(function (child) {
604
+ morePairsToProcess.push({node: child, param: newParam}); });
605
+ pairsToProcess.concat(morePairsToProcess);
606
+ }
607
+ };
608
+
609
+
610
+ /**
611
+ * Performs an indepth call graph traversal.
612
+ *
613
+ * @param {function(CallTree.Node)} enter A function called
614
+ * prior to visiting node's children.
615
+ * @param {function(CallTree.Node)} exit A function called
616
+ * after visiting node's children.
617
+ */
618
+ CallTree.prototype.traverseInDepth = function(enter, exit) {
619
+ function traverse(node) {
620
+ enter(node);
621
+ node.forEachChild(traverse);
622
+ exit(node);
623
+ }
624
+ traverse(this.root_);
625
+ };
626
+
627
+
628
+ /**
629
+ * Constructs a call graph node.
630
+ *
631
+ * @param {string} label Node label.
632
+ * @param {CallTree.Node} opt_parent Node parent.
633
+ */
634
+ CallTree.Node = function(label, opt_parent) {
635
+ this.label = label;
636
+ this.parent = opt_parent;
637
+ this.children = {};
638
+ };
639
+
640
+
641
+ /**
642
+ * Node self weight (how many times this node was the last node in
643
+ * a call path).
644
+ * @type {number}
645
+ */
646
+ CallTree.Node.prototype.selfWeight = 0;
647
+
648
+
649
+ /**
650
+ * Node total weight (includes weights of all children).
651
+ * @type {number}
652
+ */
653
+ CallTree.Node.prototype.totalWeight = 0;
654
+
655
+
656
+ /**
657
+ * Adds a child node.
658
+ *
659
+ * @param {string} label Child node label.
660
+ */
661
+ CallTree.Node.prototype.addChild = function(label) {
662
+ var child = new CallTree.Node(label, this);
663
+ this.children[label] = child;
664
+ return child;
665
+ };
666
+
667
+
668
+ /**
669
+ * Computes node's total weight.
670
+ */
671
+ CallTree.Node.prototype.computeTotalWeight =
672
+ function() {
673
+ var totalWeight = this.selfWeight;
674
+ this.forEachChild(function(child) {
675
+ totalWeight += child.computeTotalWeight(); });
676
+ return this.totalWeight = totalWeight;
677
+ };
678
+
679
+
680
+ /**
681
+ * Returns all node's children as an array.
682
+ */
683
+ CallTree.Node.prototype.exportChildren = function() {
684
+ var result = [];
685
+ this.forEachChild(function (node) { result.push(node); });
686
+ return result;
687
+ };
688
+
689
+
690
+ /**
691
+ * Finds an immediate child with the specified label.
692
+ *
693
+ * @param {string} label Child node label.
694
+ */
695
+ CallTree.Node.prototype.findChild = function(label) {
696
+ return this.children[label] || null;
697
+ };
698
+
699
+
700
+ /**
701
+ * Finds an immediate child with the specified label, creates a child
702
+ * node if necessary.
703
+ *
704
+ * @param {string} label Child node label.
705
+ */
706
+ CallTree.Node.prototype.findOrAddChild = function(label) {
707
+ return this.findChild(label) || this.addChild(label);
708
+ };
709
+
710
+
711
+ /**
712
+ * Calls the specified function for every child.
713
+ *
714
+ * @param {function(CallTree.Node)} f Visitor function.
715
+ */
716
+ CallTree.Node.prototype.forEachChild = function(f) {
717
+ for (var c in this.children) {
718
+ f(this.children[c]);
719
+ }
720
+ };
721
+
722
+
723
+ /**
724
+ * Walks up from the current node up to the call tree root.
725
+ *
726
+ * @param {function(CallTree.Node)} f Visitor function.
727
+ */
728
+ CallTree.Node.prototype.walkUpToRoot = function(f) {
729
+ for (var curr = this; curr != null; curr = curr.parent) {
730
+ f(curr);
731
+ }
732
+ };
733
+
734
+
735
+ /**
736
+ * Tries to find a node with the specified path.
737
+ *
738
+ * @param {Array<string>} labels The path.
739
+ * @param {function(CallTree.Node)} opt_f Visitor function.
740
+ */
741
+ CallTree.Node.prototype.descendToChild = function(
742
+ labels, opt_f) {
743
+ for (var pos = 0, curr = this; pos < labels.length && curr != null; pos++) {
744
+ var child = curr.findChild(labels[pos]);
745
+ if (opt_f) {
746
+ opt_f(child, pos);
747
+ }
748
+ curr = child;
749
+ }
750
+ return curr;
751
+ };