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,1214 @@
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_MIPS_MACRO_ASSEMBLER_MIPS_H_
29
+ #define V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
30
+
31
+ #include "assembler.h"
32
+ #include "mips/assembler-mips.h"
33
+ #include "v8globals.h"
34
+
35
+ namespace v8 {
36
+ namespace internal {
37
+
38
+ // Forward declaration.
39
+ class JumpTarget;
40
+
41
+ // Reserved Register Usage Summary.
42
+ //
43
+ // Registers t8, t9, and at are reserved for use by the MacroAssembler.
44
+ //
45
+ // The programmer should know that the MacroAssembler may clobber these three,
46
+ // but won't touch other registers except in special cases.
47
+ //
48
+ // Per the MIPS ABI, register t9 must be used for indirect function call
49
+ // via 'jalr t9' or 'jr t9' instructions. This is relied upon by gcc when
50
+ // trying to update gp register for position-independent-code. Whenever
51
+ // MIPS generated code calls C code, it must be via t9 register.
52
+
53
+ // Registers aliases
54
+ // cp is assumed to be a callee saved register.
55
+ const Register roots = s6; // Roots array pointer.
56
+ const Register cp = s7; // JavaScript context pointer.
57
+ const Register fp = s8_fp; // Alias for fp.
58
+ // Registers used for condition evaluation.
59
+ const Register condReg1 = s4;
60
+ const Register condReg2 = s5;
61
+
62
+
63
+ // Flags used for the AllocateInNewSpace functions.
64
+ enum AllocationFlags {
65
+ // No special flags.
66
+ NO_ALLOCATION_FLAGS = 0,
67
+ // Return the pointer to the allocated already tagged as a heap object.
68
+ TAG_OBJECT = 1 << 0,
69
+ // The content of the result register already contains the allocation top in
70
+ // new space.
71
+ RESULT_CONTAINS_TOP = 1 << 1,
72
+ // Specify that the requested size of the space to allocate is specified in
73
+ // words instead of bytes.
74
+ SIZE_IN_WORDS = 1 << 2
75
+ };
76
+
77
+ // Flags used for the ObjectToDoubleFPURegister function.
78
+ enum ObjectToDoubleFlags {
79
+ // No special flags.
80
+ NO_OBJECT_TO_DOUBLE_FLAGS = 0,
81
+ // Object is known to be a non smi.
82
+ OBJECT_NOT_SMI = 1 << 0,
83
+ // Don't load NaNs or infinities, branch to the non number case instead.
84
+ AVOID_NANS_AND_INFINITIES = 1 << 1
85
+ };
86
+
87
+ // Allow programmer to use Branch Delay Slot of Branches, Jumps, Calls.
88
+ enum BranchDelaySlot {
89
+ USE_DELAY_SLOT,
90
+ PROTECT
91
+ };
92
+
93
+ // MacroAssembler implements a collection of frequently used macros.
94
+ class MacroAssembler: public Assembler {
95
+ public:
96
+ // The isolate parameter can be NULL if the macro assembler should
97
+ // not use isolate-dependent functionality. In this case, it's the
98
+ // responsibility of the caller to never invoke such function on the
99
+ // macro assembler.
100
+ MacroAssembler(Isolate* isolate, void* buffer, int size);
101
+
102
+ // Arguments macros.
103
+ #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2
104
+ #define COND_ARGS cond, r1, r2
105
+
106
+ // Prototypes.
107
+
108
+ // Prototypes for functions with no target (eg Ret()).
109
+ #define DECLARE_NOTARGET_PROTOTYPE(Name) \
110
+ void Name(BranchDelaySlot bd = PROTECT); \
111
+ void Name(COND_TYPED_ARGS, BranchDelaySlot bd = PROTECT); \
112
+ inline void Name(BranchDelaySlot bd, COND_TYPED_ARGS) { \
113
+ Name(COND_ARGS, bd); \
114
+ }
115
+
116
+ // Prototypes for functions with a target.
117
+
118
+ // Cases when relocation may be needed.
119
+ #define DECLARE_RELOC_PROTOTYPE(Name, target_type) \
120
+ void Name(target_type target, \
121
+ RelocInfo::Mode rmode, \
122
+ BranchDelaySlot bd = PROTECT); \
123
+ inline void Name(BranchDelaySlot bd, \
124
+ target_type target, \
125
+ RelocInfo::Mode rmode) { \
126
+ Name(target, rmode, bd); \
127
+ } \
128
+ void Name(target_type target, \
129
+ RelocInfo::Mode rmode, \
130
+ COND_TYPED_ARGS, \
131
+ BranchDelaySlot bd = PROTECT); \
132
+ inline void Name(BranchDelaySlot bd, \
133
+ target_type target, \
134
+ RelocInfo::Mode rmode, \
135
+ COND_TYPED_ARGS) { \
136
+ Name(target, rmode, COND_ARGS, bd); \
137
+ }
138
+
139
+ // Cases when relocation is not needed.
140
+ #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \
141
+ void Name(target_type target, BranchDelaySlot bd = PROTECT); \
142
+ inline void Name(BranchDelaySlot bd, target_type target) { \
143
+ Name(target, bd); \
144
+ } \
145
+ void Name(target_type target, \
146
+ COND_TYPED_ARGS, \
147
+ BranchDelaySlot bd = PROTECT); \
148
+ inline void Name(BranchDelaySlot bd, \
149
+ target_type target, \
150
+ COND_TYPED_ARGS) { \
151
+ Name(target, COND_ARGS, bd); \
152
+ }
153
+
154
+ // Target prototypes.
155
+
156
+ #define DECLARE_JUMP_CALL_PROTOTYPES(Name) \
157
+ DECLARE_NORELOC_PROTOTYPE(Name, Register) \
158
+ DECLARE_NORELOC_PROTOTYPE(Name, const Operand&) \
159
+ DECLARE_RELOC_PROTOTYPE(Name, byte*) \
160
+ DECLARE_RELOC_PROTOTYPE(Name, Handle<Code>)
161
+
162
+ #define DECLARE_BRANCH_PROTOTYPES(Name) \
163
+ DECLARE_NORELOC_PROTOTYPE(Name, Label*) \
164
+ DECLARE_NORELOC_PROTOTYPE(Name, int16_t)
165
+
166
+
167
+ DECLARE_JUMP_CALL_PROTOTYPES(Jump)
168
+ DECLARE_JUMP_CALL_PROTOTYPES(Call)
169
+
170
+ DECLARE_BRANCH_PROTOTYPES(Branch)
171
+ DECLARE_BRANCH_PROTOTYPES(BranchAndLink)
172
+
173
+ DECLARE_NOTARGET_PROTOTYPE(Ret)
174
+
175
+ #undef COND_TYPED_ARGS
176
+ #undef COND_ARGS
177
+ #undef DECLARE_NOTARGET_PROTOTYPE
178
+ #undef DECLARE_NORELOC_PROTOTYPE
179
+ #undef DECLARE_RELOC_PROTOTYPE
180
+ #undef DECLARE_JUMP_CALL_PROTOTYPES
181
+ #undef DECLARE_BRANCH_PROTOTYPES
182
+
183
+ void CallWithAstId(Handle<Code> code,
184
+ RelocInfo::Mode rmode,
185
+ unsigned ast_id,
186
+ Condition cond = al,
187
+ Register r1 = zero_reg,
188
+ const Operand& r2 = Operand(zero_reg));
189
+
190
+ int CallSize(Register reg);
191
+ int CallSize(Handle<Code> code, RelocInfo::Mode rmode);
192
+
193
+ // Emit code to discard a non-negative number of pointer-sized elements
194
+ // from the stack, clobbering only the sp register.
195
+ void Drop(int count,
196
+ Condition cond = cc_always,
197
+ Register reg = no_reg,
198
+ const Operand& op = Operand(no_reg));
199
+
200
+ void DropAndRet(int drop = 0,
201
+ Condition cond = cc_always,
202
+ Register reg = no_reg,
203
+ const Operand& op = Operand(no_reg));
204
+
205
+ // Swap two registers. If the scratch register is omitted then a slightly
206
+ // less efficient form using xor instead of mov is emitted.
207
+ void Swap(Register reg1, Register reg2, Register scratch = no_reg);
208
+
209
+ void Call(Label* target);
210
+
211
+ inline void Move(Register dst, Register src) {
212
+ if (!dst.is(src)) {
213
+ mov(dst, src);
214
+ }
215
+ }
216
+
217
+ inline void Move(FPURegister dst, FPURegister src) {
218
+ if (!dst.is(src)) {
219
+ mov_d(dst, src);
220
+ }
221
+ }
222
+
223
+ inline void Move(Register dst_low, Register dst_high, FPURegister src) {
224
+ mfc1(dst_low, src);
225
+ mfc1(dst_high, FPURegister::from_code(src.code() + 1));
226
+ }
227
+
228
+ inline void Move(FPURegister dst, Register src_low, Register src_high) {
229
+ mtc1(src_low, dst);
230
+ mtc1(src_high, FPURegister::from_code(dst.code() + 1));
231
+ }
232
+
233
+ // Jump unconditionally to given label.
234
+ // We NEED a nop in the branch delay slot, as it used by v8, for example in
235
+ // CodeGenerator::ProcessDeferred().
236
+ // Currently the branch delay slot is filled by the MacroAssembler.
237
+ // Use rather b(Label) for code generation.
238
+ void jmp(Label* L) {
239
+ Branch(L);
240
+ }
241
+
242
+ // Load an object from the root table.
243
+ void LoadRoot(Register destination,
244
+ Heap::RootListIndex index);
245
+ void LoadRoot(Register destination,
246
+ Heap::RootListIndex index,
247
+ Condition cond, Register src1, const Operand& src2);
248
+
249
+ // Store an object to the root table.
250
+ void StoreRoot(Register source,
251
+ Heap::RootListIndex index);
252
+ void StoreRoot(Register source,
253
+ Heap::RootListIndex index,
254
+ Condition cond, Register src1, const Operand& src2);
255
+
256
+
257
+ // Check if object is in new space.
258
+ // scratch can be object itself, but it will be clobbered.
259
+ void InNewSpace(Register object,
260
+ Register scratch,
261
+ Condition cc, // eq for new space, ne otherwise.
262
+ Label* branch);
263
+
264
+
265
+ // For the page containing |object| mark the region covering [address]
266
+ // dirty. The object address must be in the first 8K of an allocated page.
267
+ void RecordWriteHelper(Register object,
268
+ Register address,
269
+ Register scratch);
270
+
271
+ // For the page containing |object| mark the region covering
272
+ // [object+offset] dirty. The object address must be in the first 8K
273
+ // of an allocated page. The 'scratch' registers are used in the
274
+ // implementation and all 3 registers are clobbered by the
275
+ // operation, as well as the 'at' register. RecordWrite updates the
276
+ // write barrier even when storing smis.
277
+ void RecordWrite(Register object,
278
+ Operand offset,
279
+ Register scratch0,
280
+ Register scratch1);
281
+
282
+ // For the page containing |object| mark the region covering
283
+ // [address] dirty. The object address must be in the first 8K of an
284
+ // allocated page. All 3 registers are clobbered by the operation,
285
+ // as well as the ip register. RecordWrite updates the write barrier
286
+ // even when storing smis.
287
+ void RecordWrite(Register object,
288
+ Register address,
289
+ Register scratch);
290
+
291
+
292
+ // ---------------------------------------------------------------------------
293
+ // Inline caching support.
294
+
295
+ // Generate code for checking access rights - used for security checks
296
+ // on access to global objects across environments. The holder register
297
+ // is left untouched, whereas both scratch registers are clobbered.
298
+ void CheckAccessGlobalProxy(Register holder_reg,
299
+ Register scratch,
300
+ Label* miss);
301
+
302
+ inline void MarkCode(NopMarkerTypes type) {
303
+ nop(type);
304
+ }
305
+
306
+ // Check if the given instruction is a 'type' marker.
307
+ // ie. check if it is a sll zero_reg, zero_reg, <type> (referenced as
308
+ // nop(type)). These instructions are generated to mark special location in
309
+ // the code, like some special IC code.
310
+ static inline bool IsMarkedCode(Instr instr, int type) {
311
+ ASSERT((FIRST_IC_MARKER <= type) && (type < LAST_CODE_MARKER));
312
+ return IsNop(instr, type);
313
+ }
314
+
315
+
316
+ static inline int GetCodeMarker(Instr instr) {
317
+ uint32_t opcode = ((instr & kOpcodeMask));
318
+ uint32_t rt = ((instr & kRtFieldMask) >> kRtShift);
319
+ uint32_t rs = ((instr & kRsFieldMask) >> kRsShift);
320
+ uint32_t sa = ((instr & kSaFieldMask) >> kSaShift);
321
+
322
+ // Return <n> if we have a sll zero_reg, zero_reg, n
323
+ // else return -1.
324
+ bool sllzz = (opcode == SLL &&
325
+ rt == static_cast<uint32_t>(ToNumber(zero_reg)) &&
326
+ rs == static_cast<uint32_t>(ToNumber(zero_reg)));
327
+ int type =
328
+ (sllzz && FIRST_IC_MARKER <= sa && sa < LAST_CODE_MARKER) ? sa : -1;
329
+ ASSERT((type == -1) ||
330
+ ((FIRST_IC_MARKER <= type) && (type < LAST_CODE_MARKER)));
331
+ return type;
332
+ }
333
+
334
+
335
+
336
+ // ---------------------------------------------------------------------------
337
+ // Allocation support.
338
+
339
+ // Allocate an object in new space. The object_size is specified
340
+ // either in bytes or in words if the allocation flag SIZE_IN_WORDS
341
+ // is passed. If the new space is exhausted control continues at the
342
+ // gc_required label. The allocated object is returned in result. If
343
+ // the flag tag_allocated_object is true the result is tagged as as
344
+ // a heap object. All registers are clobbered also when control
345
+ // continues at the gc_required label.
346
+ void AllocateInNewSpace(int object_size,
347
+ Register result,
348
+ Register scratch1,
349
+ Register scratch2,
350
+ Label* gc_required,
351
+ AllocationFlags flags);
352
+ void AllocateInNewSpace(Register object_size,
353
+ Register result,
354
+ Register scratch1,
355
+ Register scratch2,
356
+ Label* gc_required,
357
+ AllocationFlags flags);
358
+
359
+ // Undo allocation in new space. The object passed and objects allocated after
360
+ // it will no longer be allocated. The caller must make sure that no pointers
361
+ // are left to the object(s) no longer allocated as they would be invalid when
362
+ // allocation is undone.
363
+ void UndoAllocationInNewSpace(Register object, Register scratch);
364
+
365
+
366
+ void AllocateTwoByteString(Register result,
367
+ Register length,
368
+ Register scratch1,
369
+ Register scratch2,
370
+ Register scratch3,
371
+ Label* gc_required);
372
+ void AllocateAsciiString(Register result,
373
+ Register length,
374
+ Register scratch1,
375
+ Register scratch2,
376
+ Register scratch3,
377
+ Label* gc_required);
378
+ void AllocateTwoByteConsString(Register result,
379
+ Register length,
380
+ Register scratch1,
381
+ Register scratch2,
382
+ Label* gc_required);
383
+ void AllocateAsciiConsString(Register result,
384
+ Register length,
385
+ Register scratch1,
386
+ Register scratch2,
387
+ Label* gc_required);
388
+
389
+ // Allocates a heap number or jumps to the gc_required label if the young
390
+ // space is full and a scavenge is needed. All registers are clobbered also
391
+ // when control continues at the gc_required label.
392
+ void AllocateHeapNumber(Register result,
393
+ Register scratch1,
394
+ Register scratch2,
395
+ Register heap_number_map,
396
+ Label* gc_required);
397
+ void AllocateHeapNumberWithValue(Register result,
398
+ FPURegister value,
399
+ Register scratch1,
400
+ Register scratch2,
401
+ Label* gc_required);
402
+
403
+ // ---------------------------------------------------------------------------
404
+ // Instruction macros.
405
+
406
+ #define DEFINE_INSTRUCTION(instr) \
407
+ void instr(Register rd, Register rs, const Operand& rt); \
408
+ void instr(Register rd, Register rs, Register rt) { \
409
+ instr(rd, rs, Operand(rt)); \
410
+ } \
411
+ void instr(Register rs, Register rt, int32_t j) { \
412
+ instr(rs, rt, Operand(j)); \
413
+ }
414
+
415
+ #define DEFINE_INSTRUCTION2(instr) \
416
+ void instr(Register rs, const Operand& rt); \
417
+ void instr(Register rs, Register rt) { \
418
+ instr(rs, Operand(rt)); \
419
+ } \
420
+ void instr(Register rs, int32_t j) { \
421
+ instr(rs, Operand(j)); \
422
+ }
423
+
424
+ DEFINE_INSTRUCTION(Addu);
425
+ DEFINE_INSTRUCTION(Subu);
426
+ DEFINE_INSTRUCTION(Mul);
427
+ DEFINE_INSTRUCTION2(Mult);
428
+ DEFINE_INSTRUCTION2(Multu);
429
+ DEFINE_INSTRUCTION2(Div);
430
+ DEFINE_INSTRUCTION2(Divu);
431
+
432
+ DEFINE_INSTRUCTION(And);
433
+ DEFINE_INSTRUCTION(Or);
434
+ DEFINE_INSTRUCTION(Xor);
435
+ DEFINE_INSTRUCTION(Nor);
436
+ DEFINE_INSTRUCTION2(Neg);
437
+
438
+ DEFINE_INSTRUCTION(Slt);
439
+ DEFINE_INSTRUCTION(Sltu);
440
+
441
+ // MIPS32 R2 instruction macro.
442
+ DEFINE_INSTRUCTION(Ror);
443
+
444
+ #undef DEFINE_INSTRUCTION
445
+ #undef DEFINE_INSTRUCTION2
446
+
447
+
448
+ // ---------------------------------------------------------------------------
449
+ // Pseudo-instructions.
450
+
451
+ void mov(Register rd, Register rt) { or_(rd, rt, zero_reg); }
452
+
453
+ // Load int32 in the rd register.
454
+ void li(Register rd, Operand j, bool gen2instr = false);
455
+ inline void li(Register rd, int32_t j, bool gen2instr = false) {
456
+ li(rd, Operand(j), gen2instr);
457
+ }
458
+ inline void li(Register dst, Handle<Object> value, bool gen2instr = false) {
459
+ li(dst, Operand(value), gen2instr);
460
+ }
461
+
462
+ // Exception-generating instructions and debugging support.
463
+ void stop(const char* msg);
464
+
465
+ // Push multiple registers on the stack.
466
+ // Registers are saved in numerical order, with higher numbered registers
467
+ // saved in higher memory addresses.
468
+ void MultiPush(RegList regs);
469
+ void MultiPushReversed(RegList regs);
470
+
471
+ // Lower case push() for compatibility with arch-independent code.
472
+ void push(Register src) {
473
+ Addu(sp, sp, Operand(-kPointerSize));
474
+ sw(src, MemOperand(sp, 0));
475
+ }
476
+
477
+ // Push two registers. Pushes leftmost register first (to highest address).
478
+ void Push(Register src1, Register src2) {
479
+ Subu(sp, sp, Operand(2 * kPointerSize));
480
+ sw(src1, MemOperand(sp, 1 * kPointerSize));
481
+ sw(src2, MemOperand(sp, 0 * kPointerSize));
482
+ }
483
+
484
+ // Push three registers. Pushes leftmost register first (to highest address).
485
+ void Push(Register src1, Register src2, Register src3) {
486
+ Subu(sp, sp, Operand(3 * kPointerSize));
487
+ sw(src1, MemOperand(sp, 2 * kPointerSize));
488
+ sw(src2, MemOperand(sp, 1 * kPointerSize));
489
+ sw(src3, MemOperand(sp, 0 * kPointerSize));
490
+ }
491
+
492
+ // Push four registers. Pushes leftmost register first (to highest address).
493
+ void Push(Register src1, Register src2, Register src3, Register src4) {
494
+ Subu(sp, sp, Operand(4 * kPointerSize));
495
+ sw(src1, MemOperand(sp, 3 * kPointerSize));
496
+ sw(src2, MemOperand(sp, 2 * kPointerSize));
497
+ sw(src3, MemOperand(sp, 1 * kPointerSize));
498
+ sw(src4, MemOperand(sp, 0 * kPointerSize));
499
+ }
500
+
501
+ void Push(Register src, Condition cond, Register tst1, Register tst2) {
502
+ // Since we don't have conditional execution we use a Branch.
503
+ Branch(3, cond, tst1, Operand(tst2));
504
+ Subu(sp, sp, Operand(kPointerSize));
505
+ sw(src, MemOperand(sp, 0));
506
+ }
507
+
508
+ // Pops multiple values from the stack and load them in the
509
+ // registers specified in regs. Pop order is the opposite as in MultiPush.
510
+ void MultiPop(RegList regs);
511
+ void MultiPopReversed(RegList regs);
512
+
513
+ // Lower case pop() for compatibility with arch-independent code.
514
+ void pop(Register dst) {
515
+ lw(dst, MemOperand(sp, 0));
516
+ Addu(sp, sp, Operand(kPointerSize));
517
+ }
518
+
519
+ // Pop two registers. Pops rightmost register first (from lower address).
520
+ void Pop(Register src1, Register src2) {
521
+ ASSERT(!src1.is(src2));
522
+ lw(src2, MemOperand(sp, 0 * kPointerSize));
523
+ lw(src1, MemOperand(sp, 1 * kPointerSize));
524
+ Addu(sp, sp, 2 * kPointerSize);
525
+ }
526
+
527
+ void Pop(uint32_t count = 1) {
528
+ Addu(sp, sp, Operand(count * kPointerSize));
529
+ }
530
+
531
+ // Push and pop the registers that can hold pointers, as defined by the
532
+ // RegList constant kSafepointSavedRegisters.
533
+ void PushSafepointRegisters();
534
+ void PopSafepointRegisters();
535
+ void PushSafepointRegistersAndDoubles();
536
+ void PopSafepointRegistersAndDoubles();
537
+ // Store value in register src in the safepoint stack slot for
538
+ // register dst.
539
+ void StoreToSafepointRegisterSlot(Register src, Register dst);
540
+ void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst);
541
+ // Load the value of the src register from its safepoint stack slot
542
+ // into register dst.
543
+ void LoadFromSafepointRegisterSlot(Register dst, Register src);
544
+
545
+ // MIPS32 R2 instruction macro.
546
+ void Ins(Register rt, Register rs, uint16_t pos, uint16_t size);
547
+ void Ext(Register rt, Register rs, uint16_t pos, uint16_t size);
548
+
549
+ // Convert unsigned word to double.
550
+ void Cvt_d_uw(FPURegister fd, FPURegister fs);
551
+ void Cvt_d_uw(FPURegister fd, Register rs);
552
+
553
+ // Convert double to unsigned word.
554
+ void Trunc_uw_d(FPURegister fd, FPURegister fs);
555
+ void Trunc_uw_d(FPURegister fd, Register rs);
556
+
557
+ // Convert the HeapNumber pointed to by source to a 32bits signed integer
558
+ // dest. If the HeapNumber does not fit into a 32bits signed integer branch
559
+ // to not_int32 label. If FPU is available double_scratch is used but not
560
+ // scratch2.
561
+ void ConvertToInt32(Register source,
562
+ Register dest,
563
+ Register scratch,
564
+ Register scratch2,
565
+ FPURegister double_scratch,
566
+ Label *not_int32);
567
+
568
+ // Helper for EmitECMATruncate.
569
+ // This will truncate a floating-point value outside of the singed 32bit
570
+ // integer range to a 32bit signed integer.
571
+ // Expects the double value loaded in input_high and input_low.
572
+ // Exits with the answer in 'result'.
573
+ // Note that this code does not work for values in the 32bit range!
574
+ void EmitOutOfInt32RangeTruncate(Register result,
575
+ Register input_high,
576
+ Register input_low,
577
+ Register scratch);
578
+
579
+ // -------------------------------------------------------------------------
580
+ // Activation frames.
581
+
582
+ void EnterInternalFrame() { EnterFrame(StackFrame::INTERNAL); }
583
+ void LeaveInternalFrame() { LeaveFrame(StackFrame::INTERNAL); }
584
+
585
+ void EnterConstructFrame() { EnterFrame(StackFrame::CONSTRUCT); }
586
+ void LeaveConstructFrame() { LeaveFrame(StackFrame::CONSTRUCT); }
587
+
588
+ // Enter exit frame.
589
+ // argc - argument count to be dropped by LeaveExitFrame.
590
+ // save_doubles - saves FPU registers on stack, currently disabled.
591
+ // stack_space - extra stack space.
592
+ void EnterExitFrame(bool save_doubles,
593
+ int stack_space = 0);
594
+
595
+ // Leave the current exit frame.
596
+ void LeaveExitFrame(bool save_doubles, Register arg_count);
597
+
598
+ // Get the actual activation frame alignment for target environment.
599
+ static int ActivationFrameAlignment();
600
+
601
+ // Make sure the stack is aligned. Only emits code in debug mode.
602
+ void AssertStackIsAligned();
603
+
604
+ void LoadContext(Register dst, int context_chain_length);
605
+
606
+ void LoadGlobalFunction(int index, Register function);
607
+
608
+ // Load the initial map from the global function. The registers
609
+ // function and map can be the same, function is then overwritten.
610
+ void LoadGlobalFunctionInitialMap(Register function,
611
+ Register map,
612
+ Register scratch);
613
+
614
+ // -------------------------------------------------------------------------
615
+ // JavaScript invokes.
616
+
617
+ // Setup call kind marking in t1. The method takes t1 as an
618
+ // explicit first parameter to make the code more readable at the
619
+ // call sites.
620
+ void SetCallKind(Register dst, CallKind kind);
621
+
622
+ // Invoke the JavaScript function code by either calling or jumping.
623
+ void InvokeCode(Register code,
624
+ const ParameterCount& expected,
625
+ const ParameterCount& actual,
626
+ InvokeFlag flag,
627
+ const CallWrapper& call_wrapper = NullCallWrapper(),
628
+ CallKind call_kind = CALL_AS_METHOD);
629
+
630
+ void InvokeCode(Handle<Code> code,
631
+ const ParameterCount& expected,
632
+ const ParameterCount& actual,
633
+ RelocInfo::Mode rmode,
634
+ InvokeFlag flag,
635
+ CallKind call_kind = CALL_AS_METHOD);
636
+
637
+ // Invoke the JavaScript function in the given register. Changes the
638
+ // current context to the context in the function before invoking.
639
+ void InvokeFunction(Register function,
640
+ const ParameterCount& actual,
641
+ InvokeFlag flag,
642
+ const CallWrapper& call_wrapper = NullCallWrapper(),
643
+ CallKind call_kind = CALL_AS_METHOD);
644
+
645
+ void InvokeFunction(JSFunction* function,
646
+ const ParameterCount& actual,
647
+ InvokeFlag flag);
648
+
649
+
650
+ void IsObjectJSObjectType(Register heap_object,
651
+ Register map,
652
+ Register scratch,
653
+ Label* fail);
654
+
655
+ void IsInstanceJSObjectType(Register map,
656
+ Register scratch,
657
+ Label* fail);
658
+
659
+ void IsObjectJSStringType(Register object,
660
+ Register scratch,
661
+ Label* fail);
662
+
663
+ #ifdef ENABLE_DEBUGGER_SUPPORT
664
+ // -------------------------------------------------------------------------
665
+ // Debugger Support.
666
+
667
+ void DebugBreak();
668
+ #endif
669
+
670
+
671
+ // -------------------------------------------------------------------------
672
+ // Exception handling.
673
+
674
+ // Push a new try handler and link into try handler chain.
675
+ // The return address must be passed in register ra.
676
+ // Clobber t0, t1, t2.
677
+ void PushTryHandler(CodeLocation try_location, HandlerType type);
678
+
679
+ // Unlink the stack handler on top of the stack from the try handler chain.
680
+ // Must preserve the result register.
681
+ void PopTryHandler();
682
+
683
+ // Passes thrown value (in v0) to the handler of top of the try handler chain.
684
+ void Throw(Register value);
685
+
686
+ // Propagates an uncatchable exception to the top of the current JS stack's
687
+ // handler chain.
688
+ void ThrowUncatchable(UncatchableExceptionType type, Register value);
689
+
690
+ // Copies a fixed number of fields of heap objects from src to dst.
691
+ void CopyFields(Register dst, Register src, RegList temps, int field_count);
692
+
693
+ // Copies a number of bytes from src to dst. All registers are clobbered. On
694
+ // exit src and dst will point to the place just after where the last byte was
695
+ // read or written and length will be zero.
696
+ void CopyBytes(Register src,
697
+ Register dst,
698
+ Register length,
699
+ Register scratch);
700
+
701
+ // -------------------------------------------------------------------------
702
+ // Support functions.
703
+
704
+ // Try to get function prototype of a function and puts the value in
705
+ // the result register. Checks that the function really is a
706
+ // function and jumps to the miss label if the fast checks fail. The
707
+ // function register will be untouched; the other registers may be
708
+ // clobbered.
709
+ void TryGetFunctionPrototype(Register function,
710
+ Register result,
711
+ Register scratch,
712
+ Label* miss);
713
+
714
+ void GetObjectType(Register function,
715
+ Register map,
716
+ Register type_reg);
717
+
718
+ // Check if the map of an object is equal to a specified map (either
719
+ // given directly or as an index into the root list) and branch to
720
+ // label if not. Skip the smi check if not required (object is known
721
+ // to be a heap object).
722
+ void CheckMap(Register obj,
723
+ Register scratch,
724
+ Handle<Map> map,
725
+ Label* fail,
726
+ SmiCheckType smi_check_type);
727
+
728
+ void CheckMap(Register obj,
729
+ Register scratch,
730
+ Heap::RootListIndex index,
731
+ Label* fail,
732
+ SmiCheckType smi_check_type);
733
+
734
+ // Check if the map of an object is equal to a specified map and branch to a
735
+ // specified target if equal. Skip the smi check if not required (object is
736
+ // known to be a heap object)
737
+ void DispatchMap(Register obj,
738
+ Register scratch,
739
+ Handle<Map> map,
740
+ Handle<Code> success,
741
+ SmiCheckType smi_check_type);
742
+
743
+ // Generates code for reporting that an illegal operation has
744
+ // occurred.
745
+ void IllegalOperation(int num_arguments);
746
+
747
+ // Picks out an array index from the hash field.
748
+ // Register use:
749
+ // hash - holds the index's hash. Clobbered.
750
+ // index - holds the overwritten index on exit.
751
+ void IndexFromHash(Register hash, Register index);
752
+
753
+ // Get the number of least significant bits from a register.
754
+ void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits);
755
+ void GetLeastBitsFromInt32(Register dst, Register src, int mun_least_bits);
756
+
757
+ // Load the value of a number object into a FPU double register. If the
758
+ // object is not a number a jump to the label not_number is performed
759
+ // and the FPU double register is unchanged.
760
+ void ObjectToDoubleFPURegister(
761
+ Register object,
762
+ FPURegister value,
763
+ Register scratch1,
764
+ Register scratch2,
765
+ Register heap_number_map,
766
+ Label* not_number,
767
+ ObjectToDoubleFlags flags = NO_OBJECT_TO_DOUBLE_FLAGS);
768
+
769
+ // Load the value of a smi object into a FPU double register. The register
770
+ // scratch1 can be the same register as smi in which case smi will hold the
771
+ // untagged value afterwards.
772
+ void SmiToDoubleFPURegister(Register smi,
773
+ FPURegister value,
774
+ Register scratch1);
775
+
776
+ // -------------------------------------------------------------------------
777
+ // Overflow handling functions.
778
+ // Usage: first call the appropriate arithmetic function, then call one of the
779
+ // jump functions with the overflow_dst register as the second parameter.
780
+
781
+ void AdduAndCheckForOverflow(Register dst,
782
+ Register left,
783
+ Register right,
784
+ Register overflow_dst,
785
+ Register scratch = at);
786
+
787
+ void SubuAndCheckForOverflow(Register dst,
788
+ Register left,
789
+ Register right,
790
+ Register overflow_dst,
791
+ Register scratch = at);
792
+
793
+ void BranchOnOverflow(Label* label,
794
+ Register overflow_check,
795
+ BranchDelaySlot bd = PROTECT) {
796
+ Branch(label, lt, overflow_check, Operand(zero_reg), bd);
797
+ }
798
+
799
+ void BranchOnNoOverflow(Label* label,
800
+ Register overflow_check,
801
+ BranchDelaySlot bd = PROTECT) {
802
+ Branch(label, ge, overflow_check, Operand(zero_reg), bd);
803
+ }
804
+
805
+ void RetOnOverflow(Register overflow_check, BranchDelaySlot bd = PROTECT) {
806
+ Ret(lt, overflow_check, Operand(zero_reg), bd);
807
+ }
808
+
809
+ void RetOnNoOverflow(Register overflow_check, BranchDelaySlot bd = PROTECT) {
810
+ Ret(ge, overflow_check, Operand(zero_reg), bd);
811
+ }
812
+
813
+ // -------------------------------------------------------------------------
814
+ // Runtime calls.
815
+
816
+ // Call a code stub.
817
+ void CallStub(CodeStub* stub, Condition cond = cc_always,
818
+ Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg));
819
+
820
+ // Call a code stub and return the code object called. Try to generate
821
+ // the code if necessary. Do not perform a GC but instead return a retry
822
+ // after GC failure.
823
+ MUST_USE_RESULT MaybeObject* TryCallStub(CodeStub* stub,
824
+ Condition cond = cc_always,
825
+ Register r1 = zero_reg,
826
+ const Operand& r2 =
827
+ Operand(zero_reg));
828
+
829
+ // Tail call a code stub (jump).
830
+ void TailCallStub(CodeStub* stub);
831
+
832
+ // Tail call a code stub (jump) and return the code object called. Try to
833
+ // generate the code if necessary. Do not perform a GC but instead return
834
+ // a retry after GC failure.
835
+ MUST_USE_RESULT MaybeObject* TryTailCallStub(CodeStub* stub,
836
+ Condition cond = cc_always,
837
+ Register r1 = zero_reg,
838
+ const Operand& r2 =
839
+ Operand(zero_reg));
840
+
841
+ void CallJSExitStub(CodeStub* stub);
842
+
843
+ // Call a runtime routine.
844
+ void CallRuntime(const Runtime::Function* f, int num_arguments);
845
+ void CallRuntimeSaveDoubles(Runtime::FunctionId id);
846
+
847
+ // Convenience function: Same as above, but takes the fid instead.
848
+ void CallRuntime(Runtime::FunctionId fid, int num_arguments);
849
+
850
+ // Convenience function: call an external reference.
851
+ void CallExternalReference(const ExternalReference& ext,
852
+ int num_arguments);
853
+
854
+ // Tail call of a runtime routine (jump).
855
+ // Like JumpToExternalReference, but also takes care of passing the number
856
+ // of parameters.
857
+ void TailCallExternalReference(const ExternalReference& ext,
858
+ int num_arguments,
859
+ int result_size);
860
+
861
+ // Tail call of a runtime routine (jump). Try to generate the code if
862
+ // necessary. Do not perform a GC but instead return a retry after GC
863
+ // failure.
864
+ MUST_USE_RESULT MaybeObject* TryTailCallExternalReference(
865
+ const ExternalReference& ext, int num_arguments, int result_size);
866
+
867
+ // Convenience function: tail call a runtime routine (jump).
868
+ void TailCallRuntime(Runtime::FunctionId fid,
869
+ int num_arguments,
870
+ int result_size);
871
+
872
+ // Before calling a C-function from generated code, align arguments on stack
873
+ // and add space for the four mips argument slots.
874
+ // After aligning the frame, non-register arguments must be stored on the
875
+ // stack, after the argument-slots using helper: CFunctionArgumentOperand().
876
+ // The argument count assumes all arguments are word sized.
877
+ // Some compilers/platforms require the stack to be aligned when calling
878
+ // C++ code.
879
+ // Needs a scratch register to do some arithmetic. This register will be
880
+ // trashed.
881
+ void PrepareCallCFunction(int num_arguments, Register scratch);
882
+
883
+ // Arguments 1-4 are placed in registers a0 thru a3 respectively.
884
+ // Arguments 5..n are stored to stack using following:
885
+ // sw(t0, CFunctionArgumentOperand(5));
886
+
887
+ // Calls a C function and cleans up the space for arguments allocated
888
+ // by PrepareCallCFunction. The called function is not allowed to trigger a
889
+ // garbage collection, since that might move the code and invalidate the
890
+ // return address (unless this is somehow accounted for by the called
891
+ // function).
892
+ void CallCFunction(ExternalReference function, int num_arguments);
893
+ void CallCFunction(Register function, Register scratch, int num_arguments);
894
+ void GetCFunctionDoubleResult(const DoubleRegister dst);
895
+
896
+ // There are two ways of passing double arguments on MIPS, depending on
897
+ // whether soft or hard floating point ABI is used. These functions
898
+ // abstract parameter passing for the three different ways we call
899
+ // C functions from generated code.
900
+ void SetCallCDoubleArguments(DoubleRegister dreg);
901
+ void SetCallCDoubleArguments(DoubleRegister dreg1, DoubleRegister dreg2);
902
+ void SetCallCDoubleArguments(DoubleRegister dreg, Register reg);
903
+
904
+ // Calls an API function. Allocates HandleScope, extracts returned value
905
+ // from handle and propagates exceptions. Restores context.
906
+ MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function,
907
+ int stack_space);
908
+
909
+ // Jump to the builtin routine.
910
+ void JumpToExternalReference(const ExternalReference& builtin);
911
+
912
+ MaybeObject* TryJumpToExternalReference(const ExternalReference& ext);
913
+
914
+ // Invoke specified builtin JavaScript function. Adds an entry to
915
+ // the unresolved list if the name does not resolve.
916
+ void InvokeBuiltin(Builtins::JavaScript id,
917
+ InvokeFlag flag,
918
+ const CallWrapper& call_wrapper = NullCallWrapper());
919
+
920
+ // Store the code object for the given builtin in the target register and
921
+ // setup the function in a1.
922
+ void GetBuiltinEntry(Register target, Builtins::JavaScript id);
923
+
924
+ // Store the function for the given builtin in the target register.
925
+ void GetBuiltinFunction(Register target, Builtins::JavaScript id);
926
+
927
+ struct Unresolved {
928
+ int pc;
929
+ uint32_t flags; // See Bootstrapper::FixupFlags decoders/encoders.
930
+ const char* name;
931
+ };
932
+
933
+ Handle<Object> CodeObject() {
934
+ ASSERT(!code_object_.is_null());
935
+ return code_object_;
936
+ }
937
+
938
+ // -------------------------------------------------------------------------
939
+ // StatsCounter support.
940
+
941
+ void SetCounter(StatsCounter* counter, int value,
942
+ Register scratch1, Register scratch2);
943
+ void IncrementCounter(StatsCounter* counter, int value,
944
+ Register scratch1, Register scratch2);
945
+ void DecrementCounter(StatsCounter* counter, int value,
946
+ Register scratch1, Register scratch2);
947
+
948
+
949
+ // -------------------------------------------------------------------------
950
+ // Debugging.
951
+
952
+ // Calls Abort(msg) if the condition cc is not satisfied.
953
+ // Use --debug_code to enable.
954
+ void Assert(Condition cc, const char* msg, Register rs, Operand rt);
955
+ void AssertRegisterIsRoot(Register reg, Heap::RootListIndex index);
956
+ void AssertFastElements(Register elements);
957
+
958
+ // Like Assert(), but always enabled.
959
+ void Check(Condition cc, const char* msg, Register rs, Operand rt);
960
+
961
+ // Print a message to stdout and abort execution.
962
+ void Abort(const char* msg);
963
+
964
+ // Verify restrictions about code generated in stubs.
965
+ void set_generating_stub(bool value) { generating_stub_ = value; }
966
+ bool generating_stub() { return generating_stub_; }
967
+ void set_allow_stub_calls(bool value) { allow_stub_calls_ = value; }
968
+ bool allow_stub_calls() { return allow_stub_calls_; }
969
+
970
+ // ---------------------------------------------------------------------------
971
+ // Number utilities.
972
+
973
+ // Check whether the value of reg is a power of two and not zero. If not
974
+ // control continues at the label not_power_of_two. If reg is a power of two
975
+ // the register scratch contains the value of (reg - 1) when control falls
976
+ // through.
977
+ void JumpIfNotPowerOfTwoOrZero(Register reg,
978
+ Register scratch,
979
+ Label* not_power_of_two_or_zero);
980
+
981
+ // -------------------------------------------------------------------------
982
+ // Smi utilities.
983
+
984
+ // Try to convert int32 to smi. If the value is to large, preserve
985
+ // the original value and jump to not_a_smi. Destroys scratch and
986
+ // sets flags.
987
+ // This is only used by crankshaft atm so it is unimplemented on MIPS.
988
+ void TrySmiTag(Register reg, Label* not_a_smi, Register scratch) {
989
+ UNIMPLEMENTED_MIPS();
990
+ }
991
+
992
+ void SmiTag(Register reg) {
993
+ Addu(reg, reg, reg);
994
+ }
995
+
996
+ void SmiTag(Register dst, Register src) {
997
+ Addu(dst, src, src);
998
+ }
999
+
1000
+ void SmiUntag(Register reg) {
1001
+ sra(reg, reg, kSmiTagSize);
1002
+ }
1003
+
1004
+ void SmiUntag(Register dst, Register src) {
1005
+ sra(dst, src, kSmiTagSize);
1006
+ }
1007
+
1008
+ // Jump the register contains a smi.
1009
+ inline void JumpIfSmi(Register value, Label* smi_label,
1010
+ Register scratch = at) {
1011
+ ASSERT_EQ(0, kSmiTag);
1012
+ andi(scratch, value, kSmiTagMask);
1013
+ Branch(smi_label, eq, scratch, Operand(zero_reg));
1014
+ }
1015
+
1016
+ // Jump if the register contains a non-smi.
1017
+ inline void JumpIfNotSmi(Register value, Label* not_smi_label,
1018
+ Register scratch = at) {
1019
+ ASSERT_EQ(0, kSmiTag);
1020
+ andi(scratch, value, kSmiTagMask);
1021
+ Branch(not_smi_label, ne, scratch, Operand(zero_reg));
1022
+ }
1023
+
1024
+ // Jump if either of the registers contain a non-smi.
1025
+ void JumpIfNotBothSmi(Register reg1, Register reg2, Label* on_not_both_smi);
1026
+ // Jump if either of the registers contain a smi.
1027
+ void JumpIfEitherSmi(Register reg1, Register reg2, Label* on_either_smi);
1028
+
1029
+ // Abort execution if argument is a smi. Used in debug code.
1030
+ void AbortIfSmi(Register object);
1031
+ void AbortIfNotSmi(Register object);
1032
+
1033
+ // Abort execution if argument is a string. Used in debug code.
1034
+ void AbortIfNotString(Register object);
1035
+
1036
+ // Abort execution if argument is not the root value with the given index.
1037
+ void AbortIfNotRootValue(Register src,
1038
+ Heap::RootListIndex root_value_index,
1039
+ const char* message);
1040
+
1041
+ // ---------------------------------------------------------------------------
1042
+ // HeapNumber utilities.
1043
+
1044
+ void JumpIfNotHeapNumber(Register object,
1045
+ Register heap_number_map,
1046
+ Register scratch,
1047
+ Label* on_not_heap_number);
1048
+
1049
+ // -------------------------------------------------------------------------
1050
+ // String utilities.
1051
+
1052
+ // Checks if both instance types are sequential ASCII strings and jumps to
1053
+ // label if either is not.
1054
+ void JumpIfBothInstanceTypesAreNotSequentialAscii(
1055
+ Register first_object_instance_type,
1056
+ Register second_object_instance_type,
1057
+ Register scratch1,
1058
+ Register scratch2,
1059
+ Label* failure);
1060
+
1061
+ // Check if instance type is sequential ASCII string and jump to label if
1062
+ // it is not.
1063
+ void JumpIfInstanceTypeIsNotSequentialAscii(Register type,
1064
+ Register scratch,
1065
+ Label* failure);
1066
+
1067
+ // Test that both first and second are sequential ASCII strings.
1068
+ // Assume that they are non-smis.
1069
+ void JumpIfNonSmisNotBothSequentialAsciiStrings(Register first,
1070
+ Register second,
1071
+ Register scratch1,
1072
+ Register scratch2,
1073
+ Label* failure);
1074
+
1075
+ // Test that both first and second are sequential ASCII strings.
1076
+ // Check that they are non-smis.
1077
+ void JumpIfNotBothSequentialAsciiStrings(Register first,
1078
+ Register second,
1079
+ Register scratch1,
1080
+ Register scratch2,
1081
+ Label* failure);
1082
+
1083
+ void LoadInstanceDescriptors(Register map, Register descriptors);
1084
+
1085
+ private:
1086
+ void CallCFunctionHelper(Register function,
1087
+ ExternalReference function_reference,
1088
+ Register scratch,
1089
+ int num_arguments);
1090
+
1091
+ void Jump(intptr_t target, RelocInfo::Mode rmode,
1092
+ BranchDelaySlot bd = PROTECT);
1093
+ void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1094
+ Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1095
+ BranchDelaySlot bd = PROTECT);
1096
+ void Call(intptr_t target, RelocInfo::Mode rmode,
1097
+ BranchDelaySlot bd = PROTECT);
1098
+ void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = cc_always,
1099
+ Register r1 = zero_reg, const Operand& r2 = Operand(zero_reg),
1100
+ BranchDelaySlot bd = PROTECT);
1101
+
1102
+ // Helper functions for generating invokes.
1103
+ void InvokePrologue(const ParameterCount& expected,
1104
+ const ParameterCount& actual,
1105
+ Handle<Code> code_constant,
1106
+ Register code_reg,
1107
+ Label* done,
1108
+ InvokeFlag flag,
1109
+ const CallWrapper& call_wrapper = NullCallWrapper(),
1110
+ CallKind call_kind = CALL_AS_METHOD);
1111
+
1112
+ // Get the code for the given builtin. Returns if able to resolve
1113
+ // the function in the 'resolved' flag.
1114
+ Handle<Code> ResolveBuiltin(Builtins::JavaScript id, bool* resolved);
1115
+
1116
+ // Activation support.
1117
+ void EnterFrame(StackFrame::Type type);
1118
+ void LeaveFrame(StackFrame::Type type);
1119
+
1120
+ void InitializeNewString(Register string,
1121
+ Register length,
1122
+ Heap::RootListIndex map_index,
1123
+ Register scratch1,
1124
+ Register scratch2);
1125
+
1126
+ // Compute memory operands for safepoint stack slots.
1127
+ static int SafepointRegisterStackIndex(int reg_code);
1128
+ MemOperand SafepointRegisterSlot(Register reg);
1129
+ MemOperand SafepointRegistersAndDoublesSlot(Register reg);
1130
+
1131
+ bool generating_stub_;
1132
+ bool allow_stub_calls_;
1133
+ // This handle will be patched with the code object on installation.
1134
+ Handle<Object> code_object_;
1135
+
1136
+ // Needs access to SafepointRegisterStackIndex for optimized frame
1137
+ // traversal.
1138
+ friend class OptimizedFrame;
1139
+ };
1140
+
1141
+
1142
+ // The code patcher is used to patch (typically) small parts of code e.g. for
1143
+ // debugging and other types of instrumentation. When using the code patcher
1144
+ // the exact number of bytes specified must be emitted. It is not legal to emit
1145
+ // relocation information. If any of these constraints are violated it causes
1146
+ // an assertion to fail.
1147
+ class CodePatcher {
1148
+ public:
1149
+ CodePatcher(byte* address, int instructions);
1150
+ virtual ~CodePatcher();
1151
+
1152
+ // Macro assembler to emit code.
1153
+ MacroAssembler* masm() { return &masm_; }
1154
+
1155
+ // Emit an instruction directly.
1156
+ void Emit(Instr instr);
1157
+
1158
+ // Emit an address directly.
1159
+ void Emit(Address addr);
1160
+
1161
+ // Change the condition part of an instruction leaving the rest of the current
1162
+ // instruction unchanged.
1163
+ void ChangeBranchCondition(Condition cond);
1164
+
1165
+ private:
1166
+ byte* address_; // The address of the code being patched.
1167
+ int instructions_; // Number of instructions of the expected patch size.
1168
+ int size_; // Number of bytes of the expected patch size.
1169
+ MacroAssembler masm_; // Macro assembler used to generate the code.
1170
+ };
1171
+
1172
+
1173
+ // -----------------------------------------------------------------------------
1174
+ // Static helper functions.
1175
+
1176
+ static MemOperand ContextOperand(Register context, int index) {
1177
+ return MemOperand(context, Context::SlotOffset(index));
1178
+ }
1179
+
1180
+
1181
+ static inline MemOperand GlobalObjectOperand() {
1182
+ return ContextOperand(cp, Context::GLOBAL_INDEX);
1183
+ }
1184
+
1185
+
1186
+ // Generate a MemOperand for loading a field from an object.
1187
+ static inline MemOperand FieldMemOperand(Register object, int offset) {
1188
+ return MemOperand(object, offset - kHeapObjectTag);
1189
+ }
1190
+
1191
+
1192
+ // Generate a MemOperand for storing arguments 5..N on the stack
1193
+ // when calling CallCFunction().
1194
+ static inline MemOperand CFunctionArgumentOperand(int index) {
1195
+ ASSERT(index > StandardFrameConstants::kCArgSlotCount);
1196
+ // Argument 5 takes the slot just past the four Arg-slots.
1197
+ int offset =
1198
+ (index - 5) * kPointerSize + StandardFrameConstants::kCArgsSlotsSize;
1199
+ return MemOperand(sp, offset);
1200
+ }
1201
+
1202
+
1203
+ #ifdef GENERATED_CODE_COVERAGE
1204
+ #define CODE_COVERAGE_STRINGIFY(x) #x
1205
+ #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1206
+ #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1207
+ #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1208
+ #else
1209
+ #define ACCESS_MASM(masm) masm->
1210
+ #endif
1211
+
1212
+ } } // namespace v8::internal
1213
+
1214
+ #endif // V8_MIPS_MACRO_ASSEMBLER_MIPS_H_