libv8 3.3.10.2

Sign up to get free protection for your applications and to get access to all the features.
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,62 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef V8_PLATFORM_TLS_MAC_H_
29
+ #define V8_PLATFORM_TLS_MAC_H_
30
+
31
+ #include "globals.h"
32
+
33
+ namespace v8 {
34
+ namespace internal {
35
+
36
+ #if defined(V8_HOST_ARCH_IA32) || defined(V8_HOST_ARCH_X64)
37
+
38
+ #define V8_FAST_TLS_SUPPORTED 1
39
+
40
+ extern intptr_t kMacTlsBaseOffset;
41
+
42
+ INLINE(intptr_t InternalGetExistingThreadLocal(intptr_t index));
43
+
44
+ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) {
45
+ intptr_t result;
46
+ #if defined(V8_HOST_ARCH_IA32)
47
+ asm("movl %%gs:(%1,%2,4), %0;"
48
+ :"=r"(result) // Output must be a writable register.
49
+ :"r"(kMacTlsBaseOffset), "r"(index));
50
+ #else
51
+ asm("movq %%gs:(%1,%2,8), %0;"
52
+ :"=r"(result)
53
+ :"r"(kMacTlsBaseOffset), "r"(index));
54
+ #endif
55
+ return result;
56
+ }
57
+
58
+ #endif
59
+
60
+ } } // namespace v8::internal
61
+
62
+ #endif // V8_PLATFORM_TLS_MAC_H_
@@ -0,0 +1,62 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #ifndef V8_PLATFORM_TLS_WIN32_H_
29
+ #define V8_PLATFORM_TLS_WIN32_H_
30
+
31
+ #include "checks.h"
32
+ #include "globals.h"
33
+ #include "win32-headers.h"
34
+
35
+ namespace v8 {
36
+ namespace internal {
37
+
38
+ #if defined(_WIN32) && !defined(_WIN64)
39
+
40
+ #define V8_FAST_TLS_SUPPORTED 1
41
+
42
+ inline intptr_t InternalGetExistingThreadLocal(intptr_t index) {
43
+ const intptr_t kTibInlineTlsOffset = 0xE10;
44
+ const intptr_t kTibExtraTlsOffset = 0xF94;
45
+ const intptr_t kMaxInlineSlots = 64;
46
+ const intptr_t kMaxSlots = kMaxInlineSlots + 1024;
47
+ ASSERT(0 <= index && index < kMaxSlots);
48
+ if (index < kMaxInlineSlots) {
49
+ return static_cast<intptr_t>(__readfsdword(kTibInlineTlsOffset +
50
+ kPointerSize * index));
51
+ }
52
+ intptr_t extra = static_cast<intptr_t>(__readfsdword(kTibExtraTlsOffset));
53
+ ASSERT(extra != 0);
54
+ return *reinterpret_cast<intptr_t*>(extra +
55
+ kPointerSize * (index - kMaxInlineSlots));
56
+ }
57
+
58
+ #endif
59
+
60
+ } } // namespace v8::internal
61
+
62
+ #endif // V8_PLATFORM_TLS_WIN32_H_
@@ -0,0 +1,50 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ // Platform and architecture specific thread local store functions.
29
+
30
+ #ifndef V8_PLATFORM_TLS_H_
31
+ #define V8_PLATFORM_TLS_H_
32
+
33
+ #ifdef V8_FAST_TLS
34
+
35
+ // When fast TLS is requested we include the appropriate
36
+ // implementation header.
37
+ //
38
+ // The implementation header defines V8_FAST_TLS_SUPPORTED if it
39
+ // provides fast TLS support for the current platform and architecture
40
+ // combination.
41
+
42
+ #if defined(_MSC_VER) && (defined(_WIN32) || defined(_WIN64))
43
+ #include "platform-tls-win32.h"
44
+ #elif defined(__APPLE__)
45
+ #include "platform-tls-mac.h"
46
+ #endif
47
+
48
+ #endif
49
+
50
+ #endif // V8_PLATFORM_TLS_H_
@@ -0,0 +1,2021 @@
1
+ // Copyright 2006-2008 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ // Platform specific code for Win32.
29
+
30
+ #define V8_WIN32_HEADERS_FULL
31
+ #include "win32-headers.h"
32
+
33
+ #include "v8.h"
34
+
35
+ #include "platform.h"
36
+ #include "vm-state-inl.h"
37
+
38
+ // Extra POSIX/ANSI routines for Win32 when when using Visual Studio C++. Please
39
+ // refer to The Open Group Base Specification for specification of the correct
40
+ // semantics for these functions.
41
+ // (http://www.opengroup.org/onlinepubs/000095399/)
42
+ #ifdef _MSC_VER
43
+
44
+ namespace v8 {
45
+ namespace internal {
46
+
47
+ // Test for finite value - usually defined in math.h
48
+ int isfinite(double x) {
49
+ return _finite(x);
50
+ }
51
+
52
+ } // namespace v8
53
+ } // namespace internal
54
+
55
+ // Test for a NaN (not a number) value - usually defined in math.h
56
+ int isnan(double x) {
57
+ return _isnan(x);
58
+ }
59
+
60
+
61
+ // Test for infinity - usually defined in math.h
62
+ int isinf(double x) {
63
+ return (_fpclass(x) & (_FPCLASS_PINF | _FPCLASS_NINF)) != 0;
64
+ }
65
+
66
+
67
+ // Test if x is less than y and both nominal - usually defined in math.h
68
+ int isless(double x, double y) {
69
+ return isnan(x) || isnan(y) ? 0 : x < y;
70
+ }
71
+
72
+
73
+ // Test if x is greater than y and both nominal - usually defined in math.h
74
+ int isgreater(double x, double y) {
75
+ return isnan(x) || isnan(y) ? 0 : x > y;
76
+ }
77
+
78
+
79
+ // Classify floating point number - usually defined in math.h
80
+ int fpclassify(double x) {
81
+ // Use the MS-specific _fpclass() for classification.
82
+ int flags = _fpclass(x);
83
+
84
+ // Determine class. We cannot use a switch statement because
85
+ // the _FPCLASS_ constants are defined as flags.
86
+ if (flags & (_FPCLASS_PN | _FPCLASS_NN)) return FP_NORMAL;
87
+ if (flags & (_FPCLASS_PZ | _FPCLASS_NZ)) return FP_ZERO;
88
+ if (flags & (_FPCLASS_PD | _FPCLASS_ND)) return FP_SUBNORMAL;
89
+ if (flags & (_FPCLASS_PINF | _FPCLASS_NINF)) return FP_INFINITE;
90
+
91
+ // All cases should be covered by the code above.
92
+ ASSERT(flags & (_FPCLASS_SNAN | _FPCLASS_QNAN));
93
+ return FP_NAN;
94
+ }
95
+
96
+
97
+ // Test sign - usually defined in math.h
98
+ int signbit(double x) {
99
+ // We need to take care of the special case of both positive
100
+ // and negative versions of zero.
101
+ if (x == 0)
102
+ return _fpclass(x) & _FPCLASS_NZ;
103
+ else
104
+ return x < 0;
105
+ }
106
+
107
+
108
+ // Case-insensitive bounded string comparisons. Use stricmp() on Win32. Usually
109
+ // defined in strings.h.
110
+ int strncasecmp(const char* s1, const char* s2, int n) {
111
+ return _strnicmp(s1, s2, n);
112
+ }
113
+
114
+ #endif // _MSC_VER
115
+
116
+
117
+ // Extra functions for MinGW. Most of these are the _s functions which are in
118
+ // the Microsoft Visual Studio C++ CRT.
119
+ #ifdef __MINGW32__
120
+
121
+ int localtime_s(tm* out_tm, const time_t* time) {
122
+ tm* posix_local_time_struct = localtime(time);
123
+ if (posix_local_time_struct == NULL) return 1;
124
+ *out_tm = *posix_local_time_struct;
125
+ return 0;
126
+ }
127
+
128
+
129
+ // Not sure this the correct interpretation of _mkgmtime
130
+ time_t _mkgmtime(tm* timeptr) {
131
+ return mktime(timeptr);
132
+ }
133
+
134
+
135
+ int fopen_s(FILE** pFile, const char* filename, const char* mode) {
136
+ *pFile = fopen(filename, mode);
137
+ return *pFile != NULL ? 0 : 1;
138
+ }
139
+
140
+
141
+ int _vsnprintf_s(char* buffer, size_t sizeOfBuffer, size_t count,
142
+ const char* format, va_list argptr) {
143
+ return _vsnprintf(buffer, sizeOfBuffer, format, argptr);
144
+ }
145
+ #define _TRUNCATE 0
146
+
147
+
148
+ int strncpy_s(char* strDest, size_t numberOfElements,
149
+ const char* strSource, size_t count) {
150
+ strncpy(strDest, strSource, count);
151
+ return 0;
152
+ }
153
+
154
+
155
+ inline void MemoryBarrier() {
156
+ int barrier = 0;
157
+ __asm__ __volatile__("xchgl %%eax,%0 ":"=r" (barrier));
158
+ }
159
+
160
+ #endif // __MINGW32__
161
+
162
+ // Generate a pseudo-random number in the range 0-2^31-1. Usually
163
+ // defined in stdlib.h. Missing in both Microsoft Visual Studio C++ and MinGW.
164
+ int random() {
165
+ return rand();
166
+ }
167
+
168
+
169
+ namespace v8 {
170
+ namespace internal {
171
+
172
+ double ceiling(double x) {
173
+ return ceil(x);
174
+ }
175
+
176
+
177
+ static Mutex* limit_mutex = NULL;
178
+
179
+ #if defined(V8_TARGET_ARCH_IA32)
180
+ static OS::MemCopyFunction memcopy_function = NULL;
181
+ static Mutex* memcopy_function_mutex = OS::CreateMutex();
182
+ // Defined in codegen-ia32.cc.
183
+ OS::MemCopyFunction CreateMemCopyFunction();
184
+
185
+ // Copy memory area to disjoint memory area.
186
+ void OS::MemCopy(void* dest, const void* src, size_t size) {
187
+ if (memcopy_function == NULL) {
188
+ ScopedLock lock(memcopy_function_mutex);
189
+ if (memcopy_function == NULL) {
190
+ OS::MemCopyFunction temp = CreateMemCopyFunction();
191
+ MemoryBarrier();
192
+ memcopy_function = temp;
193
+ }
194
+ }
195
+ // Note: here we rely on dependent reads being ordered. This is true
196
+ // on all architectures we currently support.
197
+ (*memcopy_function)(dest, src, size);
198
+ #ifdef DEBUG
199
+ CHECK_EQ(0, memcmp(dest, src, size));
200
+ #endif
201
+ }
202
+ #endif // V8_TARGET_ARCH_IA32
203
+
204
+ #ifdef _WIN64
205
+ typedef double (*ModuloFunction)(double, double);
206
+ static ModuloFunction modulo_function = NULL;
207
+ static Mutex* modulo_function_mutex = OS::CreateMutex();
208
+ // Defined in codegen-x64.cc.
209
+ ModuloFunction CreateModuloFunction();
210
+
211
+ double modulo(double x, double y) {
212
+ if (modulo_function == NULL) {
213
+ ScopedLock lock(modulo_function_mutex);
214
+ if (modulo_function == NULL) {
215
+ ModuloFunction temp = CreateModuloFunction();
216
+ MemoryBarrier();
217
+ modulo_function = temp;
218
+ }
219
+ }
220
+ // Note: here we rely on dependent reads being ordered. This is true
221
+ // on all architectures we currently support.
222
+ return (*modulo_function)(x, y);
223
+ }
224
+ #else // Win32
225
+
226
+ double modulo(double x, double y) {
227
+ // Workaround MS fmod bugs. ECMA-262 says:
228
+ // dividend is finite and divisor is an infinity => result equals dividend
229
+ // dividend is a zero and divisor is nonzero finite => result equals dividend
230
+ if (!(isfinite(x) && (!isfinite(y) && !isnan(y))) &&
231
+ !(x == 0 && (y != 0 && isfinite(y)))) {
232
+ x = fmod(x, y);
233
+ }
234
+ return x;
235
+ }
236
+
237
+ #endif // _WIN64
238
+
239
+ // ----------------------------------------------------------------------------
240
+ // The Time class represents time on win32. A timestamp is represented as
241
+ // a 64-bit integer in 100 nano-seconds since January 1, 1601 (UTC). JavaScript
242
+ // timestamps are represented as a doubles in milliseconds since 00:00:00 UTC,
243
+ // January 1, 1970.
244
+
245
+ class Time {
246
+ public:
247
+ // Constructors.
248
+ Time();
249
+ explicit Time(double jstime);
250
+ Time(int year, int mon, int day, int hour, int min, int sec);
251
+
252
+ // Convert timestamp to JavaScript representation.
253
+ double ToJSTime();
254
+
255
+ // Set timestamp to current time.
256
+ void SetToCurrentTime();
257
+
258
+ // Returns the local timezone offset in milliseconds east of UTC. This is
259
+ // the number of milliseconds you must add to UTC to get local time, i.e.
260
+ // LocalOffset(CET) = 3600000 and LocalOffset(PST) = -28800000. This
261
+ // routine also takes into account whether daylight saving is effect
262
+ // at the time.
263
+ int64_t LocalOffset();
264
+
265
+ // Returns the daylight savings time offset for the time in milliseconds.
266
+ int64_t DaylightSavingsOffset();
267
+
268
+ // Returns a string identifying the current timezone for the
269
+ // timestamp taking into account daylight saving.
270
+ char* LocalTimezone();
271
+
272
+ private:
273
+ // Constants for time conversion.
274
+ static const int64_t kTimeEpoc = 116444736000000000LL;
275
+ static const int64_t kTimeScaler = 10000;
276
+ static const int64_t kMsPerMinute = 60000;
277
+
278
+ // Constants for timezone information.
279
+ static const int kTzNameSize = 128;
280
+ static const bool kShortTzNames = false;
281
+
282
+ // Timezone information. We need to have static buffers for the
283
+ // timezone names because we return pointers to these in
284
+ // LocalTimezone().
285
+ static bool tz_initialized_;
286
+ static TIME_ZONE_INFORMATION tzinfo_;
287
+ static char std_tz_name_[kTzNameSize];
288
+ static char dst_tz_name_[kTzNameSize];
289
+
290
+ // Initialize the timezone information (if not already done).
291
+ static void TzSet();
292
+
293
+ // Guess the name of the timezone from the bias.
294
+ static const char* GuessTimezoneNameFromBias(int bias);
295
+
296
+ // Return whether or not daylight savings time is in effect at this time.
297
+ bool InDST();
298
+
299
+ // Return the difference (in milliseconds) between this timestamp and
300
+ // another timestamp.
301
+ int64_t Diff(Time* other);
302
+
303
+ // Accessor for FILETIME representation.
304
+ FILETIME& ft() { return time_.ft_; }
305
+
306
+ // Accessor for integer representation.
307
+ int64_t& t() { return time_.t_; }
308
+
309
+ // Although win32 uses 64-bit integers for representing timestamps,
310
+ // these are packed into a FILETIME structure. The FILETIME structure
311
+ // is just a struct representing a 64-bit integer. The TimeStamp union
312
+ // allows access to both a FILETIME and an integer representation of
313
+ // the timestamp.
314
+ union TimeStamp {
315
+ FILETIME ft_;
316
+ int64_t t_;
317
+ };
318
+
319
+ TimeStamp time_;
320
+ };
321
+
322
+ // Static variables.
323
+ bool Time::tz_initialized_ = false;
324
+ TIME_ZONE_INFORMATION Time::tzinfo_;
325
+ char Time::std_tz_name_[kTzNameSize];
326
+ char Time::dst_tz_name_[kTzNameSize];
327
+
328
+
329
+ // Initialize timestamp to start of epoc.
330
+ Time::Time() {
331
+ t() = 0;
332
+ }
333
+
334
+
335
+ // Initialize timestamp from a JavaScript timestamp.
336
+ Time::Time(double jstime) {
337
+ t() = static_cast<int64_t>(jstime) * kTimeScaler + kTimeEpoc;
338
+ }
339
+
340
+
341
+ // Initialize timestamp from date/time components.
342
+ Time::Time(int year, int mon, int day, int hour, int min, int sec) {
343
+ SYSTEMTIME st;
344
+ st.wYear = year;
345
+ st.wMonth = mon;
346
+ st.wDay = day;
347
+ st.wHour = hour;
348
+ st.wMinute = min;
349
+ st.wSecond = sec;
350
+ st.wMilliseconds = 0;
351
+ SystemTimeToFileTime(&st, &ft());
352
+ }
353
+
354
+
355
+ // Convert timestamp to JavaScript timestamp.
356
+ double Time::ToJSTime() {
357
+ return static_cast<double>((t() - kTimeEpoc) / kTimeScaler);
358
+ }
359
+
360
+
361
+ // Guess the name of the timezone from the bias.
362
+ // The guess is very biased towards the northern hemisphere.
363
+ const char* Time::GuessTimezoneNameFromBias(int bias) {
364
+ static const int kHour = 60;
365
+ switch (-bias) {
366
+ case -9*kHour: return "Alaska";
367
+ case -8*kHour: return "Pacific";
368
+ case -7*kHour: return "Mountain";
369
+ case -6*kHour: return "Central";
370
+ case -5*kHour: return "Eastern";
371
+ case -4*kHour: return "Atlantic";
372
+ case 0*kHour: return "GMT";
373
+ case +1*kHour: return "Central Europe";
374
+ case +2*kHour: return "Eastern Europe";
375
+ case +3*kHour: return "Russia";
376
+ case +5*kHour + 30: return "India";
377
+ case +8*kHour: return "China";
378
+ case +9*kHour: return "Japan";
379
+ case +12*kHour: return "New Zealand";
380
+ default: return "Local";
381
+ }
382
+ }
383
+
384
+
385
+ // Initialize timezone information. The timezone information is obtained from
386
+ // windows. If we cannot get the timezone information we fall back to CET.
387
+ // Please notice that this code is not thread-safe.
388
+ void Time::TzSet() {
389
+ // Just return if timezone information has already been initialized.
390
+ if (tz_initialized_) return;
391
+
392
+ // Initialize POSIX time zone data.
393
+ _tzset();
394
+ // Obtain timezone information from operating system.
395
+ memset(&tzinfo_, 0, sizeof(tzinfo_));
396
+ if (GetTimeZoneInformation(&tzinfo_) == TIME_ZONE_ID_INVALID) {
397
+ // If we cannot get timezone information we fall back to CET.
398
+ tzinfo_.Bias = -60;
399
+ tzinfo_.StandardDate.wMonth = 10;
400
+ tzinfo_.StandardDate.wDay = 5;
401
+ tzinfo_.StandardDate.wHour = 3;
402
+ tzinfo_.StandardBias = 0;
403
+ tzinfo_.DaylightDate.wMonth = 3;
404
+ tzinfo_.DaylightDate.wDay = 5;
405
+ tzinfo_.DaylightDate.wHour = 2;
406
+ tzinfo_.DaylightBias = -60;
407
+ }
408
+
409
+ // Make standard and DST timezone names.
410
+ OS::SNPrintF(Vector<char>(std_tz_name_, kTzNameSize),
411
+ "%S",
412
+ tzinfo_.StandardName);
413
+ std_tz_name_[kTzNameSize - 1] = '\0';
414
+ OS::SNPrintF(Vector<char>(dst_tz_name_, kTzNameSize),
415
+ "%S",
416
+ tzinfo_.DaylightName);
417
+ dst_tz_name_[kTzNameSize - 1] = '\0';
418
+
419
+ // If OS returned empty string or resource id (like "@tzres.dll,-211")
420
+ // simply guess the name from the UTC bias of the timezone.
421
+ // To properly resolve the resource identifier requires a library load,
422
+ // which is not possible in a sandbox.
423
+ if (std_tz_name_[0] == '\0' || std_tz_name_[0] == '@') {
424
+ OS::SNPrintF(Vector<char>(std_tz_name_, kTzNameSize - 1),
425
+ "%s Standard Time",
426
+ GuessTimezoneNameFromBias(tzinfo_.Bias));
427
+ }
428
+ if (dst_tz_name_[0] == '\0' || dst_tz_name_[0] == '@') {
429
+ OS::SNPrintF(Vector<char>(dst_tz_name_, kTzNameSize - 1),
430
+ "%s Daylight Time",
431
+ GuessTimezoneNameFromBias(tzinfo_.Bias));
432
+ }
433
+
434
+ // Timezone information initialized.
435
+ tz_initialized_ = true;
436
+ }
437
+
438
+
439
+ // Return the difference in milliseconds between this and another timestamp.
440
+ int64_t Time::Diff(Time* other) {
441
+ return (t() - other->t()) / kTimeScaler;
442
+ }
443
+
444
+
445
+ // Set timestamp to current time.
446
+ void Time::SetToCurrentTime() {
447
+ // The default GetSystemTimeAsFileTime has a ~15.5ms resolution.
448
+ // Because we're fast, we like fast timers which have at least a
449
+ // 1ms resolution.
450
+ //
451
+ // timeGetTime() provides 1ms granularity when combined with
452
+ // timeBeginPeriod(). If the host application for v8 wants fast
453
+ // timers, it can use timeBeginPeriod to increase the resolution.
454
+ //
455
+ // Using timeGetTime() has a drawback because it is a 32bit value
456
+ // and hence rolls-over every ~49days.
457
+ //
458
+ // To use the clock, we use GetSystemTimeAsFileTime as our base;
459
+ // and then use timeGetTime to extrapolate current time from the
460
+ // start time. To deal with rollovers, we resync the clock
461
+ // any time when more than kMaxClockElapsedTime has passed or
462
+ // whenever timeGetTime creates a rollover.
463
+
464
+ static bool initialized = false;
465
+ static TimeStamp init_time;
466
+ static DWORD init_ticks;
467
+ static const int64_t kHundredNanosecondsPerSecond = 10000000;
468
+ static const int64_t kMaxClockElapsedTime =
469
+ 60*kHundredNanosecondsPerSecond; // 1 minute
470
+
471
+ // If we are uninitialized, we need to resync the clock.
472
+ bool needs_resync = !initialized;
473
+
474
+ // Get the current time.
475
+ TimeStamp time_now;
476
+ GetSystemTimeAsFileTime(&time_now.ft_);
477
+ DWORD ticks_now = timeGetTime();
478
+
479
+ // Check if we need to resync due to clock rollover.
480
+ needs_resync |= ticks_now < init_ticks;
481
+
482
+ // Check if we need to resync due to elapsed time.
483
+ needs_resync |= (time_now.t_ - init_time.t_) > kMaxClockElapsedTime;
484
+
485
+ // Resync the clock if necessary.
486
+ if (needs_resync) {
487
+ GetSystemTimeAsFileTime(&init_time.ft_);
488
+ init_ticks = ticks_now = timeGetTime();
489
+ initialized = true;
490
+ }
491
+
492
+ // Finally, compute the actual time. Why is this so hard.
493
+ DWORD elapsed = ticks_now - init_ticks;
494
+ this->time_.t_ = init_time.t_ + (static_cast<int64_t>(elapsed) * 10000);
495
+ }
496
+
497
+
498
+ // Return the local timezone offset in milliseconds east of UTC. This
499
+ // takes into account whether daylight saving is in effect at the time.
500
+ // Only times in the 32-bit Unix range may be passed to this function.
501
+ // Also, adding the time-zone offset to the input must not overflow.
502
+ // The function EquivalentTime() in date.js guarantees this.
503
+ int64_t Time::LocalOffset() {
504
+ // Initialize timezone information, if needed.
505
+ TzSet();
506
+
507
+ Time rounded_to_second(*this);
508
+ rounded_to_second.t() = rounded_to_second.t() / 1000 / kTimeScaler *
509
+ 1000 * kTimeScaler;
510
+ // Convert to local time using POSIX localtime function.
511
+ // Windows XP Service Pack 3 made SystemTimeToTzSpecificLocalTime()
512
+ // very slow. Other browsers use localtime().
513
+
514
+ // Convert from JavaScript milliseconds past 1/1/1970 0:00:00 to
515
+ // POSIX seconds past 1/1/1970 0:00:00.
516
+ double unchecked_posix_time = rounded_to_second.ToJSTime() / 1000;
517
+ if (unchecked_posix_time > INT_MAX || unchecked_posix_time < 0) {
518
+ return 0;
519
+ }
520
+ // Because _USE_32BIT_TIME_T is defined, time_t is a 32-bit int.
521
+ time_t posix_time = static_cast<time_t>(unchecked_posix_time);
522
+
523
+ // Convert to local time, as struct with fields for day, hour, year, etc.
524
+ tm posix_local_time_struct;
525
+ if (localtime_s(&posix_local_time_struct, &posix_time)) return 0;
526
+ // Convert local time in struct to POSIX time as if it were a UTC time.
527
+ time_t local_posix_time = _mkgmtime(&posix_local_time_struct);
528
+ Time localtime(1000.0 * local_posix_time);
529
+
530
+ return localtime.Diff(&rounded_to_second);
531
+ }
532
+
533
+
534
+ // Return whether or not daylight savings time is in effect at this time.
535
+ bool Time::InDST() {
536
+ // Initialize timezone information, if needed.
537
+ TzSet();
538
+
539
+ // Determine if DST is in effect at the specified time.
540
+ bool in_dst = false;
541
+ if (tzinfo_.StandardDate.wMonth != 0 || tzinfo_.DaylightDate.wMonth != 0) {
542
+ // Get the local timezone offset for the timestamp in milliseconds.
543
+ int64_t offset = LocalOffset();
544
+
545
+ // Compute the offset for DST. The bias parameters in the timezone info
546
+ // are specified in minutes. These must be converted to milliseconds.
547
+ int64_t dstofs = -(tzinfo_.Bias + tzinfo_.DaylightBias) * kMsPerMinute;
548
+
549
+ // If the local time offset equals the timezone bias plus the daylight
550
+ // bias then DST is in effect.
551
+ in_dst = offset == dstofs;
552
+ }
553
+
554
+ return in_dst;
555
+ }
556
+
557
+
558
+ // Return the daylight savings time offset for this time.
559
+ int64_t Time::DaylightSavingsOffset() {
560
+ return InDST() ? 60 * kMsPerMinute : 0;
561
+ }
562
+
563
+
564
+ // Returns a string identifying the current timezone for the
565
+ // timestamp taking into account daylight saving.
566
+ char* Time::LocalTimezone() {
567
+ // Return the standard or DST time zone name based on whether daylight
568
+ // saving is in effect at the given time.
569
+ return InDST() ? dst_tz_name_ : std_tz_name_;
570
+ }
571
+
572
+
573
+ void OS::Setup() {
574
+ // Seed the random number generator.
575
+ // Convert the current time to a 64-bit integer first, before converting it
576
+ // to an unsigned. Going directly can cause an overflow and the seed to be
577
+ // set to all ones. The seed will be identical for different instances that
578
+ // call this setup code within the same millisecond.
579
+ uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
580
+ srand(static_cast<unsigned int>(seed));
581
+ limit_mutex = CreateMutex();
582
+ }
583
+
584
+
585
+ // Returns the accumulated user time for thread.
586
+ int OS::GetUserTime(uint32_t* secs, uint32_t* usecs) {
587
+ FILETIME dummy;
588
+ uint64_t usertime;
589
+
590
+ // Get the amount of time that the thread has executed in user mode.
591
+ if (!GetThreadTimes(GetCurrentThread(), &dummy, &dummy, &dummy,
592
+ reinterpret_cast<FILETIME*>(&usertime))) return -1;
593
+
594
+ // Adjust the resolution to micro-seconds.
595
+ usertime /= 10;
596
+
597
+ // Convert to seconds and microseconds
598
+ *secs = static_cast<uint32_t>(usertime / 1000000);
599
+ *usecs = static_cast<uint32_t>(usertime % 1000000);
600
+ return 0;
601
+ }
602
+
603
+
604
+ // Returns current time as the number of milliseconds since
605
+ // 00:00:00 UTC, January 1, 1970.
606
+ double OS::TimeCurrentMillis() {
607
+ Time t;
608
+ t.SetToCurrentTime();
609
+ return t.ToJSTime();
610
+ }
611
+
612
+ // Returns the tickcounter based on timeGetTime.
613
+ int64_t OS::Ticks() {
614
+ return timeGetTime() * 1000; // Convert to microseconds.
615
+ }
616
+
617
+
618
+ // Returns a string identifying the current timezone taking into
619
+ // account daylight saving.
620
+ const char* OS::LocalTimezone(double time) {
621
+ return Time(time).LocalTimezone();
622
+ }
623
+
624
+
625
+ // Returns the local time offset in milliseconds east of UTC without
626
+ // taking daylight savings time into account.
627
+ double OS::LocalTimeOffset() {
628
+ // Use current time, rounded to the millisecond.
629
+ Time t(TimeCurrentMillis());
630
+ // Time::LocalOffset inlcudes any daylight savings offset, so subtract it.
631
+ return static_cast<double>(t.LocalOffset() - t.DaylightSavingsOffset());
632
+ }
633
+
634
+
635
+ // Returns the daylight savings offset in milliseconds for the given
636
+ // time.
637
+ double OS::DaylightSavingsOffset(double time) {
638
+ int64_t offset = Time(time).DaylightSavingsOffset();
639
+ return static_cast<double>(offset);
640
+ }
641
+
642
+
643
+ int OS::GetLastError() {
644
+ return ::GetLastError();
645
+ }
646
+
647
+
648
+ // ----------------------------------------------------------------------------
649
+ // Win32 console output.
650
+ //
651
+ // If a Win32 application is linked as a console application it has a normal
652
+ // standard output and standard error. In this case normal printf works fine
653
+ // for output. However, if the application is linked as a GUI application,
654
+ // the process doesn't have a console, and therefore (debugging) output is lost.
655
+ // This is the case if we are embedded in a windows program (like a browser).
656
+ // In order to be able to get debug output in this case the the debugging
657
+ // facility using OutputDebugString. This output goes to the active debugger
658
+ // for the process (if any). Else the output can be monitored using DBMON.EXE.
659
+
660
+ enum OutputMode {
661
+ UNKNOWN, // Output method has not yet been determined.
662
+ CONSOLE, // Output is written to stdout.
663
+ ODS // Output is written to debug facility.
664
+ };
665
+
666
+ static OutputMode output_mode = UNKNOWN; // Current output mode.
667
+
668
+
669
+ // Determine if the process has a console for output.
670
+ static bool HasConsole() {
671
+ // Only check the first time. Eventual race conditions are not a problem,
672
+ // because all threads will eventually determine the same mode.
673
+ if (output_mode == UNKNOWN) {
674
+ // We cannot just check that the standard output is attached to a console
675
+ // because this would fail if output is redirected to a file. Therefore we
676
+ // say that a process does not have an output console if either the
677
+ // standard output handle is invalid or its file type is unknown.
678
+ if (GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE &&
679
+ GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) != FILE_TYPE_UNKNOWN)
680
+ output_mode = CONSOLE;
681
+ else
682
+ output_mode = ODS;
683
+ }
684
+ return output_mode == CONSOLE;
685
+ }
686
+
687
+
688
+ static void VPrintHelper(FILE* stream, const char* format, va_list args) {
689
+ if (HasConsole()) {
690
+ vfprintf(stream, format, args);
691
+ } else {
692
+ // It is important to use safe print here in order to avoid
693
+ // overflowing the buffer. We might truncate the output, but this
694
+ // does not crash.
695
+ EmbeddedVector<char, 4096> buffer;
696
+ OS::VSNPrintF(buffer, format, args);
697
+ OutputDebugStringA(buffer.start());
698
+ }
699
+ }
700
+
701
+
702
+ FILE* OS::FOpen(const char* path, const char* mode) {
703
+ FILE* result;
704
+ if (fopen_s(&result, path, mode) == 0) {
705
+ return result;
706
+ } else {
707
+ return NULL;
708
+ }
709
+ }
710
+
711
+
712
+ bool OS::Remove(const char* path) {
713
+ return (DeleteFileA(path) != 0);
714
+ }
715
+
716
+
717
+ // Open log file in binary mode to avoid /n -> /r/n conversion.
718
+ const char* const OS::LogFileOpenMode = "wb";
719
+
720
+
721
+ // Print (debug) message to console.
722
+ void OS::Print(const char* format, ...) {
723
+ va_list args;
724
+ va_start(args, format);
725
+ VPrint(format, args);
726
+ va_end(args);
727
+ }
728
+
729
+
730
+ void OS::VPrint(const char* format, va_list args) {
731
+ VPrintHelper(stdout, format, args);
732
+ }
733
+
734
+
735
+ void OS::FPrint(FILE* out, const char* format, ...) {
736
+ va_list args;
737
+ va_start(args, format);
738
+ VFPrint(out, format, args);
739
+ va_end(args);
740
+ }
741
+
742
+
743
+ void OS::VFPrint(FILE* out, const char* format, va_list args) {
744
+ VPrintHelper(out, format, args);
745
+ }
746
+
747
+
748
+ // Print error message to console.
749
+ void OS::PrintError(const char* format, ...) {
750
+ va_list args;
751
+ va_start(args, format);
752
+ VPrintError(format, args);
753
+ va_end(args);
754
+ }
755
+
756
+
757
+ void OS::VPrintError(const char* format, va_list args) {
758
+ VPrintHelper(stderr, format, args);
759
+ }
760
+
761
+
762
+ int OS::SNPrintF(Vector<char> str, const char* format, ...) {
763
+ va_list args;
764
+ va_start(args, format);
765
+ int result = VSNPrintF(str, format, args);
766
+ va_end(args);
767
+ return result;
768
+ }
769
+
770
+
771
+ int OS::VSNPrintF(Vector<char> str, const char* format, va_list args) {
772
+ int n = _vsnprintf_s(str.start(), str.length(), _TRUNCATE, format, args);
773
+ // Make sure to zero-terminate the string if the output was
774
+ // truncated or if there was an error.
775
+ if (n < 0 || n >= str.length()) {
776
+ if (str.length() > 0)
777
+ str[str.length() - 1] = '\0';
778
+ return -1;
779
+ } else {
780
+ return n;
781
+ }
782
+ }
783
+
784
+
785
+ char* OS::StrChr(char* str, int c) {
786
+ return const_cast<char*>(strchr(str, c));
787
+ }
788
+
789
+
790
+ void OS::StrNCpy(Vector<char> dest, const char* src, size_t n) {
791
+ // Use _TRUNCATE or strncpy_s crashes (by design) if buffer is too small.
792
+ size_t buffer_size = static_cast<size_t>(dest.length());
793
+ if (n + 1 > buffer_size) // count for trailing '\0'
794
+ n = _TRUNCATE;
795
+ int result = strncpy_s(dest.start(), dest.length(), src, n);
796
+ USE(result);
797
+ ASSERT(result == 0 || (n == _TRUNCATE && result == STRUNCATE));
798
+ }
799
+
800
+
801
+ // We keep the lowest and highest addresses mapped as a quick way of
802
+ // determining that pointers are outside the heap (used mostly in assertions
803
+ // and verification). The estimate is conservative, ie, not all addresses in
804
+ // 'allocated' space are actually allocated to our heap. The range is
805
+ // [lowest, highest), inclusive on the low and and exclusive on the high end.
806
+ static void* lowest_ever_allocated = reinterpret_cast<void*>(-1);
807
+ static void* highest_ever_allocated = reinterpret_cast<void*>(0);
808
+
809
+
810
+ static void UpdateAllocatedSpaceLimits(void* address, int size) {
811
+ ASSERT(limit_mutex != NULL);
812
+ ScopedLock lock(limit_mutex);
813
+
814
+ lowest_ever_allocated = Min(lowest_ever_allocated, address);
815
+ highest_ever_allocated =
816
+ Max(highest_ever_allocated,
817
+ reinterpret_cast<void*>(reinterpret_cast<char*>(address) + size));
818
+ }
819
+
820
+
821
+ bool OS::IsOutsideAllocatedSpace(void* pointer) {
822
+ if (pointer < lowest_ever_allocated || pointer >= highest_ever_allocated)
823
+ return true;
824
+ // Ask the Windows API
825
+ if (IsBadWritePtr(pointer, 1))
826
+ return true;
827
+ return false;
828
+ }
829
+
830
+
831
+ // Get the system's page size used by VirtualAlloc() or the next power
832
+ // of two. The reason for always returning a power of two is that the
833
+ // rounding up in OS::Allocate expects that.
834
+ static size_t GetPageSize() {
835
+ static size_t page_size = 0;
836
+ if (page_size == 0) {
837
+ SYSTEM_INFO info;
838
+ GetSystemInfo(&info);
839
+ page_size = RoundUpToPowerOf2(info.dwPageSize);
840
+ }
841
+ return page_size;
842
+ }
843
+
844
+
845
+ // The allocation alignment is the guaranteed alignment for
846
+ // VirtualAlloc'ed blocks of memory.
847
+ size_t OS::AllocateAlignment() {
848
+ static size_t allocate_alignment = 0;
849
+ if (allocate_alignment == 0) {
850
+ SYSTEM_INFO info;
851
+ GetSystemInfo(&info);
852
+ allocate_alignment = info.dwAllocationGranularity;
853
+ }
854
+ return allocate_alignment;
855
+ }
856
+
857
+
858
+ void* OS::Allocate(const size_t requested,
859
+ size_t* allocated,
860
+ bool is_executable) {
861
+ // The address range used to randomize RWX allocations in OS::Allocate
862
+ // Try not to map pages into the default range that windows loads DLLs
863
+ // Use a multiple of 64k to prevent committing unused memory.
864
+ // Note: This does not guarantee RWX regions will be within the
865
+ // range kAllocationRandomAddressMin to kAllocationRandomAddressMax
866
+ #ifdef V8_HOST_ARCH_64_BIT
867
+ static const intptr_t kAllocationRandomAddressMin = 0x0000000080000000;
868
+ static const intptr_t kAllocationRandomAddressMax = 0x000003FFFFFF0000;
869
+ #else
870
+ static const intptr_t kAllocationRandomAddressMin = 0x04000000;
871
+ static const intptr_t kAllocationRandomAddressMax = 0x3FFF0000;
872
+ #endif
873
+
874
+ // VirtualAlloc rounds allocated size to page size automatically.
875
+ size_t msize = RoundUp(requested, static_cast<int>(GetPageSize()));
876
+ intptr_t address = 0;
877
+
878
+ // Windows XP SP2 allows Data Excution Prevention (DEP).
879
+ int prot = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
880
+
881
+ // For exectutable pages try and randomize the allocation address
882
+ if (prot == PAGE_EXECUTE_READWRITE &&
883
+ msize >= static_cast<size_t>(Page::kPageSize)) {
884
+ address = (V8::RandomPrivate(Isolate::Current()) << kPageSizeBits)
885
+ | kAllocationRandomAddressMin;
886
+ address &= kAllocationRandomAddressMax;
887
+ }
888
+
889
+ LPVOID mbase = VirtualAlloc(reinterpret_cast<void *>(address),
890
+ msize,
891
+ MEM_COMMIT | MEM_RESERVE,
892
+ prot);
893
+ if (mbase == NULL && address != 0)
894
+ mbase = VirtualAlloc(NULL, msize, MEM_COMMIT | MEM_RESERVE, prot);
895
+
896
+ if (mbase == NULL) {
897
+ LOG(ISOLATE, StringEvent("OS::Allocate", "VirtualAlloc failed"));
898
+ return NULL;
899
+ }
900
+
901
+ ASSERT(IsAligned(reinterpret_cast<size_t>(mbase), OS::AllocateAlignment()));
902
+
903
+ *allocated = msize;
904
+ UpdateAllocatedSpaceLimits(mbase, static_cast<int>(msize));
905
+ return mbase;
906
+ }
907
+
908
+
909
+ void OS::Free(void* address, const size_t size) {
910
+ // TODO(1240712): VirtualFree has a return value which is ignored here.
911
+ VirtualFree(address, 0, MEM_RELEASE);
912
+ USE(size);
913
+ }
914
+
915
+
916
+ #ifdef ENABLE_HEAP_PROTECTION
917
+
918
+ void OS::Protect(void* address, size_t size) {
919
+ // TODO(1240712): VirtualProtect has a return value which is ignored here.
920
+ DWORD old_protect;
921
+ VirtualProtect(address, size, PAGE_READONLY, &old_protect);
922
+ }
923
+
924
+
925
+ void OS::Unprotect(void* address, size_t size, bool is_executable) {
926
+ // TODO(1240712): VirtualProtect has a return value which is ignored here.
927
+ DWORD new_protect = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
928
+ DWORD old_protect;
929
+ VirtualProtect(address, size, new_protect, &old_protect);
930
+ }
931
+
932
+ #endif
933
+
934
+
935
+ void OS::Sleep(int milliseconds) {
936
+ ::Sleep(milliseconds);
937
+ }
938
+
939
+
940
+ void OS::Abort() {
941
+ if (!IsDebuggerPresent()) {
942
+ #ifdef _MSC_VER
943
+ // Make the MSVCRT do a silent abort.
944
+ _set_abort_behavior(0, _WRITE_ABORT_MSG);
945
+ _set_abort_behavior(0, _CALL_REPORTFAULT);
946
+ #endif // _MSC_VER
947
+ abort();
948
+ } else {
949
+ DebugBreak();
950
+ }
951
+ }
952
+
953
+
954
+ void OS::DebugBreak() {
955
+ #ifdef _MSC_VER
956
+ __debugbreak();
957
+ #else
958
+ ::DebugBreak();
959
+ #endif
960
+ }
961
+
962
+
963
+ class Win32MemoryMappedFile : public OS::MemoryMappedFile {
964
+ public:
965
+ Win32MemoryMappedFile(HANDLE file,
966
+ HANDLE file_mapping,
967
+ void* memory,
968
+ int size)
969
+ : file_(file),
970
+ file_mapping_(file_mapping),
971
+ memory_(memory),
972
+ size_(size) { }
973
+ virtual ~Win32MemoryMappedFile();
974
+ virtual void* memory() { return memory_; }
975
+ virtual int size() { return size_; }
976
+ private:
977
+ HANDLE file_;
978
+ HANDLE file_mapping_;
979
+ void* memory_;
980
+ int size_;
981
+ };
982
+
983
+
984
+ OS::MemoryMappedFile* OS::MemoryMappedFile::open(const char* name) {
985
+ // Open a physical file
986
+ HANDLE file = CreateFileA(name, GENERIC_READ | GENERIC_WRITE,
987
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
988
+ if (file == INVALID_HANDLE_VALUE) return NULL;
989
+
990
+ int size = static_cast<int>(GetFileSize(file, NULL));
991
+
992
+ // Create a file mapping for the physical file
993
+ HANDLE file_mapping = CreateFileMapping(file, NULL,
994
+ PAGE_READWRITE, 0, static_cast<DWORD>(size), NULL);
995
+ if (file_mapping == NULL) return NULL;
996
+
997
+ // Map a view of the file into memory
998
+ void* memory = MapViewOfFile(file_mapping, FILE_MAP_ALL_ACCESS, 0, 0, size);
999
+ return new Win32MemoryMappedFile(file, file_mapping, memory, size);
1000
+ }
1001
+
1002
+
1003
+ OS::MemoryMappedFile* OS::MemoryMappedFile::create(const char* name, int size,
1004
+ void* initial) {
1005
+ // Open a physical file
1006
+ HANDLE file = CreateFileA(name, GENERIC_READ | GENERIC_WRITE,
1007
+ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, 0, NULL);
1008
+ if (file == NULL) return NULL;
1009
+ // Create a file mapping for the physical file
1010
+ HANDLE file_mapping = CreateFileMapping(file, NULL,
1011
+ PAGE_READWRITE, 0, static_cast<DWORD>(size), NULL);
1012
+ if (file_mapping == NULL) return NULL;
1013
+ // Map a view of the file into memory
1014
+ void* memory = MapViewOfFile(file_mapping, FILE_MAP_ALL_ACCESS, 0, 0, size);
1015
+ if (memory) memmove(memory, initial, size);
1016
+ return new Win32MemoryMappedFile(file, file_mapping, memory, size);
1017
+ }
1018
+
1019
+
1020
+ Win32MemoryMappedFile::~Win32MemoryMappedFile() {
1021
+ if (memory_ != NULL)
1022
+ UnmapViewOfFile(memory_);
1023
+ CloseHandle(file_mapping_);
1024
+ CloseHandle(file_);
1025
+ }
1026
+
1027
+
1028
+ // The following code loads functions defined in DbhHelp.h and TlHelp32.h
1029
+ // dynamically. This is to avoid being depending on dbghelp.dll and
1030
+ // tlhelp32.dll when running (the functions in tlhelp32.dll have been moved to
1031
+ // kernel32.dll at some point so loading functions defines in TlHelp32.h
1032
+ // dynamically might not be necessary any more - for some versions of Windows?).
1033
+
1034
+ // Function pointers to functions dynamically loaded from dbghelp.dll.
1035
+ #define DBGHELP_FUNCTION_LIST(V) \
1036
+ V(SymInitialize) \
1037
+ V(SymGetOptions) \
1038
+ V(SymSetOptions) \
1039
+ V(SymGetSearchPath) \
1040
+ V(SymLoadModule64) \
1041
+ V(StackWalk64) \
1042
+ V(SymGetSymFromAddr64) \
1043
+ V(SymGetLineFromAddr64) \
1044
+ V(SymFunctionTableAccess64) \
1045
+ V(SymGetModuleBase64)
1046
+
1047
+ // Function pointers to functions dynamically loaded from dbghelp.dll.
1048
+ #define TLHELP32_FUNCTION_LIST(V) \
1049
+ V(CreateToolhelp32Snapshot) \
1050
+ V(Module32FirstW) \
1051
+ V(Module32NextW)
1052
+
1053
+ // Define the decoration to use for the type and variable name used for
1054
+ // dynamically loaded DLL function..
1055
+ #define DLL_FUNC_TYPE(name) _##name##_
1056
+ #define DLL_FUNC_VAR(name) _##name
1057
+
1058
+ // Define the type for each dynamically loaded DLL function. The function
1059
+ // definitions are copied from DbgHelp.h and TlHelp32.h. The IN and VOID macros
1060
+ // from the Windows include files are redefined here to have the function
1061
+ // definitions to be as close to the ones in the original .h files as possible.
1062
+ #ifndef IN
1063
+ #define IN
1064
+ #endif
1065
+ #ifndef VOID
1066
+ #define VOID void
1067
+ #endif
1068
+
1069
+ // DbgHelp isn't supported on MinGW yet
1070
+ #ifndef __MINGW32__
1071
+ // DbgHelp.h functions.
1072
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(SymInitialize))(IN HANDLE hProcess,
1073
+ IN PSTR UserSearchPath,
1074
+ IN BOOL fInvadeProcess);
1075
+ typedef DWORD (__stdcall *DLL_FUNC_TYPE(SymGetOptions))(VOID);
1076
+ typedef DWORD (__stdcall *DLL_FUNC_TYPE(SymSetOptions))(IN DWORD SymOptions);
1077
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetSearchPath))(
1078
+ IN HANDLE hProcess,
1079
+ OUT PSTR SearchPath,
1080
+ IN DWORD SearchPathLength);
1081
+ typedef DWORD64 (__stdcall *DLL_FUNC_TYPE(SymLoadModule64))(
1082
+ IN HANDLE hProcess,
1083
+ IN HANDLE hFile,
1084
+ IN PSTR ImageName,
1085
+ IN PSTR ModuleName,
1086
+ IN DWORD64 BaseOfDll,
1087
+ IN DWORD SizeOfDll);
1088
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(StackWalk64))(
1089
+ DWORD MachineType,
1090
+ HANDLE hProcess,
1091
+ HANDLE hThread,
1092
+ LPSTACKFRAME64 StackFrame,
1093
+ PVOID ContextRecord,
1094
+ PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,
1095
+ PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
1096
+ PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,
1097
+ PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);
1098
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetSymFromAddr64))(
1099
+ IN HANDLE hProcess,
1100
+ IN DWORD64 qwAddr,
1101
+ OUT PDWORD64 pdwDisplacement,
1102
+ OUT PIMAGEHLP_SYMBOL64 Symbol);
1103
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(SymGetLineFromAddr64))(
1104
+ IN HANDLE hProcess,
1105
+ IN DWORD64 qwAddr,
1106
+ OUT PDWORD pdwDisplacement,
1107
+ OUT PIMAGEHLP_LINE64 Line64);
1108
+ // DbgHelp.h typedefs. Implementation found in dbghelp.dll.
1109
+ typedef PVOID (__stdcall *DLL_FUNC_TYPE(SymFunctionTableAccess64))(
1110
+ HANDLE hProcess,
1111
+ DWORD64 AddrBase); // DbgHelp.h typedef PFUNCTION_TABLE_ACCESS_ROUTINE64
1112
+ typedef DWORD64 (__stdcall *DLL_FUNC_TYPE(SymGetModuleBase64))(
1113
+ HANDLE hProcess,
1114
+ DWORD64 AddrBase); // DbgHelp.h typedef PGET_MODULE_BASE_ROUTINE64
1115
+
1116
+ // TlHelp32.h functions.
1117
+ typedef HANDLE (__stdcall *DLL_FUNC_TYPE(CreateToolhelp32Snapshot))(
1118
+ DWORD dwFlags,
1119
+ DWORD th32ProcessID);
1120
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(Module32FirstW))(HANDLE hSnapshot,
1121
+ LPMODULEENTRY32W lpme);
1122
+ typedef BOOL (__stdcall *DLL_FUNC_TYPE(Module32NextW))(HANDLE hSnapshot,
1123
+ LPMODULEENTRY32W lpme);
1124
+
1125
+ #undef IN
1126
+ #undef VOID
1127
+
1128
+ // Declare a variable for each dynamically loaded DLL function.
1129
+ #define DEF_DLL_FUNCTION(name) DLL_FUNC_TYPE(name) DLL_FUNC_VAR(name) = NULL;
1130
+ DBGHELP_FUNCTION_LIST(DEF_DLL_FUNCTION)
1131
+ TLHELP32_FUNCTION_LIST(DEF_DLL_FUNCTION)
1132
+ #undef DEF_DLL_FUNCTION
1133
+
1134
+ // Load the functions. This function has a lot of "ugly" macros in order to
1135
+ // keep down code duplication.
1136
+
1137
+ static bool LoadDbgHelpAndTlHelp32() {
1138
+ static bool dbghelp_loaded = false;
1139
+
1140
+ if (dbghelp_loaded) return true;
1141
+
1142
+ HMODULE module;
1143
+
1144
+ // Load functions from the dbghelp.dll module.
1145
+ module = LoadLibrary(TEXT("dbghelp.dll"));
1146
+ if (module == NULL) {
1147
+ return false;
1148
+ }
1149
+
1150
+ #define LOAD_DLL_FUNC(name) \
1151
+ DLL_FUNC_VAR(name) = \
1152
+ reinterpret_cast<DLL_FUNC_TYPE(name)>(GetProcAddress(module, #name));
1153
+
1154
+ DBGHELP_FUNCTION_LIST(LOAD_DLL_FUNC)
1155
+
1156
+ #undef LOAD_DLL_FUNC
1157
+
1158
+ // Load functions from the kernel32.dll module (the TlHelp32.h function used
1159
+ // to be in tlhelp32.dll but are now moved to kernel32.dll).
1160
+ module = LoadLibrary(TEXT("kernel32.dll"));
1161
+ if (module == NULL) {
1162
+ return false;
1163
+ }
1164
+
1165
+ #define LOAD_DLL_FUNC(name) \
1166
+ DLL_FUNC_VAR(name) = \
1167
+ reinterpret_cast<DLL_FUNC_TYPE(name)>(GetProcAddress(module, #name));
1168
+
1169
+ TLHELP32_FUNCTION_LIST(LOAD_DLL_FUNC)
1170
+
1171
+ #undef LOAD_DLL_FUNC
1172
+
1173
+ // Check that all functions where loaded.
1174
+ bool result =
1175
+ #define DLL_FUNC_LOADED(name) (DLL_FUNC_VAR(name) != NULL) &&
1176
+
1177
+ DBGHELP_FUNCTION_LIST(DLL_FUNC_LOADED)
1178
+ TLHELP32_FUNCTION_LIST(DLL_FUNC_LOADED)
1179
+
1180
+ #undef DLL_FUNC_LOADED
1181
+ true;
1182
+
1183
+ dbghelp_loaded = result;
1184
+ return result;
1185
+ // NOTE: The modules are never unloaded and will stay around until the
1186
+ // application is closed.
1187
+ }
1188
+
1189
+
1190
+ // Load the symbols for generating stack traces.
1191
+ static bool LoadSymbols(HANDLE process_handle) {
1192
+ static bool symbols_loaded = false;
1193
+
1194
+ if (symbols_loaded) return true;
1195
+
1196
+ BOOL ok;
1197
+
1198
+ // Initialize the symbol engine.
1199
+ ok = _SymInitialize(process_handle, // hProcess
1200
+ NULL, // UserSearchPath
1201
+ false); // fInvadeProcess
1202
+ if (!ok) return false;
1203
+
1204
+ DWORD options = _SymGetOptions();
1205
+ options |= SYMOPT_LOAD_LINES;
1206
+ options |= SYMOPT_FAIL_CRITICAL_ERRORS;
1207
+ options = _SymSetOptions(options);
1208
+
1209
+ char buf[OS::kStackWalkMaxNameLen] = {0};
1210
+ ok = _SymGetSearchPath(process_handle, buf, OS::kStackWalkMaxNameLen);
1211
+ if (!ok) {
1212
+ int err = GetLastError();
1213
+ PrintF("%d\n", err);
1214
+ return false;
1215
+ }
1216
+
1217
+ HANDLE snapshot = _CreateToolhelp32Snapshot(
1218
+ TH32CS_SNAPMODULE, // dwFlags
1219
+ GetCurrentProcessId()); // th32ProcessId
1220
+ if (snapshot == INVALID_HANDLE_VALUE) return false;
1221
+ MODULEENTRY32W module_entry;
1222
+ module_entry.dwSize = sizeof(module_entry); // Set the size of the structure.
1223
+ BOOL cont = _Module32FirstW(snapshot, &module_entry);
1224
+ while (cont) {
1225
+ DWORD64 base;
1226
+ // NOTE the SymLoadModule64 function has the peculiarity of accepting a
1227
+ // both unicode and ASCII strings even though the parameter is PSTR.
1228
+ base = _SymLoadModule64(
1229
+ process_handle, // hProcess
1230
+ 0, // hFile
1231
+ reinterpret_cast<PSTR>(module_entry.szExePath), // ImageName
1232
+ reinterpret_cast<PSTR>(module_entry.szModule), // ModuleName
1233
+ reinterpret_cast<DWORD64>(module_entry.modBaseAddr), // BaseOfDll
1234
+ module_entry.modBaseSize); // SizeOfDll
1235
+ if (base == 0) {
1236
+ int err = GetLastError();
1237
+ if (err != ERROR_MOD_NOT_FOUND &&
1238
+ err != ERROR_INVALID_HANDLE) return false;
1239
+ }
1240
+ LOG(i::Isolate::Current(),
1241
+ SharedLibraryEvent(
1242
+ module_entry.szExePath,
1243
+ reinterpret_cast<unsigned int>(module_entry.modBaseAddr),
1244
+ reinterpret_cast<unsigned int>(module_entry.modBaseAddr +
1245
+ module_entry.modBaseSize)));
1246
+ cont = _Module32NextW(snapshot, &module_entry);
1247
+ }
1248
+ CloseHandle(snapshot);
1249
+
1250
+ symbols_loaded = true;
1251
+ return true;
1252
+ }
1253
+
1254
+
1255
+ void OS::LogSharedLibraryAddresses() {
1256
+ // SharedLibraryEvents are logged when loading symbol information.
1257
+ // Only the shared libraries loaded at the time of the call to
1258
+ // LogSharedLibraryAddresses are logged. DLLs loaded after
1259
+ // initialization are not accounted for.
1260
+ if (!LoadDbgHelpAndTlHelp32()) return;
1261
+ HANDLE process_handle = GetCurrentProcess();
1262
+ LoadSymbols(process_handle);
1263
+ }
1264
+
1265
+
1266
+ void OS::SignalCodeMovingGC() {
1267
+ }
1268
+
1269
+
1270
+ // Walk the stack using the facilities in dbghelp.dll and tlhelp32.dll
1271
+
1272
+ // Switch off warning 4748 (/GS can not protect parameters and local variables
1273
+ // from local buffer overrun because optimizations are disabled in function) as
1274
+ // it is triggered by the use of inline assembler.
1275
+ #pragma warning(push)
1276
+ #pragma warning(disable : 4748)
1277
+ int OS::StackWalk(Vector<OS::StackFrame> frames) {
1278
+ BOOL ok;
1279
+
1280
+ // Load the required functions from DLL's.
1281
+ if (!LoadDbgHelpAndTlHelp32()) return kStackWalkError;
1282
+
1283
+ // Get the process and thread handles.
1284
+ HANDLE process_handle = GetCurrentProcess();
1285
+ HANDLE thread_handle = GetCurrentThread();
1286
+
1287
+ // Read the symbols.
1288
+ if (!LoadSymbols(process_handle)) return kStackWalkError;
1289
+
1290
+ // Capture current context.
1291
+ CONTEXT context;
1292
+ RtlCaptureContext(&context);
1293
+
1294
+ // Initialize the stack walking
1295
+ STACKFRAME64 stack_frame;
1296
+ memset(&stack_frame, 0, sizeof(stack_frame));
1297
+ #ifdef _WIN64
1298
+ stack_frame.AddrPC.Offset = context.Rip;
1299
+ stack_frame.AddrFrame.Offset = context.Rbp;
1300
+ stack_frame.AddrStack.Offset = context.Rsp;
1301
+ #else
1302
+ stack_frame.AddrPC.Offset = context.Eip;
1303
+ stack_frame.AddrFrame.Offset = context.Ebp;
1304
+ stack_frame.AddrStack.Offset = context.Esp;
1305
+ #endif
1306
+ stack_frame.AddrPC.Mode = AddrModeFlat;
1307
+ stack_frame.AddrFrame.Mode = AddrModeFlat;
1308
+ stack_frame.AddrStack.Mode = AddrModeFlat;
1309
+ int frames_count = 0;
1310
+
1311
+ // Collect stack frames.
1312
+ int frames_size = frames.length();
1313
+ while (frames_count < frames_size) {
1314
+ ok = _StackWalk64(
1315
+ IMAGE_FILE_MACHINE_I386, // MachineType
1316
+ process_handle, // hProcess
1317
+ thread_handle, // hThread
1318
+ &stack_frame, // StackFrame
1319
+ &context, // ContextRecord
1320
+ NULL, // ReadMemoryRoutine
1321
+ _SymFunctionTableAccess64, // FunctionTableAccessRoutine
1322
+ _SymGetModuleBase64, // GetModuleBaseRoutine
1323
+ NULL); // TranslateAddress
1324
+ if (!ok) break;
1325
+
1326
+ // Store the address.
1327
+ ASSERT((stack_frame.AddrPC.Offset >> 32) == 0); // 32-bit address.
1328
+ frames[frames_count].address =
1329
+ reinterpret_cast<void*>(stack_frame.AddrPC.Offset);
1330
+
1331
+ // Try to locate a symbol for this frame.
1332
+ DWORD64 symbol_displacement;
1333
+ SmartPointer<IMAGEHLP_SYMBOL64> symbol(
1334
+ NewArray<IMAGEHLP_SYMBOL64>(kStackWalkMaxNameLen));
1335
+ if (symbol.is_empty()) return kStackWalkError; // Out of memory.
1336
+ memset(*symbol, 0, sizeof(IMAGEHLP_SYMBOL64) + kStackWalkMaxNameLen);
1337
+ (*symbol)->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL64);
1338
+ (*symbol)->MaxNameLength = kStackWalkMaxNameLen;
1339
+ ok = _SymGetSymFromAddr64(process_handle, // hProcess
1340
+ stack_frame.AddrPC.Offset, // Address
1341
+ &symbol_displacement, // Displacement
1342
+ *symbol); // Symbol
1343
+ if (ok) {
1344
+ // Try to locate more source information for the symbol.
1345
+ IMAGEHLP_LINE64 Line;
1346
+ memset(&Line, 0, sizeof(Line));
1347
+ Line.SizeOfStruct = sizeof(Line);
1348
+ DWORD line_displacement;
1349
+ ok = _SymGetLineFromAddr64(
1350
+ process_handle, // hProcess
1351
+ stack_frame.AddrPC.Offset, // dwAddr
1352
+ &line_displacement, // pdwDisplacement
1353
+ &Line); // Line
1354
+ // Format a text representation of the frame based on the information
1355
+ // available.
1356
+ if (ok) {
1357
+ SNPrintF(MutableCStrVector(frames[frames_count].text,
1358
+ kStackWalkMaxTextLen),
1359
+ "%s %s:%d:%d",
1360
+ (*symbol)->Name, Line.FileName, Line.LineNumber,
1361
+ line_displacement);
1362
+ } else {
1363
+ SNPrintF(MutableCStrVector(frames[frames_count].text,
1364
+ kStackWalkMaxTextLen),
1365
+ "%s",
1366
+ (*symbol)->Name);
1367
+ }
1368
+ // Make sure line termination is in place.
1369
+ frames[frames_count].text[kStackWalkMaxTextLen - 1] = '\0';
1370
+ } else {
1371
+ // No text representation of this frame
1372
+ frames[frames_count].text[0] = '\0';
1373
+
1374
+ // Continue if we are just missing a module (for non C/C++ frames a
1375
+ // module will never be found).
1376
+ int err = GetLastError();
1377
+ if (err != ERROR_MOD_NOT_FOUND) {
1378
+ break;
1379
+ }
1380
+ }
1381
+
1382
+ frames_count++;
1383
+ }
1384
+
1385
+ // Return the number of frames filled in.
1386
+ return frames_count;
1387
+ }
1388
+
1389
+ // Restore warnings to previous settings.
1390
+ #pragma warning(pop)
1391
+
1392
+ #else // __MINGW32__
1393
+ void OS::LogSharedLibraryAddresses() { }
1394
+ void OS::SignalCodeMovingGC() { }
1395
+ int OS::StackWalk(Vector<OS::StackFrame> frames) { return 0; }
1396
+ #endif // __MINGW32__
1397
+
1398
+
1399
+ uint64_t OS::CpuFeaturesImpliedByPlatform() {
1400
+ return 0; // Windows runs on anything.
1401
+ }
1402
+
1403
+
1404
+ double OS::nan_value() {
1405
+ #ifdef _MSC_VER
1406
+ // Positive Quiet NaN with no payload (aka. Indeterminate) has all bits
1407
+ // in mask set, so value equals mask.
1408
+ static const __int64 nanval = kQuietNaNMask;
1409
+ return *reinterpret_cast<const double*>(&nanval);
1410
+ #else // _MSC_VER
1411
+ return NAN;
1412
+ #endif // _MSC_VER
1413
+ }
1414
+
1415
+
1416
+ int OS::ActivationFrameAlignment() {
1417
+ #ifdef _WIN64
1418
+ return 16; // Windows 64-bit ABI requires the stack to be 16-byte aligned.
1419
+ #else
1420
+ return 8; // Floating-point math runs faster with 8-byte alignment.
1421
+ #endif
1422
+ }
1423
+
1424
+
1425
+ void OS::ReleaseStore(volatile AtomicWord* ptr, AtomicWord value) {
1426
+ MemoryBarrier();
1427
+ *ptr = value;
1428
+ }
1429
+
1430
+
1431
+ bool VirtualMemory::IsReserved() {
1432
+ return address_ != NULL;
1433
+ }
1434
+
1435
+
1436
+ VirtualMemory::VirtualMemory(size_t size) {
1437
+ address_ = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS);
1438
+ size_ = size;
1439
+ }
1440
+
1441
+
1442
+ VirtualMemory::~VirtualMemory() {
1443
+ if (IsReserved()) {
1444
+ if (0 == VirtualFree(address(), 0, MEM_RELEASE)) address_ = NULL;
1445
+ }
1446
+ }
1447
+
1448
+
1449
+ bool VirtualMemory::Commit(void* address, size_t size, bool is_executable) {
1450
+ int prot = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
1451
+ if (NULL == VirtualAlloc(address, size, MEM_COMMIT, prot)) {
1452
+ return false;
1453
+ }
1454
+
1455
+ UpdateAllocatedSpaceLimits(address, static_cast<int>(size));
1456
+ return true;
1457
+ }
1458
+
1459
+
1460
+ bool VirtualMemory::Uncommit(void* address, size_t size) {
1461
+ ASSERT(IsReserved());
1462
+ return VirtualFree(address, size, MEM_DECOMMIT) != false;
1463
+ }
1464
+
1465
+
1466
+ // ----------------------------------------------------------------------------
1467
+ // Win32 thread support.
1468
+
1469
+ // Definition of invalid thread handle and id.
1470
+ static const HANDLE kNoThread = INVALID_HANDLE_VALUE;
1471
+
1472
+ // Entry point for threads. The supplied argument is a pointer to the thread
1473
+ // object. The entry function dispatches to the run method in the thread
1474
+ // object. It is important that this function has __stdcall calling
1475
+ // convention.
1476
+ static unsigned int __stdcall ThreadEntry(void* arg) {
1477
+ Thread* thread = reinterpret_cast<Thread*>(arg);
1478
+ // This is also initialized by the last parameter to _beginthreadex() but we
1479
+ // don't know which thread will run first (the original thread or the new
1480
+ // one) so we initialize it here too.
1481
+ Thread::SetThreadLocal(Isolate::isolate_key(), thread->isolate());
1482
+ thread->Run();
1483
+ return 0;
1484
+ }
1485
+
1486
+
1487
+ class Thread::PlatformData : public Malloced {
1488
+ public:
1489
+ explicit PlatformData(HANDLE thread) : thread_(thread) {}
1490
+ HANDLE thread_;
1491
+ };
1492
+
1493
+
1494
+ // Initialize a Win32 thread object. The thread has an invalid thread
1495
+ // handle until it is started.
1496
+
1497
+ Thread::Thread(Isolate* isolate, const Options& options)
1498
+ : isolate_(isolate),
1499
+ stack_size_(options.stack_size) {
1500
+ data_ = new PlatformData(kNoThread);
1501
+ set_name(options.name);
1502
+ }
1503
+
1504
+
1505
+ Thread::Thread(Isolate* isolate, const char* name)
1506
+ : isolate_(isolate),
1507
+ stack_size_(0) {
1508
+ data_ = new PlatformData(kNoThread);
1509
+ set_name(name);
1510
+ }
1511
+
1512
+
1513
+ void Thread::set_name(const char* name) {
1514
+ OS::StrNCpy(Vector<char>(name_, sizeof(name_)), name, strlen(name));
1515
+ name_[sizeof(name_) - 1] = '\0';
1516
+ }
1517
+
1518
+
1519
+ // Close our own handle for the thread.
1520
+ Thread::~Thread() {
1521
+ if (data_->thread_ != kNoThread) CloseHandle(data_->thread_);
1522
+ delete data_;
1523
+ }
1524
+
1525
+
1526
+ // Create a new thread. It is important to use _beginthreadex() instead of
1527
+ // the Win32 function CreateThread(), because the CreateThread() does not
1528
+ // initialize thread specific structures in the C runtime library.
1529
+ void Thread::Start() {
1530
+ data_->thread_ = reinterpret_cast<HANDLE>(
1531
+ _beginthreadex(NULL,
1532
+ static_cast<unsigned>(stack_size_),
1533
+ ThreadEntry,
1534
+ this,
1535
+ 0,
1536
+ NULL));
1537
+ }
1538
+
1539
+
1540
+ // Wait for thread to terminate.
1541
+ void Thread::Join() {
1542
+ WaitForSingleObject(data_->thread_, INFINITE);
1543
+ }
1544
+
1545
+
1546
+ Thread::LocalStorageKey Thread::CreateThreadLocalKey() {
1547
+ DWORD result = TlsAlloc();
1548
+ ASSERT(result != TLS_OUT_OF_INDEXES);
1549
+ return static_cast<LocalStorageKey>(result);
1550
+ }
1551
+
1552
+
1553
+ void Thread::DeleteThreadLocalKey(LocalStorageKey key) {
1554
+ BOOL result = TlsFree(static_cast<DWORD>(key));
1555
+ USE(result);
1556
+ ASSERT(result);
1557
+ }
1558
+
1559
+
1560
+ void* Thread::GetThreadLocal(LocalStorageKey key) {
1561
+ return TlsGetValue(static_cast<DWORD>(key));
1562
+ }
1563
+
1564
+
1565
+ void Thread::SetThreadLocal(LocalStorageKey key, void* value) {
1566
+ BOOL result = TlsSetValue(static_cast<DWORD>(key), value);
1567
+ USE(result);
1568
+ ASSERT(result);
1569
+ }
1570
+
1571
+
1572
+
1573
+ void Thread::YieldCPU() {
1574
+ Sleep(0);
1575
+ }
1576
+
1577
+
1578
+ // ----------------------------------------------------------------------------
1579
+ // Win32 mutex support.
1580
+ //
1581
+ // On Win32 mutexes are implemented using CRITICAL_SECTION objects. These are
1582
+ // faster than Win32 Mutex objects because they are implemented using user mode
1583
+ // atomic instructions. Therefore we only do ring transitions if there is lock
1584
+ // contention.
1585
+
1586
+ class Win32Mutex : public Mutex {
1587
+ public:
1588
+
1589
+ Win32Mutex() { InitializeCriticalSection(&cs_); }
1590
+
1591
+ virtual ~Win32Mutex() { DeleteCriticalSection(&cs_); }
1592
+
1593
+ virtual int Lock() {
1594
+ EnterCriticalSection(&cs_);
1595
+ return 0;
1596
+ }
1597
+
1598
+ virtual int Unlock() {
1599
+ LeaveCriticalSection(&cs_);
1600
+ return 0;
1601
+ }
1602
+
1603
+
1604
+ virtual bool TryLock() {
1605
+ // Returns non-zero if critical section is entered successfully entered.
1606
+ return TryEnterCriticalSection(&cs_);
1607
+ }
1608
+
1609
+ private:
1610
+ CRITICAL_SECTION cs_; // Critical section used for mutex
1611
+ };
1612
+
1613
+
1614
+ Mutex* OS::CreateMutex() {
1615
+ return new Win32Mutex();
1616
+ }
1617
+
1618
+
1619
+ // ----------------------------------------------------------------------------
1620
+ // Win32 semaphore support.
1621
+ //
1622
+ // On Win32 semaphores are implemented using Win32 Semaphore objects. The
1623
+ // semaphores are anonymous. Also, the semaphores are initialized to have
1624
+ // no upper limit on count.
1625
+
1626
+
1627
+ class Win32Semaphore : public Semaphore {
1628
+ public:
1629
+ explicit Win32Semaphore(int count) {
1630
+ sem = ::CreateSemaphoreA(NULL, count, 0x7fffffff, NULL);
1631
+ }
1632
+
1633
+ ~Win32Semaphore() {
1634
+ CloseHandle(sem);
1635
+ }
1636
+
1637
+ void Wait() {
1638
+ WaitForSingleObject(sem, INFINITE);
1639
+ }
1640
+
1641
+ bool Wait(int timeout) {
1642
+ // Timeout in Windows API is in milliseconds.
1643
+ DWORD millis_timeout = timeout / 1000;
1644
+ return WaitForSingleObject(sem, millis_timeout) != WAIT_TIMEOUT;
1645
+ }
1646
+
1647
+ void Signal() {
1648
+ LONG dummy;
1649
+ ReleaseSemaphore(sem, 1, &dummy);
1650
+ }
1651
+
1652
+ private:
1653
+ HANDLE sem;
1654
+ };
1655
+
1656
+
1657
+ Semaphore* OS::CreateSemaphore(int count) {
1658
+ return new Win32Semaphore(count);
1659
+ }
1660
+
1661
+
1662
+ // ----------------------------------------------------------------------------
1663
+ // Win32 socket support.
1664
+ //
1665
+
1666
+ class Win32Socket : public Socket {
1667
+ public:
1668
+ explicit Win32Socket() {
1669
+ // Create the socket.
1670
+ socket_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1671
+ }
1672
+ explicit Win32Socket(SOCKET socket): socket_(socket) { }
1673
+ virtual ~Win32Socket() { Shutdown(); }
1674
+
1675
+ // Server initialization.
1676
+ bool Bind(const int port);
1677
+ bool Listen(int backlog) const;
1678
+ Socket* Accept() const;
1679
+
1680
+ // Client initialization.
1681
+ bool Connect(const char* host, const char* port);
1682
+
1683
+ // Shutdown socket for both read and write.
1684
+ bool Shutdown();
1685
+
1686
+ // Data Transimission
1687
+ int Send(const char* data, int len) const;
1688
+ int Receive(char* data, int len) const;
1689
+
1690
+ bool SetReuseAddress(bool reuse_address);
1691
+
1692
+ bool IsValid() const { return socket_ != INVALID_SOCKET; }
1693
+
1694
+ private:
1695
+ SOCKET socket_;
1696
+ };
1697
+
1698
+
1699
+ bool Win32Socket::Bind(const int port) {
1700
+ if (!IsValid()) {
1701
+ return false;
1702
+ }
1703
+
1704
+ sockaddr_in addr;
1705
+ memset(&addr, 0, sizeof(addr));
1706
+ addr.sin_family = AF_INET;
1707
+ addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
1708
+ addr.sin_port = htons(port);
1709
+ int status = bind(socket_,
1710
+ reinterpret_cast<struct sockaddr *>(&addr),
1711
+ sizeof(addr));
1712
+ return status == 0;
1713
+ }
1714
+
1715
+
1716
+ bool Win32Socket::Listen(int backlog) const {
1717
+ if (!IsValid()) {
1718
+ return false;
1719
+ }
1720
+
1721
+ int status = listen(socket_, backlog);
1722
+ return status == 0;
1723
+ }
1724
+
1725
+
1726
+ Socket* Win32Socket::Accept() const {
1727
+ if (!IsValid()) {
1728
+ return NULL;
1729
+ }
1730
+
1731
+ SOCKET socket = accept(socket_, NULL, NULL);
1732
+ if (socket == INVALID_SOCKET) {
1733
+ return NULL;
1734
+ } else {
1735
+ return new Win32Socket(socket);
1736
+ }
1737
+ }
1738
+
1739
+
1740
+ bool Win32Socket::Connect(const char* host, const char* port) {
1741
+ if (!IsValid()) {
1742
+ return false;
1743
+ }
1744
+
1745
+ // Lookup host and port.
1746
+ struct addrinfo *result = NULL;
1747
+ struct addrinfo hints;
1748
+ memset(&hints, 0, sizeof(addrinfo));
1749
+ hints.ai_family = AF_INET;
1750
+ hints.ai_socktype = SOCK_STREAM;
1751
+ hints.ai_protocol = IPPROTO_TCP;
1752
+ int status = getaddrinfo(host, port, &hints, &result);
1753
+ if (status != 0) {
1754
+ return false;
1755
+ }
1756
+
1757
+ // Connect.
1758
+ status = connect(socket_,
1759
+ result->ai_addr,
1760
+ static_cast<int>(result->ai_addrlen));
1761
+ freeaddrinfo(result);
1762
+ return status == 0;
1763
+ }
1764
+
1765
+
1766
+ bool Win32Socket::Shutdown() {
1767
+ if (IsValid()) {
1768
+ // Shutdown socket for both read and write.
1769
+ int status = shutdown(socket_, SD_BOTH);
1770
+ closesocket(socket_);
1771
+ socket_ = INVALID_SOCKET;
1772
+ return status == SOCKET_ERROR;
1773
+ }
1774
+ return true;
1775
+ }
1776
+
1777
+
1778
+ int Win32Socket::Send(const char* data, int len) const {
1779
+ int status = send(socket_, data, len, 0);
1780
+ return status;
1781
+ }
1782
+
1783
+
1784
+ int Win32Socket::Receive(char* data, int len) const {
1785
+ int status = recv(socket_, data, len, 0);
1786
+ return status;
1787
+ }
1788
+
1789
+
1790
+ bool Win32Socket::SetReuseAddress(bool reuse_address) {
1791
+ BOOL on = reuse_address ? true : false;
1792
+ int status = setsockopt(socket_, SOL_SOCKET, SO_REUSEADDR,
1793
+ reinterpret_cast<char*>(&on), sizeof(on));
1794
+ return status == SOCKET_ERROR;
1795
+ }
1796
+
1797
+
1798
+ bool Socket::Setup() {
1799
+ // Initialize Winsock32
1800
+ int err;
1801
+ WSADATA winsock_data;
1802
+ WORD version_requested = MAKEWORD(1, 0);
1803
+ err = WSAStartup(version_requested, &winsock_data);
1804
+ if (err != 0) {
1805
+ PrintF("Unable to initialize Winsock, err = %d\n", Socket::LastError());
1806
+ }
1807
+
1808
+ return err == 0;
1809
+ }
1810
+
1811
+
1812
+ int Socket::LastError() {
1813
+ return WSAGetLastError();
1814
+ }
1815
+
1816
+
1817
+ uint16_t Socket::HToN(uint16_t value) {
1818
+ return htons(value);
1819
+ }
1820
+
1821
+
1822
+ uint16_t Socket::NToH(uint16_t value) {
1823
+ return ntohs(value);
1824
+ }
1825
+
1826
+
1827
+ uint32_t Socket::HToN(uint32_t value) {
1828
+ return htonl(value);
1829
+ }
1830
+
1831
+
1832
+ uint32_t Socket::NToH(uint32_t value) {
1833
+ return ntohl(value);
1834
+ }
1835
+
1836
+
1837
+ Socket* OS::CreateSocket() {
1838
+ return new Win32Socket();
1839
+ }
1840
+
1841
+
1842
+ #ifdef ENABLE_LOGGING_AND_PROFILING
1843
+
1844
+ // ----------------------------------------------------------------------------
1845
+ // Win32 profiler support.
1846
+
1847
+ class Sampler::PlatformData : public Malloced {
1848
+ public:
1849
+ // Get a handle to the calling thread. This is the thread that we are
1850
+ // going to profile. We need to make a copy of the handle because we are
1851
+ // going to use it in the sampler thread. Using GetThreadHandle() will
1852
+ // not work in this case. We're using OpenThread because DuplicateHandle
1853
+ // for some reason doesn't work in Chrome's sandbox.
1854
+ PlatformData() : profiled_thread_(OpenThread(THREAD_GET_CONTEXT |
1855
+ THREAD_SUSPEND_RESUME |
1856
+ THREAD_QUERY_INFORMATION,
1857
+ false,
1858
+ GetCurrentThreadId())) {}
1859
+
1860
+ ~PlatformData() {
1861
+ if (profiled_thread_ != NULL) {
1862
+ CloseHandle(profiled_thread_);
1863
+ profiled_thread_ = NULL;
1864
+ }
1865
+ }
1866
+
1867
+ HANDLE profiled_thread() { return profiled_thread_; }
1868
+
1869
+ private:
1870
+ HANDLE profiled_thread_;
1871
+ };
1872
+
1873
+
1874
+ class SamplerThread : public Thread {
1875
+ public:
1876
+ explicit SamplerThread(int interval)
1877
+ : Thread(NULL, "SamplerThread"),
1878
+ interval_(interval) {}
1879
+
1880
+ static void AddActiveSampler(Sampler* sampler) {
1881
+ ScopedLock lock(mutex_);
1882
+ SamplerRegistry::AddActiveSampler(sampler);
1883
+ if (instance_ == NULL) {
1884
+ instance_ = new SamplerThread(sampler->interval());
1885
+ instance_->Start();
1886
+ } else {
1887
+ ASSERT(instance_->interval_ == sampler->interval());
1888
+ }
1889
+ }
1890
+
1891
+ static void RemoveActiveSampler(Sampler* sampler) {
1892
+ ScopedLock lock(mutex_);
1893
+ SamplerRegistry::RemoveActiveSampler(sampler);
1894
+ if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) {
1895
+ RuntimeProfiler::WakeUpRuntimeProfilerThreadBeforeShutdown();
1896
+ instance_->Join();
1897
+ delete instance_;
1898
+ instance_ = NULL;
1899
+ }
1900
+ }
1901
+
1902
+ // Implement Thread::Run().
1903
+ virtual void Run() {
1904
+ SamplerRegistry::State state;
1905
+ while ((state = SamplerRegistry::GetState()) !=
1906
+ SamplerRegistry::HAS_NO_SAMPLERS) {
1907
+ bool cpu_profiling_enabled =
1908
+ (state == SamplerRegistry::HAS_CPU_PROFILING_SAMPLERS);
1909
+ bool runtime_profiler_enabled = RuntimeProfiler::IsEnabled();
1910
+ // When CPU profiling is enabled both JavaScript and C++ code is
1911
+ // profiled. We must not suspend.
1912
+ if (!cpu_profiling_enabled) {
1913
+ if (rate_limiter_.SuspendIfNecessary()) continue;
1914
+ }
1915
+ if (cpu_profiling_enabled) {
1916
+ if (!SamplerRegistry::IterateActiveSamplers(&DoCpuProfile, this)) {
1917
+ return;
1918
+ }
1919
+ }
1920
+ if (runtime_profiler_enabled) {
1921
+ if (!SamplerRegistry::IterateActiveSamplers(&DoRuntimeProfile, NULL)) {
1922
+ return;
1923
+ }
1924
+ }
1925
+ OS::Sleep(interval_);
1926
+ }
1927
+ }
1928
+
1929
+ static void DoCpuProfile(Sampler* sampler, void* raw_sampler_thread) {
1930
+ if (!sampler->isolate()->IsInitialized()) return;
1931
+ if (!sampler->IsProfiling()) return;
1932
+ SamplerThread* sampler_thread =
1933
+ reinterpret_cast<SamplerThread*>(raw_sampler_thread);
1934
+ sampler_thread->SampleContext(sampler);
1935
+ }
1936
+
1937
+ static void DoRuntimeProfile(Sampler* sampler, void* ignored) {
1938
+ if (!sampler->isolate()->IsInitialized()) return;
1939
+ sampler->isolate()->runtime_profiler()->NotifyTick();
1940
+ }
1941
+
1942
+ void SampleContext(Sampler* sampler) {
1943
+ HANDLE profiled_thread = sampler->platform_data()->profiled_thread();
1944
+ if (profiled_thread == NULL) return;
1945
+
1946
+ // Context used for sampling the register state of the profiled thread.
1947
+ CONTEXT context;
1948
+ memset(&context, 0, sizeof(context));
1949
+
1950
+ TickSample sample_obj;
1951
+ TickSample* sample = CpuProfiler::TickSampleEvent(sampler->isolate());
1952
+ if (sample == NULL) sample = &sample_obj;
1953
+
1954
+ static const DWORD kSuspendFailed = static_cast<DWORD>(-1);
1955
+ if (SuspendThread(profiled_thread) == kSuspendFailed) return;
1956
+ sample->state = sampler->isolate()->current_vm_state();
1957
+
1958
+ context.ContextFlags = CONTEXT_FULL;
1959
+ if (GetThreadContext(profiled_thread, &context) != 0) {
1960
+ #if V8_HOST_ARCH_X64
1961
+ sample->pc = reinterpret_cast<Address>(context.Rip);
1962
+ sample->sp = reinterpret_cast<Address>(context.Rsp);
1963
+ sample->fp = reinterpret_cast<Address>(context.Rbp);
1964
+ #else
1965
+ sample->pc = reinterpret_cast<Address>(context.Eip);
1966
+ sample->sp = reinterpret_cast<Address>(context.Esp);
1967
+ sample->fp = reinterpret_cast<Address>(context.Ebp);
1968
+ #endif
1969
+ sampler->SampleStack(sample);
1970
+ sampler->Tick(sample);
1971
+ }
1972
+ ResumeThread(profiled_thread);
1973
+ }
1974
+
1975
+ const int interval_;
1976
+ RuntimeProfilerRateLimiter rate_limiter_;
1977
+
1978
+ // Protects the process wide state below.
1979
+ static Mutex* mutex_;
1980
+ static SamplerThread* instance_;
1981
+
1982
+ DISALLOW_COPY_AND_ASSIGN(SamplerThread);
1983
+ };
1984
+
1985
+
1986
+ Mutex* SamplerThread::mutex_ = OS::CreateMutex();
1987
+ SamplerThread* SamplerThread::instance_ = NULL;
1988
+
1989
+
1990
+ Sampler::Sampler(Isolate* isolate, int interval)
1991
+ : isolate_(isolate),
1992
+ interval_(interval),
1993
+ profiling_(false),
1994
+ active_(false),
1995
+ samples_taken_(0) {
1996
+ data_ = new PlatformData;
1997
+ }
1998
+
1999
+
2000
+ Sampler::~Sampler() {
2001
+ ASSERT(!IsActive());
2002
+ delete data_;
2003
+ }
2004
+
2005
+
2006
+ void Sampler::Start() {
2007
+ ASSERT(!IsActive());
2008
+ SetActive(true);
2009
+ SamplerThread::AddActiveSampler(this);
2010
+ }
2011
+
2012
+
2013
+ void Sampler::Stop() {
2014
+ ASSERT(IsActive());
2015
+ SamplerThread::RemoveActiveSampler(this);
2016
+ SetActive(false);
2017
+ }
2018
+
2019
+ #endif // ENABLE_LOGGING_AND_PROFILING
2020
+
2021
+ } } // namespace v8::internal