libv8 3.3.10.4 → 3.5.10.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. data/lib/libv8/scons/CHANGES.txt +24 -231
  2. data/lib/libv8/scons/LICENSE.txt +1 -1
  3. data/lib/libv8/scons/MANIFEST +0 -1
  4. data/lib/libv8/scons/PKG-INFO +1 -1
  5. data/lib/libv8/scons/README.txt +9 -9
  6. data/lib/libv8/scons/RELEASE.txt +75 -77
  7. data/lib/libv8/scons/engine/SCons/Action.py +6 -22
  8. data/lib/libv8/scons/engine/SCons/Builder.py +2 -2
  9. data/lib/libv8/scons/engine/SCons/CacheDir.py +2 -2
  10. data/lib/libv8/scons/engine/SCons/Debug.py +2 -2
  11. data/lib/libv8/scons/engine/SCons/Defaults.py +10 -24
  12. data/lib/libv8/scons/engine/SCons/Environment.py +19 -118
  13. data/lib/libv8/scons/engine/SCons/Errors.py +2 -2
  14. data/lib/libv8/scons/engine/SCons/Executor.py +2 -2
  15. data/lib/libv8/scons/engine/SCons/Job.py +2 -2
  16. data/lib/libv8/scons/engine/SCons/Memoize.py +2 -2
  17. data/lib/libv8/scons/engine/SCons/Node/Alias.py +2 -2
  18. data/lib/libv8/scons/engine/SCons/Node/FS.py +121 -281
  19. data/lib/libv8/scons/engine/SCons/Node/Python.py +2 -2
  20. data/lib/libv8/scons/engine/SCons/Node/__init__.py +5 -6
  21. data/lib/libv8/scons/engine/SCons/Options/BoolOption.py +2 -2
  22. data/lib/libv8/scons/engine/SCons/Options/EnumOption.py +2 -2
  23. data/lib/libv8/scons/engine/SCons/Options/ListOption.py +2 -2
  24. data/lib/libv8/scons/engine/SCons/Options/PackageOption.py +2 -2
  25. data/lib/libv8/scons/engine/SCons/Options/PathOption.py +2 -2
  26. data/lib/libv8/scons/engine/SCons/Options/__init__.py +2 -2
  27. data/lib/libv8/scons/engine/SCons/PathList.py +2 -2
  28. data/lib/libv8/scons/engine/SCons/Platform/__init__.py +2 -2
  29. data/lib/libv8/scons/engine/SCons/Platform/aix.py +2 -2
  30. data/lib/libv8/scons/engine/SCons/Platform/cygwin.py +2 -2
  31. data/lib/libv8/scons/engine/SCons/Platform/darwin.py +3 -27
  32. data/lib/libv8/scons/engine/SCons/Platform/hpux.py +2 -2
  33. data/lib/libv8/scons/engine/SCons/Platform/irix.py +2 -2
  34. data/lib/libv8/scons/engine/SCons/Platform/os2.py +2 -2
  35. data/lib/libv8/scons/engine/SCons/Platform/posix.py +2 -2
  36. data/lib/libv8/scons/engine/SCons/Platform/sunos.py +2 -2
  37. data/lib/libv8/scons/engine/SCons/Platform/win32.py +2 -2
  38. data/lib/libv8/scons/engine/SCons/SConf.py +2 -2
  39. data/lib/libv8/scons/engine/SCons/SConsign.py +3 -9
  40. data/lib/libv8/scons/engine/SCons/Scanner/C.py +2 -2
  41. data/lib/libv8/scons/engine/SCons/Scanner/D.py +2 -2
  42. data/lib/libv8/scons/engine/SCons/Scanner/Dir.py +2 -2
  43. data/lib/libv8/scons/engine/SCons/Scanner/Fortran.py +2 -2
  44. data/lib/libv8/scons/engine/SCons/Scanner/IDL.py +2 -2
  45. data/lib/libv8/scons/engine/SCons/Scanner/LaTeX.py +2 -5
  46. data/lib/libv8/scons/engine/SCons/Scanner/Prog.py +2 -2
  47. data/lib/libv8/scons/engine/SCons/Scanner/RC.py +3 -3
  48. data/lib/libv8/scons/engine/SCons/Scanner/__init__.py +2 -2
  49. data/lib/libv8/scons/engine/SCons/Script/Interactive.py +2 -2
  50. data/lib/libv8/scons/engine/SCons/Script/Main.py +11 -82
  51. data/lib/libv8/scons/engine/SCons/Script/SConsOptions.py +5 -5
  52. data/lib/libv8/scons/engine/SCons/Script/SConscript.py +2 -2
  53. data/lib/libv8/scons/engine/SCons/Script/__init__.py +2 -2
  54. data/lib/libv8/scons/engine/SCons/Sig.py +2 -2
  55. data/lib/libv8/scons/engine/SCons/Subst.py +2 -2
  56. data/lib/libv8/scons/engine/SCons/Taskmaster.py +2 -10
  57. data/lib/libv8/scons/engine/SCons/Tool/386asm.py +2 -2
  58. data/lib/libv8/scons/engine/SCons/Tool/BitKeeper.py +2 -2
  59. data/lib/libv8/scons/engine/SCons/Tool/CVS.py +2 -2
  60. data/lib/libv8/scons/engine/SCons/Tool/FortranCommon.py +2 -19
  61. data/lib/libv8/scons/engine/SCons/Tool/JavaCommon.py +2 -2
  62. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/__init__.py +2 -2
  63. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/arch.py +2 -2
  64. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/common.py +2 -2
  65. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/netframework.py +2 -2
  66. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/sdk.py +2 -2
  67. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vc.py +6 -9
  68. data/lib/libv8/scons/engine/SCons/Tool/MSCommon/vs.py +2 -29
  69. data/lib/libv8/scons/engine/SCons/Tool/Perforce.py +2 -2
  70. data/lib/libv8/scons/engine/SCons/Tool/PharLapCommon.py +2 -2
  71. data/lib/libv8/scons/engine/SCons/Tool/RCS.py +2 -2
  72. data/lib/libv8/scons/engine/SCons/Tool/SCCS.py +2 -2
  73. data/lib/libv8/scons/engine/SCons/Tool/Subversion.py +2 -2
  74. data/lib/libv8/scons/engine/SCons/Tool/__init__.py +3 -3
  75. data/lib/libv8/scons/engine/SCons/Tool/aixc++.py +2 -2
  76. data/lib/libv8/scons/engine/SCons/Tool/aixcc.py +2 -2
  77. data/lib/libv8/scons/engine/SCons/Tool/aixf77.py +2 -2
  78. data/lib/libv8/scons/engine/SCons/Tool/aixlink.py +2 -2
  79. data/lib/libv8/scons/engine/SCons/Tool/applelink.py +2 -2
  80. data/lib/libv8/scons/engine/SCons/Tool/ar.py +2 -2
  81. data/lib/libv8/scons/engine/SCons/Tool/as.py +2 -2
  82. data/lib/libv8/scons/engine/SCons/Tool/bcc32.py +2 -2
  83. data/lib/libv8/scons/engine/SCons/Tool/c++.py +2 -2
  84. data/lib/libv8/scons/engine/SCons/Tool/cc.py +2 -2
  85. data/lib/libv8/scons/engine/SCons/Tool/cvf.py +2 -2
  86. data/lib/libv8/scons/engine/SCons/Tool/default.py +2 -2
  87. data/lib/libv8/scons/engine/SCons/Tool/dmd.py +7 -24
  88. data/lib/libv8/scons/engine/SCons/Tool/dvi.py +2 -2
  89. data/lib/libv8/scons/engine/SCons/Tool/dvipdf.py +2 -3
  90. data/lib/libv8/scons/engine/SCons/Tool/dvips.py +2 -3
  91. data/lib/libv8/scons/engine/SCons/Tool/f77.py +2 -2
  92. data/lib/libv8/scons/engine/SCons/Tool/f90.py +2 -2
  93. data/lib/libv8/scons/engine/SCons/Tool/f95.py +2 -2
  94. data/lib/libv8/scons/engine/SCons/Tool/filesystem.py +2 -2
  95. data/lib/libv8/scons/engine/SCons/Tool/fortran.py +2 -2
  96. data/lib/libv8/scons/engine/SCons/Tool/g++.py +2 -2
  97. data/lib/libv8/scons/engine/SCons/Tool/g77.py +2 -2
  98. data/lib/libv8/scons/engine/SCons/Tool/gas.py +2 -2
  99. data/lib/libv8/scons/engine/SCons/Tool/gcc.py +2 -2
  100. data/lib/libv8/scons/engine/SCons/Tool/gfortran.py +3 -3
  101. data/lib/libv8/scons/engine/SCons/Tool/gnulink.py +3 -2
  102. data/lib/libv8/scons/engine/SCons/Tool/gs.py +2 -2
  103. data/lib/libv8/scons/engine/SCons/Tool/hpc++.py +2 -2
  104. data/lib/libv8/scons/engine/SCons/Tool/hpcc.py +2 -2
  105. data/lib/libv8/scons/engine/SCons/Tool/hplink.py +2 -2
  106. data/lib/libv8/scons/engine/SCons/Tool/icc.py +2 -2
  107. data/lib/libv8/scons/engine/SCons/Tool/icl.py +2 -2
  108. data/lib/libv8/scons/engine/SCons/Tool/ifl.py +2 -2
  109. data/lib/libv8/scons/engine/SCons/Tool/ifort.py +2 -2
  110. data/lib/libv8/scons/engine/SCons/Tool/ilink.py +2 -2
  111. data/lib/libv8/scons/engine/SCons/Tool/ilink32.py +2 -2
  112. data/lib/libv8/scons/engine/SCons/Tool/install.py +3 -57
  113. data/lib/libv8/scons/engine/SCons/Tool/intelc.py +25 -65
  114. data/lib/libv8/scons/engine/SCons/Tool/ipkg.py +2 -2
  115. data/lib/libv8/scons/engine/SCons/Tool/jar.py +3 -9
  116. data/lib/libv8/scons/engine/SCons/Tool/javac.py +2 -2
  117. data/lib/libv8/scons/engine/SCons/Tool/javah.py +2 -2
  118. data/lib/libv8/scons/engine/SCons/Tool/latex.py +2 -3
  119. data/lib/libv8/scons/engine/SCons/Tool/lex.py +2 -2
  120. data/lib/libv8/scons/engine/SCons/Tool/link.py +5 -6
  121. data/lib/libv8/scons/engine/SCons/Tool/linkloc.py +2 -2
  122. data/lib/libv8/scons/engine/SCons/Tool/m4.py +2 -2
  123. data/lib/libv8/scons/engine/SCons/Tool/masm.py +2 -2
  124. data/lib/libv8/scons/engine/SCons/Tool/midl.py +2 -2
  125. data/lib/libv8/scons/engine/SCons/Tool/mingw.py +10 -31
  126. data/lib/libv8/scons/engine/SCons/Tool/mslib.py +2 -2
  127. data/lib/libv8/scons/engine/SCons/Tool/mslink.py +9 -61
  128. data/lib/libv8/scons/engine/SCons/Tool/mssdk.py +2 -2
  129. data/lib/libv8/scons/engine/SCons/Tool/msvc.py +11 -21
  130. data/lib/libv8/scons/engine/SCons/Tool/msvs.py +59 -477
  131. data/lib/libv8/scons/engine/SCons/Tool/mwcc.py +2 -2
  132. data/lib/libv8/scons/engine/SCons/Tool/mwld.py +2 -2
  133. data/lib/libv8/scons/engine/SCons/Tool/nasm.py +2 -2
  134. data/lib/libv8/scons/engine/SCons/Tool/packaging/__init__.py +2 -2
  135. data/lib/libv8/scons/engine/SCons/Tool/packaging/ipk.py +2 -2
  136. data/lib/libv8/scons/engine/SCons/Tool/packaging/msi.py +2 -2
  137. data/lib/libv8/scons/engine/SCons/Tool/packaging/rpm.py +2 -2
  138. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_tarbz2.py +2 -2
  139. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_targz.py +2 -2
  140. data/lib/libv8/scons/engine/SCons/Tool/packaging/src_zip.py +2 -2
  141. data/lib/libv8/scons/engine/SCons/Tool/packaging/tarbz2.py +2 -2
  142. data/lib/libv8/scons/engine/SCons/Tool/packaging/targz.py +2 -2
  143. data/lib/libv8/scons/engine/SCons/Tool/packaging/zip.py +2 -2
  144. data/lib/libv8/scons/engine/SCons/Tool/pdf.py +2 -2
  145. data/lib/libv8/scons/engine/SCons/Tool/pdflatex.py +2 -3
  146. data/lib/libv8/scons/engine/SCons/Tool/pdftex.py +2 -3
  147. data/lib/libv8/scons/engine/SCons/Tool/qt.py +2 -2
  148. data/lib/libv8/scons/engine/SCons/Tool/rmic.py +3 -9
  149. data/lib/libv8/scons/engine/SCons/Tool/rpcgen.py +2 -2
  150. data/lib/libv8/scons/engine/SCons/Tool/rpm.py +2 -2
  151. data/lib/libv8/scons/engine/SCons/Tool/sgiar.py +2 -2
  152. data/lib/libv8/scons/engine/SCons/Tool/sgic++.py +2 -2
  153. data/lib/libv8/scons/engine/SCons/Tool/sgicc.py +2 -2
  154. data/lib/libv8/scons/engine/SCons/Tool/sgilink.py +3 -2
  155. data/lib/libv8/scons/engine/SCons/Tool/sunar.py +2 -2
  156. data/lib/libv8/scons/engine/SCons/Tool/sunc++.py +2 -2
  157. data/lib/libv8/scons/engine/SCons/Tool/suncc.py +2 -2
  158. data/lib/libv8/scons/engine/SCons/Tool/sunf77.py +2 -2
  159. data/lib/libv8/scons/engine/SCons/Tool/sunf90.py +2 -2
  160. data/lib/libv8/scons/engine/SCons/Tool/sunf95.py +2 -2
  161. data/lib/libv8/scons/engine/SCons/Tool/sunlink.py +3 -2
  162. data/lib/libv8/scons/engine/SCons/Tool/swig.py +5 -6
  163. data/lib/libv8/scons/engine/SCons/Tool/tar.py +2 -2
  164. data/lib/libv8/scons/engine/SCons/Tool/tex.py +43 -96
  165. data/lib/libv8/scons/engine/SCons/Tool/textfile.py +2 -2
  166. data/lib/libv8/scons/engine/SCons/Tool/tlib.py +2 -2
  167. data/lib/libv8/scons/engine/SCons/Tool/wix.py +2 -2
  168. data/lib/libv8/scons/engine/SCons/Tool/yacc.py +2 -12
  169. data/lib/libv8/scons/engine/SCons/Tool/zip.py +2 -2
  170. data/lib/libv8/scons/engine/SCons/Util.py +3 -3
  171. data/lib/libv8/scons/engine/SCons/Variables/BoolVariable.py +2 -2
  172. data/lib/libv8/scons/engine/SCons/Variables/EnumVariable.py +3 -3
  173. data/lib/libv8/scons/engine/SCons/Variables/ListVariable.py +2 -2
  174. data/lib/libv8/scons/engine/SCons/Variables/PackageVariable.py +2 -2
  175. data/lib/libv8/scons/engine/SCons/Variables/PathVariable.py +2 -2
  176. data/lib/libv8/scons/engine/SCons/Variables/__init__.py +2 -2
  177. data/lib/libv8/scons/engine/SCons/Warnings.py +2 -2
  178. data/lib/libv8/scons/engine/SCons/__init__.py +6 -6
  179. data/lib/libv8/scons/engine/SCons/compat/__init__.py +2 -2
  180. data/lib/libv8/scons/engine/SCons/compat/_scons_builtins.py +2 -2
  181. data/lib/libv8/scons/engine/SCons/compat/_scons_collections.py +2 -2
  182. data/lib/libv8/scons/engine/SCons/compat/_scons_dbm.py +2 -2
  183. data/lib/libv8/scons/engine/SCons/compat/_scons_hashlib.py +2 -2
  184. data/lib/libv8/scons/engine/SCons/compat/_scons_io.py +2 -2
  185. data/lib/libv8/scons/engine/SCons/cpp.py +2 -2
  186. data/lib/libv8/scons/engine/SCons/dblite.py +1 -4
  187. data/lib/libv8/scons/engine/SCons/exitfuncs.py +2 -2
  188. data/lib/libv8/scons/scons-time.1 +3 -3
  189. data/lib/libv8/scons/scons.1 +1164 -1170
  190. data/lib/libv8/scons/sconsign.1 +3 -3
  191. data/lib/libv8/scons/script/scons +22 -22
  192. data/lib/libv8/scons/script/scons-time +2 -2
  193. data/lib/libv8/scons/script/scons.bat +4 -7
  194. data/lib/libv8/scons/script/sconsign +20 -21
  195. data/lib/libv8/scons/setup.cfg +1 -0
  196. data/lib/libv8/scons/setup.py +40 -38
  197. data/lib/libv8/v8/.gitignore +1 -1
  198. data/lib/libv8/v8/AUTHORS +2 -0
  199. data/lib/libv8/v8/ChangeLog +387 -0
  200. data/lib/libv8/v8/Makefile +171 -0
  201. data/lib/libv8/v8/SConstruct +124 -51
  202. data/lib/libv8/v8/build/README.txt +31 -14
  203. data/lib/libv8/v8/build/all.gyp +11 -4
  204. data/lib/libv8/v8/build/armu.gypi +6 -2
  205. data/lib/libv8/v8/build/common.gypi +240 -94
  206. data/lib/libv8/v8/build/gyp_v8 +32 -4
  207. data/lib/libv8/v8/build/standalone.gypi +200 -0
  208. data/lib/libv8/v8/include/v8-debug.h +0 -0
  209. data/lib/libv8/v8/include/v8-profiler.h +8 -11
  210. data/lib/libv8/v8/include/v8.h +191 -108
  211. data/lib/libv8/v8/preparser/SConscript +2 -2
  212. data/lib/libv8/v8/preparser/preparser-process.cc +3 -3
  213. data/lib/libv8/v8/preparser/preparser.gyp +42 -0
  214. data/lib/libv8/v8/src/SConscript +33 -8
  215. data/lib/libv8/v8/src/accessors.cc +77 -43
  216. data/lib/libv8/v8/src/api.cc +393 -191
  217. data/lib/libv8/v8/src/api.h +4 -8
  218. data/lib/libv8/v8/src/apinatives.js +15 -3
  219. data/lib/libv8/v8/src/arguments.h +8 -0
  220. data/lib/libv8/v8/src/arm/assembler-arm.cc +120 -120
  221. data/lib/libv8/v8/src/arm/assembler-arm.h +92 -43
  222. data/lib/libv8/v8/src/arm/builtins-arm.cc +32 -39
  223. data/lib/libv8/v8/src/arm/code-stubs-arm.cc +572 -351
  224. data/lib/libv8/v8/src/arm/code-stubs-arm.h +8 -77
  225. data/lib/libv8/v8/src/arm/codegen-arm.h +0 -2
  226. data/lib/libv8/v8/src/arm/deoptimizer-arm.cc +50 -30
  227. data/lib/libv8/v8/src/arm/disasm-arm.cc +1 -1
  228. data/lib/libv8/v8/src/arm/frames-arm.h +9 -5
  229. data/lib/libv8/v8/src/arm/full-codegen-arm.cc +331 -432
  230. data/lib/libv8/v8/src/arm/ic-arm.cc +192 -124
  231. data/lib/libv8/v8/src/arm/lithium-arm.cc +216 -232
  232. data/lib/libv8/v8/src/arm/lithium-arm.h +106 -259
  233. data/lib/libv8/v8/src/arm/lithium-codegen-arm.cc +633 -642
  234. data/lib/libv8/v8/src/arm/lithium-codegen-arm.h +4 -4
  235. data/lib/libv8/v8/src/arm/lithium-gap-resolver-arm.cc +1 -3
  236. data/lib/libv8/v8/src/arm/macro-assembler-arm.cc +260 -185
  237. data/lib/libv8/v8/src/arm/macro-assembler-arm.h +45 -25
  238. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.cc +25 -13
  239. data/lib/libv8/v8/src/arm/regexp-macro-assembler-arm.h +3 -0
  240. data/lib/libv8/v8/src/arm/stub-cache-arm.cc +413 -226
  241. data/lib/libv8/v8/src/array.js +38 -18
  242. data/lib/libv8/v8/src/assembler.cc +12 -5
  243. data/lib/libv8/v8/src/assembler.h +15 -9
  244. data/lib/libv8/v8/src/ast-inl.h +34 -25
  245. data/lib/libv8/v8/src/ast.cc +141 -72
  246. data/lib/libv8/v8/src/ast.h +255 -181
  247. data/lib/libv8/v8/src/bignum.cc +3 -4
  248. data/lib/libv8/v8/src/bootstrapper.cc +55 -11
  249. data/lib/libv8/v8/src/bootstrapper.h +3 -2
  250. data/lib/libv8/v8/src/builtins.cc +8 -2
  251. data/lib/libv8/v8/src/builtins.h +4 -0
  252. data/lib/libv8/v8/src/cached-powers.cc +8 -4
  253. data/lib/libv8/v8/src/checks.h +3 -3
  254. data/lib/libv8/v8/src/code-stubs.cc +173 -28
  255. data/lib/libv8/v8/src/code-stubs.h +104 -148
  256. data/lib/libv8/v8/src/codegen.cc +8 -8
  257. data/lib/libv8/v8/src/compilation-cache.cc +2 -47
  258. data/lib/libv8/v8/src/compilation-cache.h +0 -10
  259. data/lib/libv8/v8/src/compiler.cc +27 -16
  260. data/lib/libv8/v8/src/compiler.h +13 -18
  261. data/lib/libv8/v8/src/contexts.cc +107 -72
  262. data/lib/libv8/v8/src/contexts.h +70 -34
  263. data/lib/libv8/v8/src/conversions-inl.h +572 -14
  264. data/lib/libv8/v8/src/conversions.cc +9 -707
  265. data/lib/libv8/v8/src/conversions.h +23 -12
  266. data/lib/libv8/v8/src/cpu-profiler-inl.h +2 -19
  267. data/lib/libv8/v8/src/cpu-profiler.cc +4 -21
  268. data/lib/libv8/v8/src/cpu-profiler.h +8 -17
  269. data/lib/libv8/v8/src/d8-debug.cc +5 -3
  270. data/lib/libv8/v8/src/d8-debug.h +6 -7
  271. data/lib/libv8/v8/src/d8-posix.cc +1 -10
  272. data/lib/libv8/v8/src/d8.cc +721 -219
  273. data/lib/libv8/v8/src/d8.gyp +37 -12
  274. data/lib/libv8/v8/src/d8.h +141 -19
  275. data/lib/libv8/v8/src/d8.js +17 -8
  276. data/lib/libv8/v8/src/date.js +16 -5
  277. data/lib/libv8/v8/src/dateparser-inl.h +242 -39
  278. data/lib/libv8/v8/src/dateparser.cc +38 -4
  279. data/lib/libv8/v8/src/dateparser.h +170 -28
  280. data/lib/libv8/v8/src/debug-agent.cc +5 -3
  281. data/lib/libv8/v8/src/debug-agent.h +11 -7
  282. data/lib/libv8/v8/src/debug-debugger.js +65 -34
  283. data/lib/libv8/v8/src/debug.cc +30 -60
  284. data/lib/libv8/v8/src/debug.h +5 -3
  285. data/lib/libv8/v8/src/deoptimizer.cc +227 -10
  286. data/lib/libv8/v8/src/deoptimizer.h +133 -9
  287. data/lib/libv8/v8/src/disassembler.cc +22 -14
  288. data/lib/libv8/v8/src/diy-fp.cc +4 -3
  289. data/lib/libv8/v8/src/diy-fp.h +3 -3
  290. data/lib/libv8/v8/src/elements.cc +634 -0
  291. data/lib/libv8/v8/src/elements.h +95 -0
  292. data/lib/libv8/v8/src/execution.cc +5 -21
  293. data/lib/libv8/v8/src/extensions/experimental/break-iterator.cc +3 -1
  294. data/lib/libv8/v8/src/extensions/experimental/break-iterator.h +1 -1
  295. data/lib/libv8/v8/src/extensions/experimental/collator.cc +6 -2
  296. data/lib/libv8/v8/src/extensions/experimental/collator.h +1 -2
  297. data/lib/libv8/v8/src/extensions/experimental/datetime-format.cc +384 -0
  298. data/lib/libv8/v8/src/extensions/experimental/datetime-format.h +83 -0
  299. data/lib/libv8/v8/src/extensions/experimental/experimental.gyp +18 -7
  300. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.cc +12 -16
  301. data/lib/libv8/v8/src/extensions/experimental/i18n-extension.h +1 -1
  302. data/lib/libv8/v8/src/extensions/experimental/i18n-js2c.py +126 -0
  303. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.cc +3 -4
  304. data/lib/libv8/v8/src/extensions/experimental/i18n-locale.h +1 -1
  305. data/lib/libv8/v8/src/{shell.h → extensions/experimental/i18n-natives.h} +8 -20
  306. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.cc +45 -1
  307. data/lib/libv8/v8/src/extensions/experimental/i18n-utils.h +21 -1
  308. data/lib/libv8/v8/src/extensions/experimental/i18n.js +211 -11
  309. data/lib/libv8/v8/src/extensions/experimental/language-matcher.cc +4 -3
  310. data/lib/libv8/v8/src/extensions/experimental/language-matcher.h +1 -1
  311. data/lib/libv8/v8/src/extensions/experimental/number-format.cc +374 -0
  312. data/lib/libv8/v8/src/extensions/experimental/number-format.h +71 -0
  313. data/lib/libv8/v8/src/factory.cc +89 -18
  314. data/lib/libv8/v8/src/factory.h +36 -8
  315. data/lib/libv8/v8/src/flag-definitions.h +11 -44
  316. data/lib/libv8/v8/src/frames-inl.h +8 -1
  317. data/lib/libv8/v8/src/frames.cc +39 -3
  318. data/lib/libv8/v8/src/frames.h +10 -3
  319. data/lib/libv8/v8/src/full-codegen.cc +311 -293
  320. data/lib/libv8/v8/src/full-codegen.h +183 -143
  321. data/lib/libv8/v8/src/func-name-inferrer.cc +29 -15
  322. data/lib/libv8/v8/src/func-name-inferrer.h +19 -9
  323. data/lib/libv8/v8/src/gdb-jit.cc +658 -55
  324. data/lib/libv8/v8/src/gdb-jit.h +6 -2
  325. data/lib/libv8/v8/src/global-handles.cc +368 -312
  326. data/lib/libv8/v8/src/global-handles.h +29 -36
  327. data/lib/libv8/v8/src/globals.h +3 -1
  328. data/lib/libv8/v8/src/handles.cc +43 -69
  329. data/lib/libv8/v8/src/handles.h +21 -16
  330. data/lib/libv8/v8/src/heap-inl.h +11 -13
  331. data/lib/libv8/v8/src/heap-profiler.cc +0 -999
  332. data/lib/libv8/v8/src/heap-profiler.h +0 -303
  333. data/lib/libv8/v8/src/heap.cc +366 -141
  334. data/lib/libv8/v8/src/heap.h +87 -26
  335. data/lib/libv8/v8/src/hydrogen-instructions.cc +192 -81
  336. data/lib/libv8/v8/src/hydrogen-instructions.h +711 -482
  337. data/lib/libv8/v8/src/hydrogen.cc +1146 -629
  338. data/lib/libv8/v8/src/hydrogen.h +100 -64
  339. data/lib/libv8/v8/src/ia32/assembler-ia32.cc +19 -0
  340. data/lib/libv8/v8/src/ia32/assembler-ia32.h +15 -2
  341. data/lib/libv8/v8/src/ia32/builtins-ia32.cc +34 -39
  342. data/lib/libv8/v8/src/ia32/code-stubs-ia32.cc +675 -377
  343. data/lib/libv8/v8/src/ia32/code-stubs-ia32.h +8 -69
  344. data/lib/libv8/v8/src/ia32/codegen-ia32.cc +1 -0
  345. data/lib/libv8/v8/src/ia32/codegen-ia32.h +0 -2
  346. data/lib/libv8/v8/src/ia32/cpu-ia32.cc +3 -2
  347. data/lib/libv8/v8/src/ia32/deoptimizer-ia32.cc +28 -3
  348. data/lib/libv8/v8/src/ia32/disasm-ia32.cc +21 -10
  349. data/lib/libv8/v8/src/ia32/frames-ia32.h +6 -5
  350. data/lib/libv8/v8/src/ia32/full-codegen-ia32.cc +459 -465
  351. data/lib/libv8/v8/src/ia32/ic-ia32.cc +196 -147
  352. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.cc +575 -650
  353. data/lib/libv8/v8/src/ia32/lithium-codegen-ia32.h +19 -21
  354. data/lib/libv8/v8/src/ia32/lithium-gap-resolver-ia32.cc +7 -2
  355. data/lib/libv8/v8/src/ia32/lithium-ia32.cc +261 -256
  356. data/lib/libv8/v8/src/ia32/lithium-ia32.h +234 -335
  357. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.cc +224 -67
  358. data/lib/libv8/v8/src/ia32/macro-assembler-ia32.h +63 -19
  359. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.cc +22 -8
  360. data/lib/libv8/v8/src/ia32/regexp-macro-assembler-ia32.h +3 -0
  361. data/lib/libv8/v8/src/ia32/stub-cache-ia32.cc +380 -239
  362. data/lib/libv8/v8/src/ic.cc +198 -234
  363. data/lib/libv8/v8/src/ic.h +32 -30
  364. data/lib/libv8/v8/src/interpreter-irregexp.cc +6 -4
  365. data/lib/libv8/v8/src/isolate.cc +112 -95
  366. data/lib/libv8/v8/src/isolate.h +55 -71
  367. data/lib/libv8/v8/src/json-parser.h +486 -48
  368. data/lib/libv8/v8/src/json.js +28 -23
  369. data/lib/libv8/v8/src/jsregexp.cc +163 -208
  370. data/lib/libv8/v8/src/jsregexp.h +0 -1
  371. data/lib/libv8/v8/src/lithium-allocator-inl.h +29 -27
  372. data/lib/libv8/v8/src/lithium-allocator.cc +22 -17
  373. data/lib/libv8/v8/src/lithium-allocator.h +8 -8
  374. data/lib/libv8/v8/src/lithium.cc +16 -11
  375. data/lib/libv8/v8/src/lithium.h +31 -34
  376. data/lib/libv8/v8/src/liveedit.cc +111 -15
  377. data/lib/libv8/v8/src/liveedit.h +3 -4
  378. data/lib/libv8/v8/src/liveobjectlist.cc +116 -80
  379. data/lib/libv8/v8/src/liveobjectlist.h +2 -2
  380. data/lib/libv8/v8/src/log-inl.h +0 -4
  381. data/lib/libv8/v8/src/log-utils.cc +25 -143
  382. data/lib/libv8/v8/src/log-utils.h +13 -92
  383. data/lib/libv8/v8/src/log.cc +26 -249
  384. data/lib/libv8/v8/src/log.h +6 -17
  385. data/lib/libv8/v8/src/macros.py +9 -6
  386. data/lib/libv8/v8/src/mark-compact.cc +276 -56
  387. data/lib/libv8/v8/src/mark-compact.h +20 -0
  388. data/lib/libv8/v8/src/messages.js +93 -39
  389. data/lib/libv8/v8/src/mips/assembler-mips-inl.h +9 -3
  390. data/lib/libv8/v8/src/mips/assembler-mips.cc +297 -189
  391. data/lib/libv8/v8/src/mips/assembler-mips.h +121 -54
  392. data/lib/libv8/v8/src/mips/builtins-mips.cc +23 -24
  393. data/lib/libv8/v8/src/mips/code-stubs-mips.cc +484 -263
  394. data/lib/libv8/v8/src/mips/code-stubs-mips.h +8 -83
  395. data/lib/libv8/v8/src/mips/codegen-mips.h +0 -2
  396. data/lib/libv8/v8/src/mips/constants-mips.h +37 -11
  397. data/lib/libv8/v8/src/mips/deoptimizer-mips.cc +6 -1
  398. data/lib/libv8/v8/src/mips/frames-mips.h +8 -7
  399. data/lib/libv8/v8/src/mips/full-codegen-mips.cc +258 -419
  400. data/lib/libv8/v8/src/mips/ic-mips.cc +181 -121
  401. data/lib/libv8/v8/src/mips/macro-assembler-mips.cc +640 -382
  402. data/lib/libv8/v8/src/mips/macro-assembler-mips.h +94 -89
  403. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.cc +23 -10
  404. data/lib/libv8/v8/src/mips/regexp-macro-assembler-mips.h +6 -1
  405. data/lib/libv8/v8/src/mips/simulator-mips.cc +249 -49
  406. data/lib/libv8/v8/src/mips/simulator-mips.h +25 -1
  407. data/lib/libv8/v8/src/mips/stub-cache-mips.cc +373 -161
  408. data/lib/libv8/v8/src/mirror-debugger.js +55 -8
  409. data/lib/libv8/v8/src/misc-intrinsics.h +89 -0
  410. data/lib/libv8/v8/src/mksnapshot.cc +36 -4
  411. data/lib/libv8/v8/src/natives.h +5 -2
  412. data/lib/libv8/v8/src/objects-debug.cc +73 -6
  413. data/lib/libv8/v8/src/objects-inl.h +529 -164
  414. data/lib/libv8/v8/src/objects-printer.cc +67 -12
  415. data/lib/libv8/v8/src/objects-visiting.cc +13 -2
  416. data/lib/libv8/v8/src/objects-visiting.h +41 -1
  417. data/lib/libv8/v8/src/objects.cc +2200 -1177
  418. data/lib/libv8/v8/src/objects.h +912 -283
  419. data/lib/libv8/v8/src/parser.cc +566 -371
  420. data/lib/libv8/v8/src/parser.h +35 -33
  421. data/lib/libv8/v8/src/platform-cygwin.cc +10 -25
  422. data/lib/libv8/v8/src/platform-freebsd.cc +4 -29
  423. data/lib/libv8/v8/src/platform-linux.cc +60 -57
  424. data/lib/libv8/v8/src/platform-macos.cc +4 -27
  425. data/lib/libv8/v8/src/platform-nullos.cc +3 -16
  426. data/lib/libv8/v8/src/platform-openbsd.cc +247 -85
  427. data/lib/libv8/v8/src/platform-posix.cc +43 -1
  428. data/lib/libv8/v8/src/platform-solaris.cc +151 -112
  429. data/lib/libv8/v8/src/platform-tls.h +1 -1
  430. data/lib/libv8/v8/src/platform-win32.cc +65 -39
  431. data/lib/libv8/v8/src/platform.h +17 -14
  432. data/lib/libv8/v8/src/preparse-data-format.h +2 -2
  433. data/lib/libv8/v8/src/preparse-data.h +8 -2
  434. data/lib/libv8/v8/src/preparser-api.cc +2 -18
  435. data/lib/libv8/v8/src/preparser.cc +106 -65
  436. data/lib/libv8/v8/src/preparser.h +26 -5
  437. data/lib/libv8/v8/src/prettyprinter.cc +25 -43
  438. data/lib/libv8/v8/src/profile-generator-inl.h +0 -4
  439. data/lib/libv8/v8/src/profile-generator.cc +213 -34
  440. data/lib/libv8/v8/src/profile-generator.h +9 -9
  441. data/lib/libv8/v8/src/property.h +1 -0
  442. data/lib/libv8/v8/src/proxy.js +74 -4
  443. data/lib/libv8/v8/src/regexp-macro-assembler.cc +10 -6
  444. data/lib/libv8/v8/src/regexp.js +16 -11
  445. data/lib/libv8/v8/src/rewriter.cc +24 -133
  446. data/lib/libv8/v8/src/runtime-profiler.cc +27 -151
  447. data/lib/libv8/v8/src/runtime-profiler.h +5 -31
  448. data/lib/libv8/v8/src/runtime.cc +1450 -681
  449. data/lib/libv8/v8/src/runtime.h +47 -31
  450. data/lib/libv8/v8/src/runtime.js +2 -1
  451. data/lib/libv8/v8/src/scanner-base.cc +358 -220
  452. data/lib/libv8/v8/src/scanner-base.h +30 -138
  453. data/lib/libv8/v8/src/scanner.cc +0 -18
  454. data/lib/libv8/v8/src/scanner.h +0 -15
  455. data/lib/libv8/v8/src/scopeinfo.cc +3 -1
  456. data/lib/libv8/v8/src/scopeinfo.h +1 -6
  457. data/lib/libv8/v8/src/scopes.cc +243 -253
  458. data/lib/libv8/v8/src/scopes.h +58 -109
  459. data/lib/libv8/v8/src/serialize.cc +12 -54
  460. data/lib/libv8/v8/src/serialize.h +47 -0
  461. data/lib/libv8/v8/src/small-pointer-list.h +25 -0
  462. data/lib/libv8/v8/src/spaces-inl.h +4 -50
  463. data/lib/libv8/v8/src/spaces.cc +64 -131
  464. data/lib/libv8/v8/src/spaces.h +19 -70
  465. data/lib/libv8/v8/src/string-stream.cc +3 -1
  466. data/lib/libv8/v8/src/string.js +10 -6
  467. data/lib/libv8/v8/src/strtod.cc +7 -3
  468. data/lib/libv8/v8/src/stub-cache.cc +59 -129
  469. data/lib/libv8/v8/src/stub-cache.h +42 -54
  470. data/lib/libv8/v8/src/third_party/valgrind/valgrind.h +1447 -1339
  471. data/lib/libv8/v8/src/token.cc +4 -4
  472. data/lib/libv8/v8/src/token.h +6 -5
  473. data/lib/libv8/v8/src/type-info.cc +173 -129
  474. data/lib/libv8/v8/src/type-info.h +40 -22
  475. data/lib/libv8/v8/src/utils.cc +25 -304
  476. data/lib/libv8/v8/src/utils.h +118 -3
  477. data/lib/libv8/v8/src/v8-counters.h +3 -6
  478. data/lib/libv8/v8/src/v8.cc +34 -27
  479. data/lib/libv8/v8/src/v8.h +7 -7
  480. data/lib/libv8/v8/src/v8conversions.cc +129 -0
  481. data/lib/libv8/v8/src/v8conversions.h +60 -0
  482. data/lib/libv8/v8/src/v8globals.h +15 -6
  483. data/lib/libv8/v8/src/v8natives.js +300 -78
  484. data/lib/libv8/v8/src/v8threads.cc +14 -6
  485. data/lib/libv8/v8/src/v8threads.h +4 -1
  486. data/lib/libv8/v8/src/v8utils.cc +360 -0
  487. data/lib/libv8/v8/src/v8utils.h +17 -66
  488. data/lib/libv8/v8/src/variables.cc +7 -12
  489. data/lib/libv8/v8/src/variables.h +12 -10
  490. data/lib/libv8/v8/src/version.cc +2 -2
  491. data/lib/libv8/v8/src/vm-state-inl.h +0 -41
  492. data/lib/libv8/v8/src/vm-state.h +0 -11
  493. data/lib/libv8/v8/src/weakmap.js +103 -0
  494. data/lib/libv8/v8/src/x64/assembler-x64.h +6 -3
  495. data/lib/libv8/v8/src/x64/builtins-x64.cc +25 -22
  496. data/lib/libv8/v8/src/x64/code-stubs-x64.cc +523 -250
  497. data/lib/libv8/v8/src/x64/code-stubs-x64.h +8 -71
  498. data/lib/libv8/v8/src/x64/codegen-x64.cc +1 -0
  499. data/lib/libv8/v8/src/x64/codegen-x64.h +0 -2
  500. data/lib/libv8/v8/src/x64/cpu-x64.cc +2 -1
  501. data/lib/libv8/v8/src/x64/deoptimizer-x64.cc +40 -8
  502. data/lib/libv8/v8/src/x64/disasm-x64.cc +12 -10
  503. data/lib/libv8/v8/src/x64/frames-x64.h +7 -6
  504. data/lib/libv8/v8/src/x64/full-codegen-x64.cc +310 -415
  505. data/lib/libv8/v8/src/x64/ic-x64.cc +180 -117
  506. data/lib/libv8/v8/src/x64/lithium-codegen-x64.cc +411 -523
  507. data/lib/libv8/v8/src/x64/lithium-codegen-x64.h +11 -6
  508. data/lib/libv8/v8/src/x64/lithium-x64.cc +191 -216
  509. data/lib/libv8/v8/src/x64/lithium-x64.h +112 -263
  510. data/lib/libv8/v8/src/x64/macro-assembler-x64.cc +177 -61
  511. data/lib/libv8/v8/src/x64/macro-assembler-x64.h +23 -7
  512. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.cc +21 -9
  513. data/lib/libv8/v8/src/x64/regexp-macro-assembler-x64.h +6 -0
  514. data/lib/libv8/v8/src/x64/stub-cache-x64.cc +273 -107
  515. data/lib/libv8/v8/src/zone.cc +31 -22
  516. data/lib/libv8/v8/src/zone.h +12 -6
  517. data/lib/libv8/v8/tools/codemap.js +8 -0
  518. data/lib/libv8/v8/tools/gcmole/Makefile +43 -0
  519. data/lib/libv8/v8/tools/gcmole/gcmole.lua +0 -2
  520. data/lib/libv8/v8/tools/gdb-v8-support.py +154 -0
  521. data/lib/libv8/v8/tools/grokdump.py +44 -35
  522. data/lib/libv8/v8/tools/gyp/v8.gyp +94 -248
  523. data/lib/libv8/v8/tools/js2c.py +83 -52
  524. data/lib/libv8/v8/tools/linux-tick-processor +4 -6
  525. data/lib/libv8/v8/tools/ll_prof.py +3 -3
  526. data/lib/libv8/v8/tools/oom_dump/README +3 -1
  527. data/lib/libv8/v8/tools/presubmit.py +11 -4
  528. data/lib/libv8/v8/tools/profile.js +46 -2
  529. data/lib/libv8/v8/tools/splaytree.js +11 -0
  530. data/lib/libv8/v8/tools/stats-viewer.py +15 -11
  531. data/lib/libv8/v8/tools/test-wrapper-gypbuild.py +227 -0
  532. data/lib/libv8/v8/tools/test.py +28 -8
  533. data/lib/libv8/v8/tools/tickprocessor.js +0 -16
  534. data/lib/libv8/version.rb +1 -1
  535. data/libv8.gemspec +2 -2
  536. metadata +31 -19
  537. data/lib/libv8/scons/engine/SCons/Tool/f03.py +0 -63
  538. data/lib/libv8/v8/src/json-parser.cc +0 -504
@@ -97,14 +97,17 @@ const char* V8NameConverter::NameInCode(byte* addr) const {
97
97
  }
98
98
 
99
99
 
100
- static void DumpBuffer(FILE* f, char* buff) {
100
+ static void DumpBuffer(FILE* f, StringBuilder* out) {
101
101
  if (f == NULL) {
102
- PrintF("%s", buff);
102
+ PrintF("%s\n", out->Finalize());
103
103
  } else {
104
- fprintf(f, "%s", buff);
104
+ fprintf(f, "%s\n", out->Finalize());
105
105
  }
106
+ out->Reset();
106
107
  }
107
108
 
109
+
110
+
108
111
  static const int kOutBufferSize = 2048 + String::kMaxShortPrintLength;
109
112
  static const int kRelocInfoPosition = 57;
110
113
 
@@ -119,6 +122,7 @@ static int DecodeIt(FILE* f,
119
122
 
120
123
  v8::internal::EmbeddedVector<char, 128> decode_buffer;
121
124
  v8::internal::EmbeddedVector<char, kOutBufferSize> out_buffer;
125
+ StringBuilder out(out_buffer.start(), out_buffer.length());
122
126
  byte* pc = begin;
123
127
  disasm::Disassembler d(converter);
124
128
  RelocIterator* it = NULL;
@@ -181,17 +185,12 @@ static int DecodeIt(FILE* f,
181
185
  }
182
186
  }
183
187
 
184
- StringBuilder out(out_buffer.start(), out_buffer.length());
185
-
186
188
  // Comments.
187
189
  for (int i = 0; i < comments.length(); i++) {
188
- out.AddFormatted(" %s\n", comments[i]);
190
+ out.AddFormatted(" %s", comments[i]);
191
+ DumpBuffer(f, &out);
189
192
  }
190
193
 
191
- // Write out comments, resets outp so that we can format the next line.
192
- DumpBuffer(f, out.Finalize());
193
- out.Reset();
194
-
195
194
  // Instruction address and instruction offset.
196
195
  out.AddFormatted("%p %4d ", prev_pc, prev_pc - begin);
197
196
 
@@ -209,7 +208,7 @@ static int DecodeIt(FILE* f,
209
208
  out.AddPadding(' ', kRelocInfoPosition - out.position());
210
209
  } else {
211
210
  // Additional reloc infos are printed on separate lines.
212
- out.AddFormatted("\n");
211
+ DumpBuffer(f, &out);
213
212
  out.AddPadding(' ', kRelocInfoPosition);
214
213
  }
215
214
 
@@ -299,9 +298,18 @@ static int DecodeIt(FILE* f,
299
298
  out.AddFormatted(" ;; %s", RelocInfo::RelocModeName(rmode));
300
299
  }
301
300
  }
302
- out.AddString("\n");
303
- DumpBuffer(f, out.Finalize());
304
- out.Reset();
301
+ DumpBuffer(f, &out);
302
+ }
303
+
304
+ // Emit comments following the last instruction (if any).
305
+ if (it != NULL) {
306
+ for ( ; !it->done(); it->next()) {
307
+ if (RelocInfo::IsComment(it->rinfo()->rmode())) {
308
+ out.AddFormatted(" %s",
309
+ reinterpret_cast<const char*>(it->rinfo()->data()));
310
+ DumpBuffer(f, &out);
311
+ }
312
+ }
305
313
  }
306
314
 
307
315
  delete it;
@@ -1,4 +1,4 @@
1
- // Copyright 2010 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -25,8 +25,9 @@
25
25
  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
26
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
- #include "v8.h"
29
-
28
+ #include "../include/v8stdint.h"
29
+ #include "globals.h"
30
+ #include "checks.h"
30
31
  #include "diy-fp.h"
31
32
 
32
33
  namespace v8 {
@@ -1,4 +1,4 @@
1
- // Copyright 2010 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -80,7 +80,7 @@ class DiyFp {
80
80
 
81
81
  // This method is mainly called for normalizing boundaries. In general
82
82
  // boundaries need to be shifted by 10 bits. We thus optimize for this case.
83
- const uint64_t k10MSBits = V8_2PART_UINT64_C(0xFFC00000, 00000000);
83
+ const uint64_t k10MSBits = static_cast<uint64_t>(0x3FF) << 54;
84
84
  while ((f & k10MSBits) == 0) {
85
85
  f <<= 10;
86
86
  e -= 10;
@@ -106,7 +106,7 @@ class DiyFp {
106
106
  void set_e(int new_value) { e_ = new_value; }
107
107
 
108
108
  private:
109
- static const uint64_t kUint64MSB = V8_2PART_UINT64_C(0x80000000, 00000000);
109
+ static const uint64_t kUint64MSB = static_cast<uint64_t>(1) << 63;
110
110
 
111
111
  uint64_t f_;
112
112
  int e_;
@@ -0,0 +1,634 @@
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+ #include "v8.h"
29
+
30
+ #include "objects.h"
31
+ #include "elements.h"
32
+ #include "utils.h"
33
+
34
+ namespace v8 {
35
+ namespace internal {
36
+
37
+
38
+ ElementsAccessor** ElementsAccessor::elements_accessors_;
39
+
40
+
41
+ bool HasKey(FixedArray* array, Object* key) {
42
+ int len0 = array->length();
43
+ for (int i = 0; i < len0; i++) {
44
+ Object* element = array->get(i);
45
+ if (element->IsSmi() && element == key) return true;
46
+ if (element->IsString() &&
47
+ key->IsString() && String::cast(element)->Equals(String::cast(key))) {
48
+ return true;
49
+ }
50
+ }
51
+ return false;
52
+ }
53
+
54
+
55
+ // Base class for element handler implementations. Contains the
56
+ // the common logic for objects with different ElementsKinds.
57
+ // Subclasses must specialize method for which the element
58
+ // implementation differs from the base class implementation.
59
+ //
60
+ // This class is intended to be used in the following way:
61
+ //
62
+ // class SomeElementsAccessor :
63
+ // public ElementsAccessorBase<SomeElementsAccessor,
64
+ // BackingStoreClass> {
65
+ // ...
66
+ // }
67
+ //
68
+ // This is an example of the Curiously Recurring Template Pattern (see
69
+ // http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern). We use
70
+ // CRTP to guarantee aggressive compile time optimizations (i.e. inlining and
71
+ // specialization of SomeElementsAccessor methods).
72
+ template <typename ElementsAccessorSubclass, typename BackingStoreClass>
73
+ class ElementsAccessorBase : public ElementsAccessor {
74
+ protected:
75
+ ElementsAccessorBase() { }
76
+ virtual MaybeObject* Get(FixedArrayBase* backing_store,
77
+ uint32_t key,
78
+ JSObject* obj,
79
+ Object* receiver) {
80
+ return ElementsAccessorSubclass::Get(
81
+ BackingStoreClass::cast(backing_store), key, obj, receiver);
82
+ }
83
+
84
+ static MaybeObject* Get(BackingStoreClass* backing_store,
85
+ uint32_t key,
86
+ JSObject* obj,
87
+ Object* receiver) {
88
+ if (key < ElementsAccessorSubclass::GetCapacity(backing_store)) {
89
+ return backing_store->get(key);
90
+ }
91
+ return backing_store->GetHeap()->the_hole_value();
92
+ }
93
+
94
+ virtual MaybeObject* Delete(JSObject* obj,
95
+ uint32_t key,
96
+ JSReceiver::DeleteMode mode) = 0;
97
+
98
+ virtual MaybeObject* AddElementsToFixedArray(FixedArrayBase* from,
99
+ FixedArray* to,
100
+ JSObject* holder,
101
+ Object* receiver) {
102
+ int len0 = to->length();
103
+ #ifdef DEBUG
104
+ if (FLAG_enable_slow_asserts) {
105
+ for (int i = 0; i < len0; i++) {
106
+ ASSERT(!to->get(i)->IsTheHole());
107
+ }
108
+ }
109
+ #endif
110
+ BackingStoreClass* backing_store = BackingStoreClass::cast(from);
111
+ uint32_t len1 = ElementsAccessorSubclass::GetCapacity(backing_store);
112
+
113
+ // Optimize if 'other' is empty.
114
+ // We cannot optimize if 'this' is empty, as other may have holes.
115
+ if (len1 == 0) return to;
116
+
117
+ // Compute how many elements are not in other.
118
+ int extra = 0;
119
+ for (uint32_t y = 0; y < len1; y++) {
120
+ if (ElementsAccessorSubclass::HasElementAtIndex(backing_store,
121
+ y,
122
+ holder,
123
+ receiver)) {
124
+ uint32_t key =
125
+ ElementsAccessorSubclass::GetKeyForIndex(backing_store, y);
126
+ MaybeObject* maybe_value =
127
+ ElementsAccessorSubclass::Get(backing_store, key, holder, receiver);
128
+ Object* value;
129
+ if (!maybe_value->ToObject(&value)) return maybe_value;
130
+ ASSERT(!value->IsTheHole());
131
+ if (!HasKey(to, value)) {
132
+ extra++;
133
+ }
134
+ }
135
+ }
136
+
137
+ if (extra == 0) return to;
138
+
139
+ // Allocate the result
140
+ FixedArray* result;
141
+ MaybeObject* maybe_obj =
142
+ backing_store->GetHeap()->AllocateFixedArray(len0 + extra);
143
+ if (!maybe_obj->To<FixedArray>(&result)) return maybe_obj;
144
+
145
+ // Fill in the content
146
+ {
147
+ AssertNoAllocation no_gc;
148
+ WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc);
149
+ for (int i = 0; i < len0; i++) {
150
+ Object* e = to->get(i);
151
+ ASSERT(e->IsString() || e->IsNumber());
152
+ result->set(i, e, mode);
153
+ }
154
+ }
155
+ // Fill in the extra values.
156
+ int index = 0;
157
+ for (uint32_t y = 0; y < len1; y++) {
158
+ if (ElementsAccessorSubclass::HasElementAtIndex(backing_store,
159
+ y,
160
+ holder,
161
+ receiver)) {
162
+ uint32_t key =
163
+ ElementsAccessorSubclass::GetKeyForIndex(backing_store, y);
164
+ MaybeObject* maybe_value =
165
+ ElementsAccessorSubclass::Get(backing_store, key, holder, receiver);
166
+ Object* value;
167
+ if (!maybe_value->ToObject(&value)) return maybe_value;
168
+ if (!value->IsTheHole() && !HasKey(to, value)) {
169
+ result->set(len0 + index, value);
170
+ index++;
171
+ }
172
+ }
173
+ }
174
+ ASSERT(extra == index);
175
+ return result;
176
+ }
177
+
178
+ protected:
179
+ static uint32_t GetCapacity(BackingStoreClass* backing_store) {
180
+ return backing_store->length();
181
+ }
182
+
183
+ virtual uint32_t GetCapacity(FixedArrayBase* backing_store) {
184
+ return ElementsAccessorSubclass::GetCapacity(
185
+ BackingStoreClass::cast(backing_store));
186
+ }
187
+
188
+ static bool HasElementAtIndex(BackingStoreClass* backing_store,
189
+ uint32_t index,
190
+ JSObject* holder,
191
+ Object* receiver) {
192
+ uint32_t key =
193
+ ElementsAccessorSubclass::GetKeyForIndex(backing_store, index);
194
+ MaybeObject* element = ElementsAccessorSubclass::Get(backing_store,
195
+ key,
196
+ holder,
197
+ receiver);
198
+ return !element->IsTheHole();
199
+ }
200
+
201
+ virtual bool HasElementAtIndex(FixedArrayBase* backing_store,
202
+ uint32_t index,
203
+ JSObject* holder,
204
+ Object* receiver) {
205
+ return ElementsAccessorSubclass::HasElementAtIndex(
206
+ BackingStoreClass::cast(backing_store), index, holder, receiver);
207
+ }
208
+
209
+ static uint32_t GetKeyForIndex(BackingStoreClass* backing_store,
210
+ uint32_t index) {
211
+ return index;
212
+ }
213
+
214
+ virtual uint32_t GetKeyForIndex(FixedArrayBase* backing_store,
215
+ uint32_t index) {
216
+ return ElementsAccessorSubclass::GetKeyForIndex(
217
+ BackingStoreClass::cast(backing_store), index);
218
+ }
219
+
220
+ private:
221
+ DISALLOW_COPY_AND_ASSIGN(ElementsAccessorBase);
222
+ };
223
+
224
+
225
+ class FastElementsAccessor
226
+ : public ElementsAccessorBase<FastElementsAccessor, FixedArray> {
227
+ public:
228
+ static MaybeObject* DeleteCommon(JSObject* obj,
229
+ uint32_t key) {
230
+ ASSERT(obj->HasFastElements() || obj->HasFastArgumentsElements());
231
+ Heap* heap = obj->GetHeap();
232
+ FixedArray* backing_store = FixedArray::cast(obj->elements());
233
+ if (backing_store->map() == heap->non_strict_arguments_elements_map()) {
234
+ backing_store = FixedArray::cast(backing_store->get(1));
235
+ } else {
236
+ Object* writable;
237
+ MaybeObject* maybe = obj->EnsureWritableFastElements();
238
+ if (!maybe->ToObject(&writable)) return maybe;
239
+ backing_store = FixedArray::cast(writable);
240
+ }
241
+ uint32_t length = static_cast<uint32_t>(
242
+ obj->IsJSArray()
243
+ ? Smi::cast(JSArray::cast(obj)->length())->value()
244
+ : backing_store->length());
245
+ if (key < length) {
246
+ backing_store->set_the_hole(key);
247
+ // If an old space backing store is larger than a certain size and
248
+ // has too few used values, normalize it.
249
+ // To avoid doing the check on every delete we require at least
250
+ // one adjacent hole to the value being deleted.
251
+ Object* hole = heap->the_hole_value();
252
+ const int kMinLengthForSparsenessCheck = 64;
253
+ if (backing_store->length() >= kMinLengthForSparsenessCheck &&
254
+ !heap->InNewSpace(backing_store) &&
255
+ ((key > 0 && backing_store->get(key - 1) == hole) ||
256
+ (key + 1 < length && backing_store->get(key + 1) == hole))) {
257
+ int num_used = 0;
258
+ for (int i = 0; i < backing_store->length(); ++i) {
259
+ if (backing_store->get(i) != hole) ++num_used;
260
+ // Bail out early if more than 1/4 is used.
261
+ if (4 * num_used > backing_store->length()) break;
262
+ }
263
+ if (4 * num_used <= backing_store->length()) {
264
+ MaybeObject* result = obj->NormalizeElements();
265
+ if (result->IsFailure()) return result;
266
+ }
267
+ }
268
+ }
269
+ return heap->true_value();
270
+ }
271
+
272
+ protected:
273
+ virtual MaybeObject* Delete(JSObject* obj,
274
+ uint32_t key,
275
+ JSReceiver::DeleteMode mode) {
276
+ return DeleteCommon(obj, key);
277
+ }
278
+ };
279
+
280
+
281
+ class FastDoubleElementsAccessor
282
+ : public ElementsAccessorBase<FastDoubleElementsAccessor,
283
+ FixedDoubleArray> {
284
+ protected:
285
+ friend class ElementsAccessorBase<FastDoubleElementsAccessor,
286
+ FixedDoubleArray>;
287
+
288
+ virtual MaybeObject* Delete(JSObject* obj,
289
+ uint32_t key,
290
+ JSReceiver::DeleteMode mode) {
291
+ int length = obj->IsJSArray()
292
+ ? Smi::cast(JSArray::cast(obj)->length())->value()
293
+ : FixedDoubleArray::cast(obj->elements())->length();
294
+ if (key < static_cast<uint32_t>(length)) {
295
+ FixedDoubleArray::cast(obj->elements())->set_the_hole(key);
296
+ }
297
+ return obj->GetHeap()->true_value();
298
+ }
299
+
300
+ static bool HasElementAtIndex(FixedDoubleArray* backing_store,
301
+ uint32_t index,
302
+ JSObject* holder,
303
+ Object* receiver) {
304
+ return !backing_store->is_the_hole(index);
305
+ }
306
+ };
307
+
308
+
309
+ // Super class for all external element arrays.
310
+ template<typename ExternalElementsAccessorSubclass,
311
+ typename ExternalArray>
312
+ class ExternalElementsAccessor
313
+ : public ElementsAccessorBase<ExternalElementsAccessorSubclass,
314
+ ExternalArray> {
315
+ protected:
316
+ friend class ElementsAccessorBase<ExternalElementsAccessorSubclass,
317
+ ExternalArray>;
318
+
319
+ static MaybeObject* Get(ExternalArray* backing_store,
320
+ uint32_t key,
321
+ JSObject* obj,
322
+ Object* receiver) {
323
+ if (key < ExternalElementsAccessorSubclass::GetCapacity(backing_store)) {
324
+ return backing_store->get(key);
325
+ } else {
326
+ return backing_store->GetHeap()->undefined_value();
327
+ }
328
+ }
329
+
330
+ virtual MaybeObject* Delete(JSObject* obj,
331
+ uint32_t key,
332
+ JSReceiver::DeleteMode mode) {
333
+ // External arrays always ignore deletes.
334
+ return obj->GetHeap()->true_value();
335
+ }
336
+ };
337
+
338
+
339
+ class ExternalByteElementsAccessor
340
+ : public ExternalElementsAccessor<ExternalByteElementsAccessor,
341
+ ExternalByteArray> {
342
+ };
343
+
344
+
345
+ class ExternalUnsignedByteElementsAccessor
346
+ : public ExternalElementsAccessor<ExternalUnsignedByteElementsAccessor,
347
+ ExternalUnsignedByteArray> {
348
+ };
349
+
350
+
351
+ class ExternalShortElementsAccessor
352
+ : public ExternalElementsAccessor<ExternalShortElementsAccessor,
353
+ ExternalShortArray> {
354
+ };
355
+
356
+
357
+ class ExternalUnsignedShortElementsAccessor
358
+ : public ExternalElementsAccessor<ExternalUnsignedShortElementsAccessor,
359
+ ExternalUnsignedShortArray> {
360
+ };
361
+
362
+
363
+ class ExternalIntElementsAccessor
364
+ : public ExternalElementsAccessor<ExternalIntElementsAccessor,
365
+ ExternalIntArray> {
366
+ };
367
+
368
+
369
+ class ExternalUnsignedIntElementsAccessor
370
+ : public ExternalElementsAccessor<ExternalUnsignedIntElementsAccessor,
371
+ ExternalUnsignedIntArray> {
372
+ };
373
+
374
+
375
+ class ExternalFloatElementsAccessor
376
+ : public ExternalElementsAccessor<ExternalFloatElementsAccessor,
377
+ ExternalFloatArray> {
378
+ };
379
+
380
+
381
+ class ExternalDoubleElementsAccessor
382
+ : public ExternalElementsAccessor<ExternalDoubleElementsAccessor,
383
+ ExternalDoubleArray> {
384
+ };
385
+
386
+
387
+ class PixelElementsAccessor
388
+ : public ExternalElementsAccessor<PixelElementsAccessor,
389
+ ExternalPixelArray> {
390
+ };
391
+
392
+
393
+ class DictionaryElementsAccessor
394
+ : public ElementsAccessorBase<DictionaryElementsAccessor,
395
+ NumberDictionary> {
396
+ public:
397
+ static MaybeObject* DeleteCommon(JSObject* obj,
398
+ uint32_t key,
399
+ JSReceiver::DeleteMode mode) {
400
+ Isolate* isolate = obj->GetIsolate();
401
+ Heap* heap = isolate->heap();
402
+ FixedArray* backing_store = FixedArray::cast(obj->elements());
403
+ bool is_arguments =
404
+ (obj->GetElementsKind() == JSObject::NON_STRICT_ARGUMENTS_ELEMENTS);
405
+ if (is_arguments) {
406
+ backing_store = FixedArray::cast(backing_store->get(1));
407
+ }
408
+ NumberDictionary* dictionary = NumberDictionary::cast(backing_store);
409
+ int entry = dictionary->FindEntry(key);
410
+ if (entry != NumberDictionary::kNotFound) {
411
+ Object* result = dictionary->DeleteProperty(entry, mode);
412
+ if (result == heap->true_value()) {
413
+ MaybeObject* maybe_elements = dictionary->Shrink(key);
414
+ FixedArray* new_elements = NULL;
415
+ if (!maybe_elements->To(&new_elements)) {
416
+ return maybe_elements;
417
+ }
418
+ if (is_arguments) {
419
+ FixedArray::cast(obj->elements())->set(1, new_elements);
420
+ } else {
421
+ obj->set_elements(new_elements);
422
+ }
423
+ }
424
+ if (mode == JSObject::STRICT_DELETION &&
425
+ result == heap->false_value()) {
426
+ // In strict mode, attempting to delete a non-configurable property
427
+ // throws an exception.
428
+ HandleScope scope(isolate);
429
+ Handle<Object> holder(obj);
430
+ Handle<Object> name = isolate->factory()->NewNumberFromUint(key);
431
+ Handle<Object> args[2] = { name, holder };
432
+ Handle<Object> error =
433
+ isolate->factory()->NewTypeError("strict_delete_property",
434
+ HandleVector(args, 2));
435
+ return isolate->Throw(*error);
436
+ }
437
+ }
438
+ return heap->true_value();
439
+ }
440
+
441
+ protected:
442
+ friend class ElementsAccessorBase<DictionaryElementsAccessor,
443
+ NumberDictionary>;
444
+
445
+ virtual MaybeObject* Delete(JSObject* obj,
446
+ uint32_t key,
447
+ JSReceiver::DeleteMode mode) {
448
+ return DeleteCommon(obj, key, mode);
449
+ }
450
+
451
+ static MaybeObject* Get(NumberDictionary* backing_store,
452
+ uint32_t key,
453
+ JSObject* obj,
454
+ Object* receiver) {
455
+ int entry = backing_store->FindEntry(key);
456
+ if (entry != NumberDictionary::kNotFound) {
457
+ Object* element = backing_store->ValueAt(entry);
458
+ PropertyDetails details = backing_store->DetailsAt(entry);
459
+ if (details.type() == CALLBACKS) {
460
+ return obj->GetElementWithCallback(receiver,
461
+ element,
462
+ key,
463
+ obj);
464
+ } else {
465
+ return element;
466
+ }
467
+ }
468
+ return obj->GetHeap()->the_hole_value();
469
+ }
470
+
471
+ static uint32_t GetKeyForIndex(NumberDictionary* dict,
472
+ uint32_t index) {
473
+ Object* key = dict->KeyAt(index);
474
+ return Smi::cast(key)->value();
475
+ }
476
+ };
477
+
478
+
479
+ class NonStrictArgumentsElementsAccessor
480
+ : public ElementsAccessorBase<NonStrictArgumentsElementsAccessor,
481
+ FixedArray> {
482
+ protected:
483
+ friend class ElementsAccessorBase<NonStrictArgumentsElementsAccessor,
484
+ FixedArray>;
485
+
486
+ static MaybeObject* Get(FixedArray* parameter_map,
487
+ uint32_t key,
488
+ JSObject* obj,
489
+ Object* receiver) {
490
+ Object* probe = GetParameterMapArg(parameter_map, key);
491
+ if (!probe->IsTheHole()) {
492
+ Context* context = Context::cast(parameter_map->get(0));
493
+ int context_index = Smi::cast(probe)->value();
494
+ ASSERT(!context->get(context_index)->IsTheHole());
495
+ return context->get(context_index);
496
+ } else {
497
+ // Object is not mapped, defer to the arguments.
498
+ FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
499
+ return ElementsAccessor::ForArray(arguments)->Get(arguments,
500
+ key,
501
+ obj,
502
+ receiver);
503
+ }
504
+ }
505
+
506
+ virtual MaybeObject* Delete(JSObject* obj,
507
+ uint32_t key
508
+ ,
509
+ JSReceiver::DeleteMode mode) {
510
+ FixedArray* parameter_map = FixedArray::cast(obj->elements());
511
+ Object* probe = GetParameterMapArg(parameter_map, key);
512
+ if (!probe->IsTheHole()) {
513
+ // TODO(kmillikin): We could check if this was the last aliased
514
+ // parameter, and revert to normal elements in that case. That
515
+ // would enable GC of the context.
516
+ parameter_map->set_the_hole(key + 2);
517
+ } else {
518
+ FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
519
+ if (arguments->IsDictionary()) {
520
+ return DictionaryElementsAccessor::DeleteCommon(obj, key, mode);
521
+ } else {
522
+ return FastElementsAccessor::DeleteCommon(obj, key);
523
+ }
524
+ }
525
+ return obj->GetHeap()->true_value();
526
+ }
527
+
528
+ static uint32_t GetCapacity(FixedArray* parameter_map) {
529
+ FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
530
+ return Max(static_cast<uint32_t>(parameter_map->length() - 2),
531
+ ForArray(arguments)->GetCapacity(arguments));
532
+ }
533
+
534
+ static uint32_t GetKeyForIndex(FixedArray* dict,
535
+ uint32_t index) {
536
+ return index;
537
+ }
538
+
539
+ static bool HasElementAtIndex(FixedArray* parameter_map,
540
+ uint32_t index,
541
+ JSObject* holder,
542
+ Object* receiver) {
543
+ Object* probe = GetParameterMapArg(parameter_map, index);
544
+ if (!probe->IsTheHole()) {
545
+ return true;
546
+ } else {
547
+ FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1));
548
+ ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments);
549
+ return !accessor->Get(arguments, index, holder, receiver)->IsTheHole();
550
+ }
551
+ }
552
+
553
+ private:
554
+ static Object* GetParameterMapArg(FixedArray* parameter_map,
555
+ uint32_t key) {
556
+ uint32_t length = parameter_map->length();
557
+ return key < (length - 2 )
558
+ ? parameter_map->get(key + 2)
559
+ : parameter_map->GetHeap()->the_hole_value();
560
+ }
561
+ };
562
+
563
+
564
+ ElementsAccessor* ElementsAccessor::ForArray(FixedArrayBase* array) {
565
+ switch (array->map()->instance_type()) {
566
+ case FIXED_ARRAY_TYPE:
567
+ if (array->IsDictionary()) {
568
+ return elements_accessors_[JSObject::DICTIONARY_ELEMENTS];
569
+ } else {
570
+ return elements_accessors_[JSObject::FAST_ELEMENTS];
571
+ }
572
+ case EXTERNAL_BYTE_ARRAY_TYPE:
573
+ return elements_accessors_[JSObject::EXTERNAL_BYTE_ELEMENTS];
574
+ case EXTERNAL_UNSIGNED_BYTE_ARRAY_TYPE:
575
+ return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_BYTE_ELEMENTS];
576
+ case EXTERNAL_SHORT_ARRAY_TYPE:
577
+ return elements_accessors_[JSObject::EXTERNAL_SHORT_ELEMENTS];
578
+ case EXTERNAL_UNSIGNED_SHORT_ARRAY_TYPE:
579
+ return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_SHORT_ELEMENTS];
580
+ case EXTERNAL_INT_ARRAY_TYPE:
581
+ return elements_accessors_[JSObject::EXTERNAL_INT_ELEMENTS];
582
+ case EXTERNAL_UNSIGNED_INT_ARRAY_TYPE:
583
+ return elements_accessors_[JSObject::EXTERNAL_UNSIGNED_INT_ELEMENTS];
584
+ case EXTERNAL_FLOAT_ARRAY_TYPE:
585
+ return elements_accessors_[JSObject::EXTERNAL_FLOAT_ELEMENTS];
586
+ case EXTERNAL_DOUBLE_ARRAY_TYPE:
587
+ return elements_accessors_[JSObject::EXTERNAL_DOUBLE_ELEMENTS];
588
+ case EXTERNAL_PIXEL_ARRAY_TYPE:
589
+ return elements_accessors_[JSObject::EXTERNAL_PIXEL_ELEMENTS];
590
+ default:
591
+ UNREACHABLE();
592
+ return NULL;
593
+ }
594
+ }
595
+
596
+
597
+ void ElementsAccessor::InitializeOncePerProcess() {
598
+ static struct ConcreteElementsAccessors {
599
+ FastElementsAccessor fast_elements_handler;
600
+ FastDoubleElementsAccessor fast_double_elements_handler;
601
+ DictionaryElementsAccessor dictionary_elements_handler;
602
+ NonStrictArgumentsElementsAccessor non_strict_arguments_elements_handler;
603
+ ExternalByteElementsAccessor byte_elements_handler;
604
+ ExternalUnsignedByteElementsAccessor unsigned_byte_elements_handler;
605
+ ExternalShortElementsAccessor short_elements_handler;
606
+ ExternalUnsignedShortElementsAccessor unsigned_short_elements_handler;
607
+ ExternalIntElementsAccessor int_elements_handler;
608
+ ExternalUnsignedIntElementsAccessor unsigned_int_elements_handler;
609
+ ExternalFloatElementsAccessor float_elements_handler;
610
+ ExternalDoubleElementsAccessor double_elements_handler;
611
+ PixelElementsAccessor pixel_elements_handler;
612
+ } element_accessors;
613
+
614
+ static ElementsAccessor* accessor_array[] = {
615
+ &element_accessors.fast_elements_handler,
616
+ &element_accessors.fast_double_elements_handler,
617
+ &element_accessors.dictionary_elements_handler,
618
+ &element_accessors.non_strict_arguments_elements_handler,
619
+ &element_accessors.byte_elements_handler,
620
+ &element_accessors.unsigned_byte_elements_handler,
621
+ &element_accessors.short_elements_handler,
622
+ &element_accessors.unsigned_short_elements_handler,
623
+ &element_accessors.int_elements_handler,
624
+ &element_accessors.unsigned_int_elements_handler,
625
+ &element_accessors.float_elements_handler,
626
+ &element_accessors.double_elements_handler,
627
+ &element_accessors.pixel_elements_handler
628
+ };
629
+
630
+ elements_accessors_ = accessor_array;
631
+ }
632
+
633
+
634
+ } } // namespace v8::internal