libv8 3.11.8.17 → 3.16.14.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (754) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -2
  3. data/Gemfile +1 -1
  4. data/Rakefile +6 -7
  5. data/lib/libv8/version.rb +1 -1
  6. data/vendor/v8/.gitignore +24 -3
  7. data/vendor/v8/AUTHORS +7 -0
  8. data/vendor/v8/ChangeLog +839 -0
  9. data/vendor/v8/DEPS +1 -1
  10. data/vendor/v8/Makefile.android +92 -0
  11. data/vendor/v8/OWNERS +11 -0
  12. data/vendor/v8/PRESUBMIT.py +71 -0
  13. data/vendor/v8/SConstruct +34 -39
  14. data/vendor/v8/build/android.gypi +56 -37
  15. data/vendor/v8/build/common.gypi +112 -30
  16. data/vendor/v8/build/gyp_v8 +1 -1
  17. data/vendor/v8/build/standalone.gypi +15 -11
  18. data/vendor/v8/include/v8-debug.h +9 -1
  19. data/vendor/v8/include/v8-preparser.h +4 -3
  20. data/vendor/v8/include/v8-profiler.h +25 -25
  21. data/vendor/v8/include/v8-testing.h +4 -3
  22. data/vendor/v8/include/v8.h +994 -540
  23. data/vendor/v8/preparser/preparser-process.cc +3 -3
  24. data/vendor/v8/samples/lineprocessor.cc +20 -27
  25. data/vendor/v8/samples/process.cc +18 -14
  26. data/vendor/v8/samples/shell.cc +16 -15
  27. data/vendor/v8/src/SConscript +15 -14
  28. data/vendor/v8/src/accessors.cc +169 -77
  29. data/vendor/v8/src/accessors.h +4 -0
  30. data/vendor/v8/src/allocation-inl.h +2 -2
  31. data/vendor/v8/src/allocation.h +7 -7
  32. data/vendor/v8/src/api.cc +810 -497
  33. data/vendor/v8/src/api.h +85 -60
  34. data/vendor/v8/src/arm/assembler-arm-inl.h +179 -22
  35. data/vendor/v8/src/arm/assembler-arm.cc +633 -264
  36. data/vendor/v8/src/arm/assembler-arm.h +264 -197
  37. data/vendor/v8/src/arm/builtins-arm.cc +117 -27
  38. data/vendor/v8/src/arm/code-stubs-arm.cc +1241 -700
  39. data/vendor/v8/src/arm/code-stubs-arm.h +35 -138
  40. data/vendor/v8/src/arm/codegen-arm.cc +285 -16
  41. data/vendor/v8/src/arm/codegen-arm.h +22 -0
  42. data/vendor/v8/src/arm/constants-arm.cc +5 -3
  43. data/vendor/v8/src/arm/constants-arm.h +24 -11
  44. data/vendor/v8/src/arm/debug-arm.cc +3 -3
  45. data/vendor/v8/src/arm/deoptimizer-arm.cc +382 -92
  46. data/vendor/v8/src/arm/disasm-arm.cc +61 -12
  47. data/vendor/v8/src/arm/frames-arm.h +0 -14
  48. data/vendor/v8/src/arm/full-codegen-arm.cc +332 -304
  49. data/vendor/v8/src/arm/ic-arm.cc +180 -259
  50. data/vendor/v8/src/arm/lithium-arm.cc +364 -316
  51. data/vendor/v8/src/arm/lithium-arm.h +512 -275
  52. data/vendor/v8/src/arm/lithium-codegen-arm.cc +1768 -809
  53. data/vendor/v8/src/arm/lithium-codegen-arm.h +97 -35
  54. data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +12 -5
  55. data/vendor/v8/src/arm/macro-assembler-arm.cc +439 -228
  56. data/vendor/v8/src/arm/macro-assembler-arm.h +116 -70
  57. data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +54 -44
  58. data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +3 -10
  59. data/vendor/v8/src/arm/simulator-arm.cc +272 -238
  60. data/vendor/v8/src/arm/simulator-arm.h +38 -8
  61. data/vendor/v8/src/arm/stub-cache-arm.cc +522 -895
  62. data/vendor/v8/src/array.js +101 -70
  63. data/vendor/v8/src/assembler.cc +270 -19
  64. data/vendor/v8/src/assembler.h +110 -15
  65. data/vendor/v8/src/ast.cc +79 -69
  66. data/vendor/v8/src/ast.h +255 -301
  67. data/vendor/v8/src/atomicops.h +7 -1
  68. data/vendor/v8/src/atomicops_internals_tsan.h +335 -0
  69. data/vendor/v8/src/bootstrapper.cc +481 -418
  70. data/vendor/v8/src/bootstrapper.h +4 -4
  71. data/vendor/v8/src/builtins.cc +498 -311
  72. data/vendor/v8/src/builtins.h +75 -47
  73. data/vendor/v8/src/checks.cc +2 -1
  74. data/vendor/v8/src/checks.h +8 -0
  75. data/vendor/v8/src/code-stubs-hydrogen.cc +253 -0
  76. data/vendor/v8/src/code-stubs.cc +249 -84
  77. data/vendor/v8/src/code-stubs.h +501 -169
  78. data/vendor/v8/src/codegen.cc +36 -18
  79. data/vendor/v8/src/codegen.h +25 -3
  80. data/vendor/v8/src/collection.js +54 -17
  81. data/vendor/v8/src/compilation-cache.cc +24 -16
  82. data/vendor/v8/src/compilation-cache.h +15 -6
  83. data/vendor/v8/src/compiler.cc +497 -195
  84. data/vendor/v8/src/compiler.h +246 -38
  85. data/vendor/v8/src/contexts.cc +64 -24
  86. data/vendor/v8/src/contexts.h +60 -29
  87. data/vendor/v8/src/conversions-inl.h +24 -14
  88. data/vendor/v8/src/conversions.h +7 -4
  89. data/vendor/v8/src/counters.cc +21 -12
  90. data/vendor/v8/src/counters.h +44 -16
  91. data/vendor/v8/src/cpu-profiler.h +1 -1
  92. data/vendor/v8/src/d8-debug.cc +2 -2
  93. data/vendor/v8/src/d8-readline.cc +13 -2
  94. data/vendor/v8/src/d8.cc +681 -273
  95. data/vendor/v8/src/d8.gyp +4 -4
  96. data/vendor/v8/src/d8.h +38 -18
  97. data/vendor/v8/src/d8.js +0 -617
  98. data/vendor/v8/src/data-flow.h +55 -0
  99. data/vendor/v8/src/date.js +1 -42
  100. data/vendor/v8/src/dateparser-inl.h +5 -1
  101. data/vendor/v8/src/debug-agent.cc +10 -15
  102. data/vendor/v8/src/debug-debugger.js +147 -149
  103. data/vendor/v8/src/debug.cc +323 -164
  104. data/vendor/v8/src/debug.h +26 -14
  105. data/vendor/v8/src/deoptimizer.cc +765 -290
  106. data/vendor/v8/src/deoptimizer.h +130 -28
  107. data/vendor/v8/src/disassembler.cc +10 -4
  108. data/vendor/v8/src/elements-kind.cc +7 -2
  109. data/vendor/v8/src/elements-kind.h +19 -0
  110. data/vendor/v8/src/elements.cc +607 -285
  111. data/vendor/v8/src/elements.h +36 -13
  112. data/vendor/v8/src/execution.cc +52 -31
  113. data/vendor/v8/src/execution.h +4 -4
  114. data/vendor/v8/src/extensions/externalize-string-extension.cc +5 -4
  115. data/vendor/v8/src/extensions/gc-extension.cc +5 -1
  116. data/vendor/v8/src/extensions/statistics-extension.cc +153 -0
  117. data/vendor/v8/src/{inspector.h → extensions/statistics-extension.h} +12 -23
  118. data/vendor/v8/src/factory.cc +101 -134
  119. data/vendor/v8/src/factory.h +36 -31
  120. data/vendor/v8/src/flag-definitions.h +102 -25
  121. data/vendor/v8/src/flags.cc +9 -5
  122. data/vendor/v8/src/frames-inl.h +10 -0
  123. data/vendor/v8/src/frames.cc +116 -26
  124. data/vendor/v8/src/frames.h +96 -12
  125. data/vendor/v8/src/full-codegen.cc +219 -74
  126. data/vendor/v8/src/full-codegen.h +63 -21
  127. data/vendor/v8/src/func-name-inferrer.cc +8 -7
  128. data/vendor/v8/src/func-name-inferrer.h +5 -3
  129. data/vendor/v8/src/gdb-jit.cc +71 -57
  130. data/vendor/v8/src/global-handles.cc +230 -101
  131. data/vendor/v8/src/global-handles.h +26 -27
  132. data/vendor/v8/src/globals.h +17 -19
  133. data/vendor/v8/src/handles-inl.h +59 -12
  134. data/vendor/v8/src/handles.cc +180 -200
  135. data/vendor/v8/src/handles.h +80 -11
  136. data/vendor/v8/src/hashmap.h +60 -40
  137. data/vendor/v8/src/heap-inl.h +107 -45
  138. data/vendor/v8/src/heap-profiler.cc +38 -19
  139. data/vendor/v8/src/heap-profiler.h +24 -14
  140. data/vendor/v8/src/heap.cc +1123 -738
  141. data/vendor/v8/src/heap.h +385 -146
  142. data/vendor/v8/src/hydrogen-instructions.cc +700 -217
  143. data/vendor/v8/src/hydrogen-instructions.h +1158 -472
  144. data/vendor/v8/src/hydrogen.cc +3319 -1662
  145. data/vendor/v8/src/hydrogen.h +411 -170
  146. data/vendor/v8/src/ia32/assembler-ia32-inl.h +46 -16
  147. data/vendor/v8/src/ia32/assembler-ia32.cc +131 -61
  148. data/vendor/v8/src/ia32/assembler-ia32.h +115 -57
  149. data/vendor/v8/src/ia32/builtins-ia32.cc +99 -5
  150. data/vendor/v8/src/ia32/code-stubs-ia32.cc +787 -495
  151. data/vendor/v8/src/ia32/code-stubs-ia32.h +10 -100
  152. data/vendor/v8/src/ia32/codegen-ia32.cc +227 -23
  153. data/vendor/v8/src/ia32/codegen-ia32.h +14 -0
  154. data/vendor/v8/src/ia32/deoptimizer-ia32.cc +428 -87
  155. data/vendor/v8/src/ia32/disasm-ia32.cc +28 -1
  156. data/vendor/v8/src/ia32/frames-ia32.h +6 -16
  157. data/vendor/v8/src/ia32/full-codegen-ia32.cc +280 -272
  158. data/vendor/v8/src/ia32/ic-ia32.cc +150 -250
  159. data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +1600 -517
  160. data/vendor/v8/src/ia32/lithium-codegen-ia32.h +90 -24
  161. data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +10 -6
  162. data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.h +2 -2
  163. data/vendor/v8/src/ia32/lithium-ia32.cc +405 -302
  164. data/vendor/v8/src/ia32/lithium-ia32.h +526 -271
  165. data/vendor/v8/src/ia32/macro-assembler-ia32.cc +378 -119
  166. data/vendor/v8/src/ia32/macro-assembler-ia32.h +62 -28
  167. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +43 -30
  168. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +2 -10
  169. data/vendor/v8/src/ia32/stub-cache-ia32.cc +492 -678
  170. data/vendor/v8/src/ic-inl.h +9 -4
  171. data/vendor/v8/src/ic.cc +836 -923
  172. data/vendor/v8/src/ic.h +228 -247
  173. data/vendor/v8/src/incremental-marking-inl.h +26 -30
  174. data/vendor/v8/src/incremental-marking.cc +276 -248
  175. data/vendor/v8/src/incremental-marking.h +29 -37
  176. data/vendor/v8/src/interface.cc +34 -25
  177. data/vendor/v8/src/interface.h +69 -25
  178. data/vendor/v8/src/interpreter-irregexp.cc +2 -2
  179. data/vendor/v8/src/isolate.cc +382 -76
  180. data/vendor/v8/src/isolate.h +109 -56
  181. data/vendor/v8/src/json-parser.h +217 -104
  182. data/vendor/v8/src/json-stringifier.h +745 -0
  183. data/vendor/v8/src/json.js +10 -132
  184. data/vendor/v8/src/jsregexp-inl.h +106 -0
  185. data/vendor/v8/src/jsregexp.cc +517 -285
  186. data/vendor/v8/src/jsregexp.h +145 -117
  187. data/vendor/v8/src/list-inl.h +35 -22
  188. data/vendor/v8/src/list.h +46 -19
  189. data/vendor/v8/src/lithium-allocator-inl.h +22 -2
  190. data/vendor/v8/src/lithium-allocator.cc +85 -70
  191. data/vendor/v8/src/lithium-allocator.h +21 -39
  192. data/vendor/v8/src/lithium.cc +259 -5
  193. data/vendor/v8/src/lithium.h +131 -32
  194. data/vendor/v8/src/liveedit-debugger.js +52 -3
  195. data/vendor/v8/src/liveedit.cc +393 -113
  196. data/vendor/v8/src/liveedit.h +7 -3
  197. data/vendor/v8/src/log-utils.cc +4 -2
  198. data/vendor/v8/src/log.cc +170 -140
  199. data/vendor/v8/src/log.h +62 -11
  200. data/vendor/v8/src/macro-assembler.h +17 -0
  201. data/vendor/v8/src/macros.py +2 -0
  202. data/vendor/v8/src/mark-compact-inl.h +3 -23
  203. data/vendor/v8/src/mark-compact.cc +801 -830
  204. data/vendor/v8/src/mark-compact.h +154 -47
  205. data/vendor/v8/src/marking-thread.cc +85 -0
  206. data/vendor/v8/src/{inspector.cc → marking-thread.h} +32 -24
  207. data/vendor/v8/src/math.js +12 -18
  208. data/vendor/v8/src/messages.cc +18 -8
  209. data/vendor/v8/src/messages.js +314 -261
  210. data/vendor/v8/src/mips/assembler-mips-inl.h +58 -6
  211. data/vendor/v8/src/mips/assembler-mips.cc +92 -75
  212. data/vendor/v8/src/mips/assembler-mips.h +54 -60
  213. data/vendor/v8/src/mips/builtins-mips.cc +116 -17
  214. data/vendor/v8/src/mips/code-stubs-mips.cc +919 -556
  215. data/vendor/v8/src/mips/code-stubs-mips.h +22 -131
  216. data/vendor/v8/src/mips/codegen-mips.cc +281 -6
  217. data/vendor/v8/src/mips/codegen-mips.h +22 -0
  218. data/vendor/v8/src/mips/constants-mips.cc +2 -0
  219. data/vendor/v8/src/mips/constants-mips.h +12 -2
  220. data/vendor/v8/src/mips/deoptimizer-mips.cc +286 -50
  221. data/vendor/v8/src/mips/disasm-mips.cc +13 -0
  222. data/vendor/v8/src/mips/full-codegen-mips.cc +297 -284
  223. data/vendor/v8/src/mips/ic-mips.cc +182 -263
  224. data/vendor/v8/src/mips/lithium-codegen-mips.cc +1208 -556
  225. data/vendor/v8/src/mips/lithium-codegen-mips.h +72 -19
  226. data/vendor/v8/src/mips/lithium-gap-resolver-mips.cc +9 -2
  227. data/vendor/v8/src/mips/lithium-mips.cc +290 -302
  228. data/vendor/v8/src/mips/lithium-mips.h +463 -266
  229. data/vendor/v8/src/mips/macro-assembler-mips.cc +208 -115
  230. data/vendor/v8/src/mips/macro-assembler-mips.h +67 -24
  231. data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +40 -25
  232. data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +3 -9
  233. data/vendor/v8/src/mips/simulator-mips.cc +112 -40
  234. data/vendor/v8/src/mips/simulator-mips.h +5 -0
  235. data/vendor/v8/src/mips/stub-cache-mips.cc +502 -884
  236. data/vendor/v8/src/mirror-debugger.js +157 -30
  237. data/vendor/v8/src/mksnapshot.cc +88 -14
  238. data/vendor/v8/src/object-observe.js +235 -0
  239. data/vendor/v8/src/objects-debug.cc +178 -176
  240. data/vendor/v8/src/objects-inl.h +1333 -486
  241. data/vendor/v8/src/objects-printer.cc +125 -43
  242. data/vendor/v8/src/objects-visiting-inl.h +578 -6
  243. data/vendor/v8/src/objects-visiting.cc +2 -2
  244. data/vendor/v8/src/objects-visiting.h +172 -79
  245. data/vendor/v8/src/objects.cc +3533 -2885
  246. data/vendor/v8/src/objects.h +1352 -1131
  247. data/vendor/v8/src/optimizing-compiler-thread.cc +152 -0
  248. data/vendor/v8/src/optimizing-compiler-thread.h +111 -0
  249. data/vendor/v8/src/parser.cc +390 -500
  250. data/vendor/v8/src/parser.h +45 -33
  251. data/vendor/v8/src/platform-cygwin.cc +10 -21
  252. data/vendor/v8/src/platform-freebsd.cc +36 -41
  253. data/vendor/v8/src/platform-linux.cc +160 -124
  254. data/vendor/v8/src/platform-macos.cc +30 -27
  255. data/vendor/v8/src/platform-nullos.cc +17 -1
  256. data/vendor/v8/src/platform-openbsd.cc +19 -50
  257. data/vendor/v8/src/platform-posix.cc +14 -0
  258. data/vendor/v8/src/platform-solaris.cc +20 -53
  259. data/vendor/v8/src/platform-win32.cc +49 -26
  260. data/vendor/v8/src/platform.h +40 -1
  261. data/vendor/v8/src/preparser.cc +8 -5
  262. data/vendor/v8/src/preparser.h +2 -2
  263. data/vendor/v8/src/prettyprinter.cc +16 -0
  264. data/vendor/v8/src/prettyprinter.h +2 -0
  265. data/vendor/v8/src/profile-generator-inl.h +1 -0
  266. data/vendor/v8/src/profile-generator.cc +209 -147
  267. data/vendor/v8/src/profile-generator.h +15 -12
  268. data/vendor/v8/src/property-details.h +46 -31
  269. data/vendor/v8/src/property.cc +27 -46
  270. data/vendor/v8/src/property.h +163 -83
  271. data/vendor/v8/src/proxy.js +7 -2
  272. data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +4 -13
  273. data/vendor/v8/src/regexp-macro-assembler-irregexp.h +1 -2
  274. data/vendor/v8/src/regexp-macro-assembler-tracer.cc +1 -11
  275. data/vendor/v8/src/regexp-macro-assembler-tracer.h +0 -1
  276. data/vendor/v8/src/regexp-macro-assembler.cc +31 -14
  277. data/vendor/v8/src/regexp-macro-assembler.h +14 -11
  278. data/vendor/v8/src/regexp-stack.cc +1 -0
  279. data/vendor/v8/src/regexp.js +9 -8
  280. data/vendor/v8/src/rewriter.cc +18 -7
  281. data/vendor/v8/src/runtime-profiler.cc +52 -43
  282. data/vendor/v8/src/runtime-profiler.h +0 -25
  283. data/vendor/v8/src/runtime.cc +2006 -2023
  284. data/vendor/v8/src/runtime.h +56 -49
  285. data/vendor/v8/src/safepoint-table.cc +12 -18
  286. data/vendor/v8/src/safepoint-table.h +11 -8
  287. data/vendor/v8/src/scanner.cc +1 -0
  288. data/vendor/v8/src/scanner.h +4 -10
  289. data/vendor/v8/src/scopeinfo.cc +35 -9
  290. data/vendor/v8/src/scopeinfo.h +64 -3
  291. data/vendor/v8/src/scopes.cc +251 -156
  292. data/vendor/v8/src/scopes.h +61 -27
  293. data/vendor/v8/src/serialize.cc +348 -396
  294. data/vendor/v8/src/serialize.h +125 -114
  295. data/vendor/v8/src/small-pointer-list.h +11 -11
  296. data/vendor/v8/src/{smart-array-pointer.h → smart-pointers.h} +64 -15
  297. data/vendor/v8/src/snapshot-common.cc +64 -15
  298. data/vendor/v8/src/snapshot-empty.cc +7 -1
  299. data/vendor/v8/src/snapshot.h +9 -2
  300. data/vendor/v8/src/spaces-inl.h +17 -0
  301. data/vendor/v8/src/spaces.cc +477 -183
  302. data/vendor/v8/src/spaces.h +238 -58
  303. data/vendor/v8/src/splay-tree-inl.h +8 -7
  304. data/vendor/v8/src/splay-tree.h +24 -10
  305. data/vendor/v8/src/store-buffer.cc +12 -5
  306. data/vendor/v8/src/store-buffer.h +2 -4
  307. data/vendor/v8/src/string-search.h +22 -6
  308. data/vendor/v8/src/string-stream.cc +11 -8
  309. data/vendor/v8/src/string.js +47 -15
  310. data/vendor/v8/src/stub-cache.cc +461 -224
  311. data/vendor/v8/src/stub-cache.h +164 -102
  312. data/vendor/v8/src/sweeper-thread.cc +105 -0
  313. data/vendor/v8/src/sweeper-thread.h +81 -0
  314. data/vendor/v8/src/token.h +1 -0
  315. data/vendor/v8/src/transitions-inl.h +220 -0
  316. data/vendor/v8/src/transitions.cc +160 -0
  317. data/vendor/v8/src/transitions.h +207 -0
  318. data/vendor/v8/src/type-info.cc +182 -181
  319. data/vendor/v8/src/type-info.h +31 -19
  320. data/vendor/v8/src/unicode-inl.h +62 -106
  321. data/vendor/v8/src/unicode.cc +57 -67
  322. data/vendor/v8/src/unicode.h +45 -91
  323. data/vendor/v8/src/uri.js +57 -29
  324. data/vendor/v8/src/utils.h +105 -5
  325. data/vendor/v8/src/v8-counters.cc +54 -11
  326. data/vendor/v8/src/v8-counters.h +134 -19
  327. data/vendor/v8/src/v8.cc +29 -29
  328. data/vendor/v8/src/v8.h +1 -0
  329. data/vendor/v8/src/v8conversions.cc +26 -22
  330. data/vendor/v8/src/v8globals.h +56 -43
  331. data/vendor/v8/src/v8natives.js +83 -30
  332. data/vendor/v8/src/v8threads.cc +42 -21
  333. data/vendor/v8/src/v8threads.h +4 -1
  334. data/vendor/v8/src/v8utils.cc +9 -93
  335. data/vendor/v8/src/v8utils.h +37 -33
  336. data/vendor/v8/src/variables.cc +6 -3
  337. data/vendor/v8/src/variables.h +6 -13
  338. data/vendor/v8/src/version.cc +2 -2
  339. data/vendor/v8/src/vm-state-inl.h +11 -0
  340. data/vendor/v8/src/x64/assembler-x64-inl.h +39 -8
  341. data/vendor/v8/src/x64/assembler-x64.cc +78 -64
  342. data/vendor/v8/src/x64/assembler-x64.h +38 -33
  343. data/vendor/v8/src/x64/builtins-x64.cc +105 -7
  344. data/vendor/v8/src/x64/code-stubs-x64.cc +790 -413
  345. data/vendor/v8/src/x64/code-stubs-x64.h +10 -106
  346. data/vendor/v8/src/x64/codegen-x64.cc +210 -8
  347. data/vendor/v8/src/x64/codegen-x64.h +20 -1
  348. data/vendor/v8/src/x64/deoptimizer-x64.cc +336 -75
  349. data/vendor/v8/src/x64/disasm-x64.cc +15 -0
  350. data/vendor/v8/src/x64/frames-x64.h +0 -14
  351. data/vendor/v8/src/x64/full-codegen-x64.cc +293 -270
  352. data/vendor/v8/src/x64/ic-x64.cc +153 -251
  353. data/vendor/v8/src/x64/lithium-codegen-x64.cc +1379 -531
  354. data/vendor/v8/src/x64/lithium-codegen-x64.h +67 -23
  355. data/vendor/v8/src/x64/lithium-gap-resolver-x64.cc +2 -2
  356. data/vendor/v8/src/x64/lithium-x64.cc +349 -289
  357. data/vendor/v8/src/x64/lithium-x64.h +460 -250
  358. data/vendor/v8/src/x64/macro-assembler-x64.cc +350 -177
  359. data/vendor/v8/src/x64/macro-assembler-x64.h +67 -49
  360. data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +46 -33
  361. data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +2 -3
  362. data/vendor/v8/src/x64/stub-cache-x64.cc +484 -653
  363. data/vendor/v8/src/zone-inl.h +9 -27
  364. data/vendor/v8/src/zone.cc +5 -5
  365. data/vendor/v8/src/zone.h +53 -27
  366. data/vendor/v8/test/benchmarks/testcfg.py +5 -0
  367. data/vendor/v8/test/cctest/cctest.cc +4 -0
  368. data/vendor/v8/test/cctest/cctest.gyp +3 -1
  369. data/vendor/v8/test/cctest/cctest.h +57 -9
  370. data/vendor/v8/test/cctest/cctest.status +15 -15
  371. data/vendor/v8/test/cctest/test-accessors.cc +26 -0
  372. data/vendor/v8/test/cctest/test-alloc.cc +22 -30
  373. data/vendor/v8/test/cctest/test-api.cc +1943 -314
  374. data/vendor/v8/test/cctest/test-assembler-arm.cc +133 -13
  375. data/vendor/v8/test/cctest/test-assembler-ia32.cc +1 -1
  376. data/vendor/v8/test/cctest/test-assembler-mips.cc +12 -0
  377. data/vendor/v8/test/cctest/test-ast.cc +4 -2
  378. data/vendor/v8/test/cctest/test-compiler.cc +61 -29
  379. data/vendor/v8/test/cctest/test-dataflow.cc +2 -2
  380. data/vendor/v8/test/cctest/test-debug.cc +212 -33
  381. data/vendor/v8/test/cctest/test-decls.cc +257 -11
  382. data/vendor/v8/test/cctest/test-dictionary.cc +24 -10
  383. data/vendor/v8/test/cctest/test-disasm-arm.cc +118 -1
  384. data/vendor/v8/test/cctest/test-disasm-ia32.cc +3 -2
  385. data/vendor/v8/test/cctest/test-flags.cc +14 -1
  386. data/vendor/v8/test/cctest/test-func-name-inference.cc +7 -4
  387. data/vendor/v8/test/cctest/test-global-object.cc +51 -0
  388. data/vendor/v8/test/cctest/test-hashing.cc +32 -23
  389. data/vendor/v8/test/cctest/test-heap-profiler.cc +131 -77
  390. data/vendor/v8/test/cctest/test-heap.cc +1084 -143
  391. data/vendor/v8/test/cctest/test-list.cc +1 -1
  392. data/vendor/v8/test/cctest/test-liveedit.cc +3 -2
  393. data/vendor/v8/test/cctest/test-lockers.cc +12 -13
  394. data/vendor/v8/test/cctest/test-log.cc +10 -8
  395. data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +2 -2
  396. data/vendor/v8/test/cctest/test-mark-compact.cc +44 -22
  397. data/vendor/v8/test/cctest/test-object-observe.cc +434 -0
  398. data/vendor/v8/test/cctest/test-parsing.cc +86 -39
  399. data/vendor/v8/test/cctest/test-platform-linux.cc +6 -0
  400. data/vendor/v8/test/cctest/test-platform-win32.cc +7 -0
  401. data/vendor/v8/test/cctest/test-random.cc +5 -4
  402. data/vendor/v8/test/cctest/test-regexp.cc +137 -101
  403. data/vendor/v8/test/cctest/test-serialize.cc +150 -230
  404. data/vendor/v8/test/cctest/test-sockets.cc +1 -1
  405. data/vendor/v8/test/cctest/test-spaces.cc +139 -0
  406. data/vendor/v8/test/cctest/test-strings.cc +736 -74
  407. data/vendor/v8/test/cctest/test-thread-termination.cc +10 -11
  408. data/vendor/v8/test/cctest/test-threads.cc +4 -4
  409. data/vendor/v8/test/cctest/test-utils.cc +16 -0
  410. data/vendor/v8/test/cctest/test-weakmaps.cc +7 -3
  411. data/vendor/v8/test/cctest/testcfg.py +64 -5
  412. data/vendor/v8/test/es5conform/testcfg.py +5 -0
  413. data/vendor/v8/test/message/message.status +1 -1
  414. data/vendor/v8/test/message/overwritten-builtins.out +3 -0
  415. data/vendor/v8/test/message/testcfg.py +89 -8
  416. data/vendor/v8/test/message/try-catch-finally-no-message.out +26 -26
  417. data/vendor/v8/test/mjsunit/accessor-map-sharing.js +18 -2
  418. data/vendor/v8/test/mjsunit/allocation-site-info.js +126 -0
  419. data/vendor/v8/test/mjsunit/array-bounds-check-removal.js +62 -1
  420. data/vendor/v8/test/mjsunit/array-iteration.js +1 -1
  421. data/vendor/v8/test/mjsunit/array-literal-transitions.js +2 -0
  422. data/vendor/v8/test/mjsunit/array-natives-elements.js +317 -0
  423. data/vendor/v8/test/mjsunit/array-reduce.js +8 -8
  424. data/vendor/v8/test/mjsunit/array-slice.js +12 -0
  425. data/vendor/v8/test/mjsunit/array-store-and-grow.js +4 -1
  426. data/vendor/v8/test/mjsunit/assert-opt-and-deopt.js +1 -1
  427. data/vendor/v8/test/mjsunit/bugs/bug-2337.js +53 -0
  428. data/vendor/v8/test/mjsunit/compare-known-objects-slow.js +69 -0
  429. data/vendor/v8/test/mjsunit/compiler/alloc-object-huge.js +3 -1
  430. data/vendor/v8/test/mjsunit/compiler/inline-accessors.js +368 -0
  431. data/vendor/v8/test/mjsunit/compiler/inline-arguments.js +87 -1
  432. data/vendor/v8/test/mjsunit/compiler/inline-closures.js +49 -0
  433. data/vendor/v8/test/mjsunit/compiler/inline-construct.js +55 -43
  434. data/vendor/v8/test/mjsunit/compiler/inline-literals.js +39 -0
  435. data/vendor/v8/test/mjsunit/compiler/multiply-add.js +69 -0
  436. data/vendor/v8/test/mjsunit/compiler/optimized-closures.js +57 -0
  437. data/vendor/v8/test/mjsunit/compiler/parallel-proto-change.js +44 -0
  438. data/vendor/v8/test/mjsunit/compiler/property-static.js +69 -0
  439. data/vendor/v8/test/mjsunit/compiler/proto-chain-constant.js +55 -0
  440. data/vendor/v8/test/mjsunit/compiler/proto-chain-load.js +44 -0
  441. data/vendor/v8/test/mjsunit/compiler/regress-gvn.js +3 -2
  442. data/vendor/v8/test/mjsunit/compiler/regress-or.js +6 -2
  443. data/vendor/v8/test/mjsunit/compiler/rotate.js +224 -0
  444. data/vendor/v8/test/mjsunit/compiler/uint32.js +173 -0
  445. data/vendor/v8/test/mjsunit/count-based-osr.js +2 -1
  446. data/vendor/v8/test/mjsunit/d8-os.js +3 -3
  447. data/vendor/v8/test/mjsunit/date-parse.js +3 -0
  448. data/vendor/v8/test/mjsunit/date.js +22 -0
  449. data/vendor/v8/test/mjsunit/debug-break-inline.js +1 -0
  450. data/vendor/v8/test/mjsunit/debug-evaluate-locals-optimized-double.js +22 -12
  451. data/vendor/v8/test/mjsunit/debug-evaluate-locals-optimized.js +21 -10
  452. data/vendor/v8/test/mjsunit/debug-liveedit-compile-error.js +60 -0
  453. data/vendor/v8/test/mjsunit/debug-liveedit-double-call.js +142 -0
  454. data/vendor/v8/test/mjsunit/debug-liveedit-literals.js +94 -0
  455. data/vendor/v8/test/mjsunit/debug-liveedit-restart-frame.js +153 -0
  456. data/vendor/v8/test/mjsunit/debug-multiple-breakpoints.js +1 -1
  457. data/vendor/v8/test/mjsunit/debug-script-breakpoints-closure.js +67 -0
  458. data/vendor/v8/test/mjsunit/debug-script-breakpoints-nested.js +82 -0
  459. data/vendor/v8/test/mjsunit/debug-script.js +4 -2
  460. data/vendor/v8/test/mjsunit/debug-set-variable-value.js +308 -0
  461. data/vendor/v8/test/mjsunit/debug-stepout-scope-part1.js +190 -0
  462. data/vendor/v8/test/mjsunit/debug-stepout-scope-part2.js +83 -0
  463. data/vendor/v8/test/mjsunit/debug-stepout-scope-part3.js +80 -0
  464. data/vendor/v8/test/mjsunit/debug-stepout-scope-part4.js +80 -0
  465. data/vendor/v8/test/mjsunit/debug-stepout-scope-part5.js +77 -0
  466. data/vendor/v8/test/mjsunit/debug-stepout-scope-part6.js +79 -0
  467. data/vendor/v8/test/mjsunit/debug-stepout-scope-part7.js +79 -0
  468. data/vendor/v8/test/mjsunit/{debug-stepout-scope.js → debug-stepout-scope-part8.js} +0 -189
  469. data/vendor/v8/test/mjsunit/delete-non-configurable.js +74 -0
  470. data/vendor/v8/test/mjsunit/deopt-minus-zero.js +56 -0
  471. data/vendor/v8/test/mjsunit/elements-kind.js +6 -4
  472. data/vendor/v8/test/mjsunit/elements-length-no-holey.js +33 -0
  473. data/vendor/v8/test/mjsunit/elements-transition-hoisting.js +46 -19
  474. data/vendor/v8/test/mjsunit/error-accessors.js +54 -0
  475. data/vendor/v8/test/mjsunit/error-constructors.js +1 -14
  476. data/vendor/v8/test/mjsunit/error-tostring.js +8 -0
  477. data/vendor/v8/test/mjsunit/eval-stack-trace.js +204 -0
  478. data/vendor/v8/test/mjsunit/external-array.js +364 -1
  479. data/vendor/v8/test/mjsunit/fast-array-length.js +37 -0
  480. data/vendor/v8/test/mjsunit/fast-non-keyed.js +113 -0
  481. data/vendor/v8/test/mjsunit/fast-prototype.js +117 -0
  482. data/vendor/v8/test/mjsunit/function-call.js +14 -18
  483. data/vendor/v8/test/mjsunit/fuzz-natives-part1.js +230 -0
  484. data/vendor/v8/test/mjsunit/fuzz-natives-part2.js +229 -0
  485. data/vendor/v8/test/mjsunit/fuzz-natives-part3.js +229 -0
  486. data/vendor/v8/test/mjsunit/{fuzz-natives.js → fuzz-natives-part4.js} +12 -2
  487. data/vendor/v8/test/mjsunit/generated-transition-stub.js +218 -0
  488. data/vendor/v8/test/mjsunit/greedy.js +1 -1
  489. data/vendor/v8/test/mjsunit/harmony/block-conflicts.js +2 -1
  490. data/vendor/v8/test/mjsunit/harmony/block-let-crankshaft.js +1 -1
  491. data/vendor/v8/test/mjsunit/harmony/collections.js +69 -11
  492. data/vendor/v8/test/mjsunit/harmony/debug-blockscopes.js +2 -2
  493. data/vendor/v8/test/mjsunit/harmony/module-linking.js +180 -3
  494. data/vendor/v8/test/mjsunit/harmony/module-parsing.js +31 -0
  495. data/vendor/v8/test/mjsunit/harmony/module-recompile.js +87 -0
  496. data/vendor/v8/test/mjsunit/harmony/module-resolution.js +15 -2
  497. data/vendor/v8/test/mjsunit/harmony/object-observe.js +1056 -0
  498. data/vendor/v8/test/mjsunit/harmony/proxies-json.js +178 -0
  499. data/vendor/v8/test/mjsunit/harmony/proxies.js +25 -10
  500. data/vendor/v8/test/mjsunit/json-parser-recursive.js +33 -0
  501. data/vendor/v8/test/mjsunit/json-stringify-recursive.js +52 -0
  502. data/vendor/v8/test/mjsunit/json.js +38 -2
  503. data/vendor/v8/test/mjsunit/json2.js +153 -0
  504. data/vendor/v8/test/mjsunit/limit-locals.js +5 -4
  505. data/vendor/v8/test/mjsunit/manual-parallel-recompile.js +79 -0
  506. data/vendor/v8/test/mjsunit/math-exp-precision.js +64 -0
  507. data/vendor/v8/test/mjsunit/math-floor-negative.js +59 -0
  508. data/vendor/v8/test/mjsunit/math-floor-of-div-minus-zero.js +41 -0
  509. data/vendor/v8/test/mjsunit/math-floor-of-div-nosudiv.js +288 -0
  510. data/vendor/v8/test/mjsunit/math-floor-of-div.js +81 -9
  511. data/vendor/v8/test/mjsunit/{math-floor.js → math-floor-part1.js} +1 -72
  512. data/vendor/v8/test/mjsunit/math-floor-part2.js +76 -0
  513. data/vendor/v8/test/mjsunit/math-floor-part3.js +78 -0
  514. data/vendor/v8/test/mjsunit/math-floor-part4.js +76 -0
  515. data/vendor/v8/test/mjsunit/mirror-object.js +43 -9
  516. data/vendor/v8/test/mjsunit/mjsunit.js +1 -1
  517. data/vendor/v8/test/mjsunit/mjsunit.status +52 -27
  518. data/vendor/v8/test/mjsunit/mul-exhaustive-part1.js +491 -0
  519. data/vendor/v8/test/mjsunit/mul-exhaustive-part10.js +470 -0
  520. data/vendor/v8/test/mjsunit/mul-exhaustive-part2.js +525 -0
  521. data/vendor/v8/test/mjsunit/mul-exhaustive-part3.js +532 -0
  522. data/vendor/v8/test/mjsunit/mul-exhaustive-part4.js +509 -0
  523. data/vendor/v8/test/mjsunit/mul-exhaustive-part5.js +505 -0
  524. data/vendor/v8/test/mjsunit/mul-exhaustive-part6.js +554 -0
  525. data/vendor/v8/test/mjsunit/mul-exhaustive-part7.js +497 -0
  526. data/vendor/v8/test/mjsunit/mul-exhaustive-part8.js +526 -0
  527. data/vendor/v8/test/mjsunit/mul-exhaustive-part9.js +533 -0
  528. data/vendor/v8/test/mjsunit/new-function.js +34 -0
  529. data/vendor/v8/test/mjsunit/numops-fuzz-part1.js +1172 -0
  530. data/vendor/v8/test/mjsunit/numops-fuzz-part2.js +1178 -0
  531. data/vendor/v8/test/mjsunit/numops-fuzz-part3.js +1178 -0
  532. data/vendor/v8/test/mjsunit/numops-fuzz-part4.js +1177 -0
  533. data/vendor/v8/test/mjsunit/object-define-property.js +107 -2
  534. data/vendor/v8/test/mjsunit/override-read-only-property.js +6 -4
  535. data/vendor/v8/test/mjsunit/packed-elements.js +2 -2
  536. data/vendor/v8/test/mjsunit/parse-int-float.js +4 -4
  537. data/vendor/v8/test/mjsunit/pixel-array-rounding.js +1 -1
  538. data/vendor/v8/test/mjsunit/readonly.js +228 -0
  539. data/vendor/v8/test/mjsunit/regexp-capture-3.js +16 -18
  540. data/vendor/v8/test/mjsunit/regexp-capture.js +2 -0
  541. data/vendor/v8/test/mjsunit/regexp-global.js +122 -0
  542. data/vendor/v8/test/mjsunit/regexp-results-cache.js +78 -0
  543. data/vendor/v8/test/mjsunit/regress/regress-1117.js +12 -3
  544. data/vendor/v8/test/mjsunit/regress/regress-1118.js +1 -1
  545. data/vendor/v8/test/mjsunit/regress/regress-115100.js +36 -0
  546. data/vendor/v8/test/mjsunit/regress/regress-1199637.js +1 -3
  547. data/vendor/v8/test/mjsunit/regress/regress-121407.js +1 -1
  548. data/vendor/v8/test/mjsunit/regress/regress-131923.js +30 -0
  549. data/vendor/v8/test/mjsunit/regress/regress-131994.js +70 -0
  550. data/vendor/v8/test/mjsunit/regress/regress-133211.js +35 -0
  551. data/vendor/v8/test/mjsunit/regress/regress-133211b.js +39 -0
  552. data/vendor/v8/test/mjsunit/regress/regress-136048.js +34 -0
  553. data/vendor/v8/test/mjsunit/regress/regress-137768.js +73 -0
  554. data/vendor/v8/test/mjsunit/regress/regress-143967.js +34 -0
  555. data/vendor/v8/test/mjsunit/regress/regress-145201.js +107 -0
  556. data/vendor/v8/test/mjsunit/regress/regress-147497.js +45 -0
  557. data/vendor/v8/test/mjsunit/regress/regress-148378.js +38 -0
  558. data/vendor/v8/test/mjsunit/regress/regress-1563.js +1 -1
  559. data/vendor/v8/test/mjsunit/regress/regress-1591.js +48 -0
  560. data/vendor/v8/test/mjsunit/regress/regress-164442.js +45 -0
  561. data/vendor/v8/test/mjsunit/regress/regress-165637.js +61 -0
  562. data/vendor/v8/test/mjsunit/regress/regress-166379.js +39 -0
  563. data/vendor/v8/test/mjsunit/regress/regress-166553.js +33 -0
  564. data/vendor/v8/test/mjsunit/regress/regress-1692.js +1 -1
  565. data/vendor/v8/test/mjsunit/regress/regress-171641.js +40 -0
  566. data/vendor/v8/test/mjsunit/regress/regress-1980.js +1 -1
  567. data/vendor/v8/test/mjsunit/regress/regress-2073.js +99 -0
  568. data/vendor/v8/test/mjsunit/regress/regress-2119.js +36 -0
  569. data/vendor/v8/test/mjsunit/regress/regress-2156.js +39 -0
  570. data/vendor/v8/test/mjsunit/regress/regress-2163.js +70 -0
  571. data/vendor/v8/test/mjsunit/regress/regress-2170.js +58 -0
  572. data/vendor/v8/test/mjsunit/regress/regress-2172.js +35 -0
  573. data/vendor/v8/test/mjsunit/regress/regress-2185-2.js +145 -0
  574. data/vendor/v8/test/mjsunit/regress/regress-2185.js +38 -0
  575. data/vendor/v8/test/mjsunit/regress/regress-2186.js +49 -0
  576. data/vendor/v8/test/mjsunit/regress/regress-2193.js +58 -0
  577. data/vendor/v8/test/mjsunit/regress/regress-2219.js +32 -0
  578. data/vendor/v8/test/mjsunit/regress/regress-2225.js +65 -0
  579. data/vendor/v8/test/mjsunit/regress/regress-2226.js +36 -0
  580. data/vendor/v8/test/mjsunit/regress/regress-2234.js +41 -0
  581. data/vendor/v8/test/mjsunit/regress/regress-2243.js +31 -0
  582. data/vendor/v8/test/mjsunit/regress/regress-2249.js +33 -0
  583. data/vendor/v8/test/mjsunit/regress/regress-2250.js +68 -0
  584. data/vendor/v8/test/mjsunit/regress/regress-2261.js +113 -0
  585. data/vendor/v8/test/mjsunit/regress/regress-2263.js +30 -0
  586. data/vendor/v8/test/mjsunit/regress/regress-2284.js +32 -0
  587. data/vendor/v8/test/mjsunit/regress/regress-2285.js +32 -0
  588. data/vendor/v8/test/mjsunit/regress/regress-2286.js +32 -0
  589. data/vendor/v8/test/mjsunit/regress/regress-2289.js +34 -0
  590. data/vendor/v8/test/mjsunit/regress/regress-2291.js +36 -0
  591. data/vendor/v8/test/mjsunit/regress/regress-2294.js +70 -0
  592. data/vendor/v8/test/mjsunit/regress/regress-2296.js +40 -0
  593. data/vendor/v8/test/mjsunit/regress/regress-2315.js +40 -0
  594. data/vendor/v8/test/mjsunit/regress/regress-2318.js +66 -0
  595. data/vendor/v8/test/mjsunit/regress/regress-2322.js +36 -0
  596. data/vendor/v8/test/mjsunit/regress/regress-2326.js +54 -0
  597. data/vendor/v8/test/mjsunit/regress/regress-2336.js +53 -0
  598. data/vendor/v8/test/mjsunit/regress/regress-2339.js +59 -0
  599. data/vendor/v8/test/mjsunit/regress/regress-2346.js +123 -0
  600. data/vendor/v8/test/mjsunit/regress/regress-2373.js +29 -0
  601. data/vendor/v8/test/mjsunit/regress/regress-2374.js +33 -0
  602. data/vendor/v8/test/mjsunit/regress/regress-2398.js +41 -0
  603. data/vendor/v8/test/mjsunit/regress/regress-2410.js +36 -0
  604. data/vendor/v8/test/mjsunit/regress/regress-2416.js +75 -0
  605. data/vendor/v8/test/mjsunit/regress/regress-2419.js +37 -0
  606. data/vendor/v8/test/mjsunit/regress/regress-2433.js +36 -0
  607. data/vendor/v8/test/mjsunit/regress/regress-2437.js +156 -0
  608. data/vendor/v8/test/mjsunit/regress/regress-2438.js +52 -0
  609. data/vendor/v8/test/mjsunit/regress/regress-2443.js +129 -0
  610. data/vendor/v8/test/mjsunit/regress/regress-2444.js +120 -0
  611. data/vendor/v8/test/mjsunit/regress/regress-2489.js +50 -0
  612. data/vendor/v8/test/mjsunit/regress/regress-2499.js +40 -0
  613. data/vendor/v8/test/mjsunit/regress/regress-334.js +1 -1
  614. data/vendor/v8/test/mjsunit/regress/regress-492.js +39 -1
  615. data/vendor/v8/test/mjsunit/regress/regress-builtin-array-op.js +38 -0
  616. data/vendor/v8/test/mjsunit/regress/regress-cnlt-elements.js +43 -0
  617. data/vendor/v8/test/mjsunit/regress/regress-cnlt-enum-indices.js +45 -0
  618. data/vendor/v8/test/mjsunit/regress/regress-cntl-descriptors-enum.js +46 -0
  619. data/vendor/v8/test/mjsunit/regress/regress-convert-enum.js +60 -0
  620. data/vendor/v8/test/mjsunit/regress/regress-convert-enum2.js +46 -0
  621. data/vendor/v8/test/mjsunit/regress/regress-convert-transition.js +40 -0
  622. data/vendor/v8/test/mjsunit/regress/regress-crbug-119926.js +3 -1
  623. data/vendor/v8/test/mjsunit/regress/regress-crbug-125148.js +90 -0
  624. data/vendor/v8/test/mjsunit/regress/regress-crbug-134055.js +63 -0
  625. data/vendor/v8/test/mjsunit/regress/regress-crbug-134609.js +59 -0
  626. data/vendor/v8/test/mjsunit/regress/regress-crbug-135008.js +45 -0
  627. data/vendor/v8/test/mjsunit/regress/regress-crbug-135066.js +55 -0
  628. data/vendor/v8/test/mjsunit/regress/regress-crbug-137689.js +47 -0
  629. data/vendor/v8/test/mjsunit/regress/regress-crbug-138887.js +48 -0
  630. data/vendor/v8/test/mjsunit/regress/regress-crbug-140083.js +44 -0
  631. data/vendor/v8/test/mjsunit/regress/regress-crbug-142087.js +38 -0
  632. data/vendor/v8/test/mjsunit/regress/regress-crbug-142218.js +44 -0
  633. data/vendor/v8/test/mjsunit/regress/regress-crbug-145961.js +39 -0
  634. data/vendor/v8/test/mjsunit/regress/regress-crbug-146910.js +33 -0
  635. data/vendor/v8/test/mjsunit/regress/regress-crbug-147475.js +48 -0
  636. data/vendor/v8/test/mjsunit/regress/regress-crbug-148376.js +35 -0
  637. data/vendor/v8/test/mjsunit/regress/regress-crbug-150545.js +53 -0
  638. data/vendor/v8/test/mjsunit/regress/regress-crbug-150729.js +39 -0
  639. data/vendor/v8/test/mjsunit/regress/regress-crbug-157019.js +54 -0
  640. data/vendor/v8/test/mjsunit/regress/regress-crbug-157520.js +38 -0
  641. data/vendor/v8/test/mjsunit/regress/regress-crbug-158185.js +39 -0
  642. data/vendor/v8/test/mjsunit/regress/regress-crbug-160010.js +35 -0
  643. data/vendor/v8/test/mjsunit/regress/regress-crbug-162085.js +71 -0
  644. data/vendor/v8/test/mjsunit/regress/regress-crbug-168545.js +34 -0
  645. data/vendor/v8/test/mjsunit/regress/regress-crbug-170856.js +33 -0
  646. data/vendor/v8/test/mjsunit/regress/regress-crbug-172345.js +34 -0
  647. data/vendor/v8/test/mjsunit/regress/regress-crbug-173974.js +36 -0
  648. data/vendor/v8/test/mjsunit/regress/regress-crbug-18639.js +9 -5
  649. data/vendor/v8/test/mjsunit/regress/regress-debug-code-recompilation.js +2 -1
  650. data/vendor/v8/test/mjsunit/regress/regress-deep-proto.js +45 -0
  651. data/vendor/v8/test/mjsunit/regress/regress-delete-empty-double.js +40 -0
  652. data/vendor/v8/test/mjsunit/regress/regress-iteration-order.js +42 -0
  653. data/vendor/v8/test/mjsunit/regress/regress-json-stringify-gc.js +41 -0
  654. data/vendor/v8/test/mjsunit/regress/regress-latin-1.js +78 -0
  655. data/vendor/v8/test/mjsunit/regress/regress-load-elements.js +49 -0
  656. data/vendor/v8/test/mjsunit/regress/regress-observe-empty-double-array.js +38 -0
  657. data/vendor/v8/test/mjsunit/regress/regress-undefined-store-keyed-fast-element.js +37 -0
  658. data/vendor/v8/test/mjsunit/shift-for-integer-div.js +59 -0
  659. data/vendor/v8/test/mjsunit/stack-traces-gc.js +119 -0
  660. data/vendor/v8/test/mjsunit/stack-traces-overflow.js +122 -0
  661. data/vendor/v8/test/mjsunit/stack-traces.js +39 -1
  662. data/vendor/v8/test/mjsunit/str-to-num.js +7 -2
  663. data/vendor/v8/test/mjsunit/strict-mode.js +36 -11
  664. data/vendor/v8/test/mjsunit/string-charcodeat.js +3 -0
  665. data/vendor/v8/test/mjsunit/string-natives.js +72 -0
  666. data/vendor/v8/test/mjsunit/string-split.js +17 -0
  667. data/vendor/v8/test/mjsunit/testcfg.py +76 -6
  668. data/vendor/v8/test/mjsunit/tools/tickprocessor.js +4 -1
  669. data/vendor/v8/test/mjsunit/try-finally-continue.js +72 -0
  670. data/vendor/v8/test/mjsunit/typed-array-slice.js +61 -0
  671. data/vendor/v8/test/mjsunit/unbox-double-arrays.js +2 -0
  672. data/vendor/v8/test/mjsunit/uri.js +12 -0
  673. data/vendor/v8/test/mjsunit/with-readonly.js +4 -2
  674. data/vendor/v8/test/mozilla/mozilla.status +19 -113
  675. data/vendor/v8/test/mozilla/testcfg.py +122 -3
  676. data/vendor/v8/test/preparser/preparser.status +5 -0
  677. data/vendor/v8/test/preparser/strict-identifiers.pyt +1 -1
  678. data/vendor/v8/test/preparser/testcfg.py +101 -5
  679. data/vendor/v8/test/sputnik/sputnik.status +1 -1
  680. data/vendor/v8/test/sputnik/testcfg.py +5 -0
  681. data/vendor/v8/test/test262/README +2 -2
  682. data/vendor/v8/test/test262/test262.status +13 -36
  683. data/vendor/v8/test/test262/testcfg.py +102 -8
  684. data/vendor/v8/tools/android-build.sh +0 -0
  685. data/vendor/v8/tools/android-ll-prof.sh +69 -0
  686. data/vendor/v8/tools/android-run.py +109 -0
  687. data/vendor/v8/tools/android-sync.sh +105 -0
  688. data/vendor/v8/tools/bash-completion.sh +0 -0
  689. data/vendor/v8/tools/check-static-initializers.sh +0 -0
  690. data/vendor/v8/tools/common-includes.sh +15 -22
  691. data/vendor/v8/tools/disasm.py +4 -4
  692. data/vendor/v8/tools/fuzz-harness.sh +0 -0
  693. data/vendor/v8/tools/gen-postmortem-metadata.py +6 -8
  694. data/vendor/v8/tools/grokdump.py +404 -129
  695. data/vendor/v8/tools/gyp/v8.gyp +105 -43
  696. data/vendor/v8/tools/linux-tick-processor +5 -5
  697. data/vendor/v8/tools/ll_prof.py +75 -15
  698. data/vendor/v8/tools/merge-to-branch.sh +2 -2
  699. data/vendor/v8/tools/plot-timer-events +70 -0
  700. data/vendor/v8/tools/plot-timer-events.js +510 -0
  701. data/vendor/v8/tools/presubmit.py +1 -0
  702. data/vendor/v8/tools/push-to-trunk.sh +14 -4
  703. data/vendor/v8/tools/run-llprof.sh +69 -0
  704. data/vendor/v8/tools/run-tests.py +372 -0
  705. data/vendor/v8/tools/run-valgrind.py +1 -1
  706. data/vendor/v8/tools/status-file-converter.py +39 -0
  707. data/vendor/v8/tools/test-server.py +224 -0
  708. data/vendor/v8/tools/test-wrapper-gypbuild.py +13 -16
  709. data/vendor/v8/tools/test.py +10 -19
  710. data/vendor/v8/tools/testrunner/README +174 -0
  711. data/vendor/v8/tools/testrunner/__init__.py +26 -0
  712. data/vendor/v8/tools/testrunner/local/__init__.py +26 -0
  713. data/vendor/v8/tools/testrunner/local/commands.py +153 -0
  714. data/vendor/v8/tools/testrunner/local/execution.py +182 -0
  715. data/vendor/v8/tools/testrunner/local/old_statusfile.py +460 -0
  716. data/vendor/v8/tools/testrunner/local/progress.py +238 -0
  717. data/vendor/v8/tools/testrunner/local/statusfile.py +145 -0
  718. data/vendor/v8/tools/testrunner/local/testsuite.py +187 -0
  719. data/vendor/v8/tools/testrunner/local/utils.py +108 -0
  720. data/vendor/v8/tools/testrunner/local/verbose.py +99 -0
  721. data/vendor/v8/tools/testrunner/network/__init__.py +26 -0
  722. data/vendor/v8/tools/testrunner/network/distro.py +90 -0
  723. data/vendor/v8/tools/testrunner/network/endpoint.py +124 -0
  724. data/vendor/v8/tools/testrunner/network/network_execution.py +253 -0
  725. data/vendor/v8/tools/testrunner/network/perfdata.py +120 -0
  726. data/vendor/v8/tools/testrunner/objects/__init__.py +26 -0
  727. data/vendor/v8/tools/testrunner/objects/context.py +50 -0
  728. data/vendor/v8/tools/testrunner/objects/output.py +60 -0
  729. data/vendor/v8/tools/testrunner/objects/peer.py +80 -0
  730. data/vendor/v8/tools/testrunner/objects/testcase.py +83 -0
  731. data/vendor/v8/tools/testrunner/objects/workpacket.py +90 -0
  732. data/vendor/v8/tools/testrunner/server/__init__.py +26 -0
  733. data/vendor/v8/tools/testrunner/server/compression.py +111 -0
  734. data/vendor/v8/tools/testrunner/server/constants.py +51 -0
  735. data/vendor/v8/tools/testrunner/server/daemon.py +147 -0
  736. data/vendor/v8/tools/testrunner/server/local_handler.py +119 -0
  737. data/vendor/v8/tools/testrunner/server/main.py +245 -0
  738. data/vendor/v8/tools/testrunner/server/presence_handler.py +120 -0
  739. data/vendor/v8/tools/testrunner/server/signatures.py +63 -0
  740. data/vendor/v8/tools/testrunner/server/status_handler.py +112 -0
  741. data/vendor/v8/tools/testrunner/server/work_handler.py +150 -0
  742. data/vendor/v8/tools/tick-processor.html +168 -0
  743. data/vendor/v8/tools/tickprocessor-driver.js +5 -3
  744. data/vendor/v8/tools/tickprocessor.js +58 -15
  745. metadata +534 -30
  746. data/patches/add-freebsd9-and-freebsd10-to-gyp-GetFlavor.patch +0 -11
  747. data/patches/do-not-imply-vfp3-and-armv7.patch +0 -44
  748. data/patches/fPIC-on-x64.patch +0 -14
  749. data/vendor/v8/src/liveobjectlist-inl.h +0 -126
  750. data/vendor/v8/src/liveobjectlist.cc +0 -2631
  751. data/vendor/v8/src/liveobjectlist.h +0 -319
  752. data/vendor/v8/test/mjsunit/mul-exhaustive.js +0 -4629
  753. data/vendor/v8/test/mjsunit/numops-fuzz.js +0 -4609
  754. data/vendor/v8/test/mjsunit/regress/regress-1969.js +0 -5045
@@ -54,8 +54,8 @@ class SourceCodeCache BASE_EMBEDDED {
54
54
 
55
55
  bool Lookup(Vector<const char> name, Handle<SharedFunctionInfo>* handle) {
56
56
  for (int i = 0; i < cache_->length(); i+=2) {
57
- SeqAsciiString* str = SeqAsciiString::cast(cache_->get(i));
58
- if (str->IsEqualTo(name)) {
57
+ SeqOneByteString* str = SeqOneByteString::cast(cache_->get(i));
58
+ if (str->IsUtf8EqualTo(name)) {
59
59
  *handle = Handle<SharedFunctionInfo>(
60
60
  SharedFunctionInfo::cast(cache_->get(i + 1)));
61
61
  return true;
@@ -104,7 +104,7 @@ class Bootstrapper {
104
104
  void DetachGlobal(Handle<Context> env);
105
105
 
106
106
  // Reattach an outer global object to an environment.
107
- void ReattachGlobal(Handle<Context> env, Handle<Object> global_object);
107
+ void ReattachGlobal(Handle<Context> env, Handle<JSGlobalProxy> global_proxy);
108
108
 
109
109
  // Traverses the pointers for memory management.
110
110
  void Iterate(ObjectVisitor* v);
@@ -126,7 +126,7 @@ class Bootstrapper {
126
126
  char* AllocateAutoDeletedArray(int bytes);
127
127
 
128
128
  // Used for new context creation.
129
- bool InstallExtensions(Handle<Context> global_context,
129
+ bool InstallExtensions(Handle<Context> native_context,
130
130
  v8::ExtensionConfiguration* extensions);
131
131
 
132
132
  SourceCodeCache* extensions_cache() { return &extensions_cache_; }
@@ -35,6 +35,7 @@
35
35
  #include "ic-inl.h"
36
36
  #include "heap-profiler.h"
37
37
  #include "mark-compact.h"
38
+ #include "stub-cache.h"
38
39
  #include "vm-state-inl.h"
39
40
 
40
41
  namespace v8 {
@@ -199,11 +200,11 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
199
200
  array->set_length(Smi::FromInt(0));
200
201
  array->set_elements(heap->empty_fixed_array());
201
202
  if (!FLAG_smi_only_arrays) {
202
- Context* global_context = isolate->context()->global_context();
203
+ Context* native_context = isolate->context()->native_context();
203
204
  if (array->GetElementsKind() == GetInitialFastElementsKind() &&
204
- !global_context->js_array_maps()->IsUndefined()) {
205
+ !native_context->js_array_maps()->IsUndefined()) {
205
206
  FixedArray* map_array =
206
- FixedArray::cast(global_context->js_array_maps());
207
+ FixedArray::cast(native_context->js_array_maps());
207
208
  array->set_map(Map::cast(map_array->
208
209
  get(TERMINAL_FAST_ELEMENTS_KIND)));
209
210
  }
@@ -267,7 +268,7 @@ static MaybeObject* ArrayCodeGenericCommon(Arguments* args,
267
268
  maybe_elms = heap->AllocateFixedArrayWithHoles(number_of_elements);
268
269
  }
269
270
  FixedArrayBase* elms;
270
- if (!maybe_elms->To<FixedArrayBase>(&elms)) return maybe_elms;
271
+ if (!maybe_elms->To(&elms)) return maybe_elms;
271
272
 
272
273
  // Fill in the content
273
274
  switch (array->GetElementsKind()) {
@@ -312,7 +313,7 @@ BUILTIN(InternalArrayCodeGeneric) {
312
313
  return ArrayCodeGenericCommon(
313
314
  &args,
314
315
  isolate,
315
- isolate->context()->global_context()->internal_array_function());
316
+ isolate->context()->native_context()->internal_array_function());
316
317
  }
317
318
 
318
319
 
@@ -320,27 +321,19 @@ BUILTIN(ArrayCodeGeneric) {
320
321
  return ArrayCodeGenericCommon(
321
322
  &args,
322
323
  isolate,
323
- isolate->context()->global_context()->array_function());
324
+ isolate->context()->native_context()->array_function());
324
325
  }
325
326
 
326
327
 
327
- static void MoveElements(Heap* heap,
328
- AssertNoAllocation* no_gc,
329
- FixedArray* dst,
330
- int dst_index,
331
- FixedArray* src,
332
- int src_index,
333
- int len) {
328
+ static void MoveDoubleElements(FixedDoubleArray* dst,
329
+ int dst_index,
330
+ FixedDoubleArray* src,
331
+ int src_index,
332
+ int len) {
334
333
  if (len == 0) return;
335
- ASSERT(dst->map() != HEAP->fixed_cow_array_map());
336
334
  memmove(dst->data_start() + dst_index,
337
335
  src->data_start() + src_index,
338
- len * kPointerSize);
339
- WriteBarrierMode mode = dst->GetWriteBarrierMode(*no_gc);
340
- if (mode == UPDATE_WRITE_BARRIER) {
341
- heap->RecordWrites(dst->address(), dst->OffsetOfElementAt(dst_index), len);
342
- }
343
- heap->incremental_marking()->RecordWrites(dst);
336
+ len * kDoubleSize);
344
337
  }
345
338
 
346
339
 
@@ -350,24 +343,39 @@ static void FillWithHoles(Heap* heap, FixedArray* dst, int from, int to) {
350
343
  }
351
344
 
352
345
 
353
- static FixedArray* LeftTrimFixedArray(Heap* heap,
354
- FixedArray* elms,
355
- int to_trim) {
346
+ static void FillWithHoles(FixedDoubleArray* dst, int from, int to) {
347
+ for (int i = from; i < to; i++) {
348
+ dst->set_the_hole(i);
349
+ }
350
+ }
351
+
352
+
353
+ static FixedArrayBase* LeftTrimFixedArray(Heap* heap,
354
+ FixedArrayBase* elms,
355
+ int to_trim) {
356
+ Map* map = elms->map();
357
+ int entry_size;
358
+ if (elms->IsFixedArray()) {
359
+ entry_size = kPointerSize;
360
+ } else {
361
+ entry_size = kDoubleSize;
362
+ }
356
363
  ASSERT(elms->map() != HEAP->fixed_cow_array_map());
357
364
  // For now this trick is only applied to fixed arrays in new and paged space.
358
365
  // In large object space the object's start must coincide with chunk
359
366
  // and thus the trick is just not applicable.
360
367
  ASSERT(!HEAP->lo_space()->Contains(elms));
361
368
 
362
- STATIC_ASSERT(FixedArray::kMapOffset == 0);
363
- STATIC_ASSERT(FixedArray::kLengthOffset == kPointerSize);
364
- STATIC_ASSERT(FixedArray::kHeaderSize == 2 * kPointerSize);
369
+ STATIC_ASSERT(FixedArrayBase::kMapOffset == 0);
370
+ STATIC_ASSERT(FixedArrayBase::kLengthOffset == kPointerSize);
371
+ STATIC_ASSERT(FixedArrayBase::kHeaderSize == 2 * kPointerSize);
365
372
 
366
373
  Object** former_start = HeapObject::RawField(elms, 0);
367
374
 
368
375
  const int len = elms->length();
369
376
 
370
- if (to_trim > FixedArray::kHeaderSize / kPointerSize &&
377
+ if (to_trim * entry_size > FixedArrayBase::kHeaderSize &&
378
+ elms->IsFixedArray() &&
371
379
  !heap->new_space()->Contains(elms)) {
372
380
  // If we are doing a big trim in old space then we zap the space that was
373
381
  // formerly part of the array so that the GC (aided by the card-based
@@ -381,14 +389,15 @@ static FixedArray* LeftTrimFixedArray(Heap* heap,
381
389
  // Technically in new space this write might be omitted (except for
382
390
  // debug mode which iterates through the heap), but to play safer
383
391
  // we still do it.
384
- heap->CreateFillerObjectAt(elms->address(), to_trim * kPointerSize);
392
+ heap->CreateFillerObjectAt(elms->address(), to_trim * entry_size);
385
393
 
386
- former_start[to_trim] = heap->fixed_array_map();
387
- former_start[to_trim + 1] = Smi::FromInt(len - to_trim);
394
+ int new_start_index = to_trim * (entry_size / kPointerSize);
395
+ former_start[new_start_index] = map;
396
+ former_start[new_start_index + 1] = Smi::FromInt(len - to_trim);
388
397
 
389
398
  // Maintain marking consistency for HeapObjectIterator and
390
399
  // IncrementalMarking.
391
- int size_delta = to_trim * kPointerSize;
400
+ int size_delta = to_trim * entry_size;
392
401
  if (heap->marking()->TransferMark(elms->address(),
393
402
  elms->address() + size_delta)) {
394
403
  MemoryChunk::IncrementLiveBytesFromMutator(elms->address(), -size_delta);
@@ -396,13 +405,13 @@ static FixedArray* LeftTrimFixedArray(Heap* heap,
396
405
 
397
406
  HEAP_PROFILE(heap, ObjectMoveEvent(elms->address(),
398
407
  elms->address() + size_delta));
399
- return FixedArray::cast(HeapObject::FromAddress(
400
- elms->address() + to_trim * kPointerSize));
408
+ return FixedArrayBase::cast(HeapObject::FromAddress(
409
+ elms->address() + to_trim * entry_size));
401
410
  }
402
411
 
403
412
 
404
413
  static bool ArrayPrototypeHasNoElements(Heap* heap,
405
- Context* global_context,
414
+ Context* native_context,
406
415
  JSObject* array_proto) {
407
416
  // This method depends on non writability of Object and Array prototype
408
417
  // fields.
@@ -411,7 +420,7 @@ static bool ArrayPrototypeHasNoElements(Heap* heap,
411
420
  Object* proto = array_proto->GetPrototype();
412
421
  if (proto == heap->null_value()) return false;
413
422
  array_proto = JSObject::cast(proto);
414
- if (array_proto != global_context->initial_object_prototype()) return false;
423
+ if (array_proto != native_context->initial_object_prototype()) return false;
415
424
  if (array_proto->elements() != heap->empty_fixed_array()) return false;
416
425
  return array_proto->GetPrototype()->IsNull();
417
426
  }
@@ -426,19 +435,14 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
426
435
  Map* map = elms->map();
427
436
  if (map == heap->fixed_array_map()) {
428
437
  if (args == NULL || array->HasFastObjectElements()) return elms;
429
- if (array->HasFastDoubleElements()) {
430
- ASSERT(elms == heap->empty_fixed_array());
431
- MaybeObject* maybe_transition =
432
- array->TransitionElementsKind(FAST_ELEMENTS);
433
- if (maybe_transition->IsFailure()) return maybe_transition;
434
- return elms;
435
- }
436
438
  } else if (map == heap->fixed_cow_array_map()) {
437
439
  MaybeObject* maybe_writable_result = array->EnsureWritableFastElements();
438
440
  if (args == NULL || array->HasFastObjectElements() ||
439
- maybe_writable_result->IsFailure()) {
441
+ !maybe_writable_result->To(&elms)) {
440
442
  return maybe_writable_result;
441
443
  }
444
+ } else if (map == heap->fixed_double_array_map()) {
445
+ if (args == NULL) return elms;
442
446
  } else {
443
447
  return NULL;
444
448
  }
@@ -448,24 +452,39 @@ static inline MaybeObject* EnsureJSArrayWithWritableFastElements(
448
452
  int args_length = args->length();
449
453
  if (first_added_arg >= args_length) return array->elements();
450
454
 
451
- MaybeObject* maybe_array = array->EnsureCanContainElements(
452
- args,
453
- first_added_arg,
454
- args_length - first_added_arg,
455
- DONT_ALLOW_DOUBLE_ELEMENTS);
456
- if (maybe_array->IsFailure()) return maybe_array;
457
- return array->elements();
455
+ ElementsKind origin_kind = array->map()->elements_kind();
456
+ ASSERT(!IsFastObjectElementsKind(origin_kind));
457
+ ElementsKind target_kind = origin_kind;
458
+ int arg_count = args->length() - first_added_arg;
459
+ Object** arguments = args->arguments() - first_added_arg - (arg_count - 1);
460
+ for (int i = 0; i < arg_count; i++) {
461
+ Object* arg = arguments[i];
462
+ if (arg->IsHeapObject()) {
463
+ if (arg->IsHeapNumber()) {
464
+ target_kind = FAST_DOUBLE_ELEMENTS;
465
+ } else {
466
+ target_kind = FAST_ELEMENTS;
467
+ break;
468
+ }
469
+ }
470
+ }
471
+ if (target_kind != origin_kind) {
472
+ MaybeObject* maybe_failure = array->TransitionElementsKind(target_kind);
473
+ if (maybe_failure->IsFailure()) return maybe_failure;
474
+ return array->elements();
475
+ }
476
+ return elms;
458
477
  }
459
478
 
460
479
 
461
480
  static inline bool IsJSArrayFastElementMovingAllowed(Heap* heap,
462
481
  JSArray* receiver) {
463
482
  if (!FLAG_clever_optimizations) return false;
464
- Context* global_context = heap->isolate()->context()->global_context();
483
+ Context* native_context = heap->isolate()->context()->native_context();
465
484
  JSObject* array_proto =
466
- JSObject::cast(global_context->array_function()->prototype());
485
+ JSObject::cast(native_context->array_function()->prototype());
467
486
  return receiver->GetPrototype() == array_proto &&
468
- ArrayPrototypeHasNoElements(heap, global_context, array_proto);
487
+ ArrayPrototypeHasNoElements(heap, native_context, array_proto);
469
488
  }
470
489
 
471
490
 
@@ -476,7 +495,7 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin(
476
495
  HandleScope handleScope(isolate);
477
496
 
478
497
  Handle<Object> js_builtin =
479
- GetProperty(Handle<JSObject>(isolate->global_context()->builtins()),
498
+ GetProperty(Handle<JSObject>(isolate->native_context()->builtins()),
480
499
  name);
481
500
  Handle<JSFunction> function = Handle<JSFunction>::cast(js_builtin);
482
501
  int argc = args.length() - 1;
@@ -498,127 +517,200 @@ MUST_USE_RESULT static MaybeObject* CallJsBuiltin(
498
517
  BUILTIN(ArrayPush) {
499
518
  Heap* heap = isolate->heap();
500
519
  Object* receiver = *args.receiver();
501
- Object* elms_obj;
502
- { MaybeObject* maybe_elms_obj =
503
- EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 1);
504
- if (maybe_elms_obj == NULL) {
505
- return CallJsBuiltin(isolate, "ArrayPush", args);
506
- }
507
- if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
520
+ FixedArrayBase* elms_obj;
521
+ MaybeObject* maybe_elms_obj =
522
+ EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 1);
523
+ if (maybe_elms_obj == NULL) {
524
+ return CallJsBuiltin(isolate, "ArrayPush", args);
508
525
  }
509
- FixedArray* elms = FixedArray::cast(elms_obj);
510
- JSArray* array = JSArray::cast(receiver);
526
+ if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
511
527
 
512
- int len = Smi::cast(array->length())->value();
513
- int to_add = args.length() - 1;
514
- if (to_add == 0) {
515
- return Smi::FromInt(len);
528
+ if (FLAG_harmony_observation &&
529
+ JSObject::cast(receiver)->map()->is_observed()) {
530
+ return CallJsBuiltin(isolate, "ArrayPush", args);
516
531
  }
517
- // Currently fixed arrays cannot grow too big, so
518
- // we should never hit this case.
519
- ASSERT(to_add <= (Smi::kMaxValue - len));
520
532
 
521
- int new_length = len + to_add;
533
+ JSArray* array = JSArray::cast(receiver);
534
+ ElementsKind kind = array->GetElementsKind();
522
535
 
523
- if (new_length > elms->length()) {
524
- // New backing storage is needed.
525
- int capacity = new_length + (new_length >> 1) + 16;
526
- Object* obj;
527
- { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
528
- if (!maybe_obj->ToObject(&obj)) return maybe_obj;
536
+ if (IsFastSmiOrObjectElementsKind(kind)) {
537
+ FixedArray* elms = FixedArray::cast(elms_obj);
538
+
539
+ int len = Smi::cast(array->length())->value();
540
+ int to_add = args.length() - 1;
541
+ if (to_add == 0) {
542
+ return Smi::FromInt(len);
529
543
  }
530
- FixedArray* new_elms = FixedArray::cast(obj);
544
+ // Currently fixed arrays cannot grow too big, so
545
+ // we should never hit this case.
546
+ ASSERT(to_add <= (Smi::kMaxValue - len));
531
547
 
532
- ElementsKind kind = array->GetElementsKind();
533
- CopyObjectToObjectElements(elms, kind, 0, new_elms, kind, 0, len);
534
- FillWithHoles(heap, new_elms, new_length, capacity);
548
+ int new_length = len + to_add;
535
549
 
536
- elms = new_elms;
537
- }
550
+ if (new_length > elms->length()) {
551
+ // New backing storage is needed.
552
+ int capacity = new_length + (new_length >> 1) + 16;
553
+ FixedArray* new_elms;
554
+ MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
555
+ if (!maybe_obj->To(&new_elms)) return maybe_obj;
538
556
 
539
- // Add the provided values.
540
- AssertNoAllocation no_gc;
541
- WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
542
- for (int index = 0; index < to_add; index++) {
543
- elms->set(index + len, args[index + 1], mode);
544
- }
557
+ ElementsAccessor* accessor = array->GetElementsAccessor();
558
+ MaybeObject* maybe_failure = accessor->CopyElements(
559
+ NULL, 0, kind, new_elms, 0,
560
+ ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
561
+ ASSERT(!maybe_failure->IsFailure());
562
+ USE(maybe_failure);
545
563
 
546
- if (elms != array->elements()) {
547
- array->set_elements(elms);
548
- }
564
+ elms = new_elms;
565
+ }
549
566
 
550
- // Set the length.
551
- array->set_length(Smi::FromInt(new_length));
552
- return Smi::FromInt(new_length);
567
+ // Add the provided values.
568
+ AssertNoAllocation no_gc;
569
+ WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
570
+ for (int index = 0; index < to_add; index++) {
571
+ elms->set(index + len, args[index + 1], mode);
572
+ }
573
+
574
+ if (elms != array->elements()) {
575
+ array->set_elements(elms);
576
+ }
577
+
578
+ // Set the length.
579
+ array->set_length(Smi::FromInt(new_length));
580
+ return Smi::FromInt(new_length);
581
+ } else {
582
+ int len = Smi::cast(array->length())->value();
583
+ int elms_len = elms_obj->length();
584
+
585
+ int to_add = args.length() - 1;
586
+ if (to_add == 0) {
587
+ return Smi::FromInt(len);
588
+ }
589
+ // Currently fixed arrays cannot grow too big, so
590
+ // we should never hit this case.
591
+ ASSERT(to_add <= (Smi::kMaxValue - len));
592
+
593
+ int new_length = len + to_add;
594
+
595
+ FixedDoubleArray* new_elms;
596
+
597
+ if (new_length > elms_len) {
598
+ // New backing storage is needed.
599
+ int capacity = new_length + (new_length >> 1) + 16;
600
+ MaybeObject* maybe_obj =
601
+ heap->AllocateUninitializedFixedDoubleArray(capacity);
602
+ if (!maybe_obj->To(&new_elms)) return maybe_obj;
603
+
604
+ ElementsAccessor* accessor = array->GetElementsAccessor();
605
+ MaybeObject* maybe_failure = accessor->CopyElements(
606
+ NULL, 0, kind, new_elms, 0,
607
+ ElementsAccessor::kCopyToEndAndInitializeToHole, elms_obj);
608
+ ASSERT(!maybe_failure->IsFailure());
609
+ USE(maybe_failure);
610
+ } else {
611
+ // to_add is > 0 and new_length <= elms_len, so elms_obj cannot be the
612
+ // empty_fixed_array.
613
+ new_elms = FixedDoubleArray::cast(elms_obj);
614
+ }
615
+
616
+ // Add the provided values.
617
+ AssertNoAllocation no_gc;
618
+ int index;
619
+ for (index = 0; index < to_add; index++) {
620
+ Object* arg = args[index + 1];
621
+ new_elms->set(index + len, arg->Number());
622
+ }
623
+
624
+ if (new_elms != array->elements()) {
625
+ array->set_elements(new_elms);
626
+ }
627
+
628
+ // Set the length.
629
+ array->set_length(Smi::FromInt(new_length));
630
+ return Smi::FromInt(new_length);
631
+ }
553
632
  }
554
633
 
555
634
 
556
635
  BUILTIN(ArrayPop) {
557
636
  Heap* heap = isolate->heap();
558
637
  Object* receiver = *args.receiver();
559
- Object* elms_obj;
560
- { MaybeObject* maybe_elms_obj =
561
- EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
562
- if (maybe_elms_obj == NULL) return CallJsBuiltin(isolate, "ArrayPop", args);
563
- if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
564
- }
565
- FixedArray* elms = FixedArray::cast(elms_obj);
638
+ FixedArrayBase* elms_obj;
639
+ MaybeObject* maybe_elms =
640
+ EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
641
+ if (maybe_elms == NULL) return CallJsBuiltin(isolate, "ArrayPop", args);
642
+ if (!maybe_elms->To(&elms_obj)) return maybe_elms;
643
+
566
644
  JSArray* array = JSArray::cast(receiver);
567
645
 
646
+ if (FLAG_harmony_observation && array->map()->is_observed()) {
647
+ return CallJsBuiltin(isolate, "ArrayPop", args);
648
+ }
649
+
568
650
  int len = Smi::cast(array->length())->value();
569
651
  if (len == 0) return heap->undefined_value();
570
652
 
571
- // Get top element
572
- MaybeObject* top = elms->get(len - 1);
573
-
574
- // Set the length.
575
- array->set_length(Smi::FromInt(len - 1));
576
-
577
- if (!top->IsTheHole()) {
578
- // Delete the top element.
579
- elms->set_the_hole(len - 1);
580
- return top;
653
+ ElementsAccessor* accessor = array->GetElementsAccessor();
654
+ int new_length = len - 1;
655
+ MaybeObject* maybe_result;
656
+ if (accessor->HasElement(array, array, new_length, elms_obj)) {
657
+ maybe_result = accessor->Get(array, array, new_length, elms_obj);
658
+ } else {
659
+ maybe_result = array->GetPrototype()->GetElement(len - 1);
581
660
  }
582
-
583
- top = array->GetPrototype()->GetElement(len - 1);
584
-
585
- return top;
661
+ if (maybe_result->IsFailure()) return maybe_result;
662
+ MaybeObject* maybe_failure =
663
+ accessor->SetLength(array, Smi::FromInt(new_length));
664
+ if (maybe_failure->IsFailure()) return maybe_failure;
665
+ return maybe_result;
586
666
  }
587
667
 
588
668
 
589
669
  BUILTIN(ArrayShift) {
590
670
  Heap* heap = isolate->heap();
591
671
  Object* receiver = *args.receiver();
592
- Object* elms_obj;
593
- { MaybeObject* maybe_elms_obj =
594
- EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
595
- if (maybe_elms_obj == NULL)
596
- return CallJsBuiltin(isolate, "ArrayShift", args);
597
- if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
598
- }
672
+ FixedArrayBase* elms_obj;
673
+ MaybeObject* maybe_elms_obj =
674
+ EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
675
+ if (maybe_elms_obj == NULL)
676
+ return CallJsBuiltin(isolate, "ArrayShift", args);
677
+ if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
678
+
599
679
  if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) {
600
680
  return CallJsBuiltin(isolate, "ArrayShift", args);
601
681
  }
602
- FixedArray* elms = FixedArray::cast(elms_obj);
603
682
  JSArray* array = JSArray::cast(receiver);
604
- ASSERT(array->HasFastSmiOrObjectElements());
683
+
684
+ if (FLAG_harmony_observation && array->map()->is_observed()) {
685
+ return CallJsBuiltin(isolate, "ArrayShift", args);
686
+ }
605
687
 
606
688
  int len = Smi::cast(array->length())->value();
607
689
  if (len == 0) return heap->undefined_value();
608
690
 
609
691
  // Get first element
610
- Object* first = elms->get(0);
692
+ ElementsAccessor* accessor = array->GetElementsAccessor();
693
+ Object* first;
694
+ MaybeObject* maybe_first = accessor->Get(receiver, array, 0, elms_obj);
695
+ if (!maybe_first->To(&first)) return maybe_first;
611
696
  if (first->IsTheHole()) {
612
697
  first = heap->undefined_value();
613
698
  }
614
699
 
615
- if (!heap->lo_space()->Contains(elms)) {
616
- array->set_elements(LeftTrimFixedArray(heap, elms, 1));
700
+ if (!heap->lo_space()->Contains(elms_obj)) {
701
+ array->set_elements(LeftTrimFixedArray(heap, elms_obj, 1));
617
702
  } else {
618
703
  // Shift the elements.
619
- AssertNoAllocation no_gc;
620
- MoveElements(heap, &no_gc, elms, 0, elms, 1, len - 1);
621
- elms->set(len - 1, heap->the_hole_value());
704
+ if (elms_obj->IsFixedArray()) {
705
+ FixedArray* elms = FixedArray::cast(elms_obj);
706
+ AssertNoAllocation no_gc;
707
+ heap->MoveElements(elms, 0, 1, len - 1);
708
+ elms->set(len - 1, heap->the_hole_value());
709
+ } else {
710
+ FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj);
711
+ MoveDoubleElements(elms, 0, elms, 1, len - 1);
712
+ elms->set_the_hole(len - 1);
713
+ }
622
714
  }
623
715
 
624
716
  // Set the length.
@@ -631,19 +723,25 @@ BUILTIN(ArrayShift) {
631
723
  BUILTIN(ArrayUnshift) {
632
724
  Heap* heap = isolate->heap();
633
725
  Object* receiver = *args.receiver();
634
- Object* elms_obj;
635
- { MaybeObject* maybe_elms_obj =
636
- EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
637
- if (maybe_elms_obj == NULL)
638
- return CallJsBuiltin(isolate, "ArrayUnshift", args);
639
- if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
640
- }
726
+ FixedArrayBase* elms_obj;
727
+ MaybeObject* maybe_elms_obj =
728
+ EnsureJSArrayWithWritableFastElements(heap, receiver, NULL, 0);
729
+ if (maybe_elms_obj == NULL)
730
+ return CallJsBuiltin(isolate, "ArrayUnshift", args);
731
+ if (!maybe_elms_obj->To(&elms_obj)) return maybe_elms_obj;
732
+
641
733
  if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) {
642
734
  return CallJsBuiltin(isolate, "ArrayUnshift", args);
643
735
  }
644
- FixedArray* elms = FixedArray::cast(elms_obj);
645
736
  JSArray* array = JSArray::cast(receiver);
646
- ASSERT(array->HasFastSmiOrObjectElements());
737
+ if (!array->HasFastSmiOrObjectElements()) {
738
+ return CallJsBuiltin(isolate, "ArrayUnshift", args);
739
+ }
740
+ FixedArray* elms = FixedArray::cast(elms_obj);
741
+
742
+ if (FLAG_harmony_observation && array->map()->is_observed()) {
743
+ return CallJsBuiltin(isolate, "ArrayUnshift", args);
744
+ }
647
745
 
648
746
  int len = Smi::cast(array->length())->value();
649
747
  int to_add = args.length() - 1;
@@ -660,19 +758,23 @@ BUILTIN(ArrayUnshift) {
660
758
  if (new_length > elms->length()) {
661
759
  // New backing storage is needed.
662
760
  int capacity = new_length + (new_length >> 1) + 16;
663
- Object* obj;
664
- { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
665
- if (!maybe_obj->ToObject(&obj)) return maybe_obj;
666
- }
667
- FixedArray* new_elms = FixedArray::cast(obj);
761
+ FixedArray* new_elms;
762
+ MaybeObject* maybe_elms = heap->AllocateUninitializedFixedArray(capacity);
763
+ if (!maybe_elms->To(&new_elms)) return maybe_elms;
764
+
668
765
  ElementsKind kind = array->GetElementsKind();
669
- CopyObjectToObjectElements(elms, kind, 0, new_elms, kind, to_add, len);
670
- FillWithHoles(heap, new_elms, new_length, capacity);
766
+ ElementsAccessor* accessor = array->GetElementsAccessor();
767
+ MaybeObject* maybe_failure = accessor->CopyElements(
768
+ NULL, 0, kind, new_elms, to_add,
769
+ ElementsAccessor::kCopyToEndAndInitializeToHole, elms);
770
+ ASSERT(!maybe_failure->IsFailure());
771
+ USE(maybe_failure);
772
+
671
773
  elms = new_elms;
672
774
  array->set_elements(elms);
673
775
  } else {
674
776
  AssertNoAllocation no_gc;
675
- MoveElements(heap, &no_gc, elms, to_add, elms, 0, len);
777
+ heap->MoveElements(elms, to_add, 0, len);
676
778
  }
677
779
 
678
780
  // Add the provided values.
@@ -691,33 +793,41 @@ BUILTIN(ArrayUnshift) {
691
793
  BUILTIN(ArraySlice) {
692
794
  Heap* heap = isolate->heap();
693
795
  Object* receiver = *args.receiver();
694
- FixedArray* elms;
796
+ FixedArrayBase* elms;
695
797
  int len = -1;
696
798
  if (receiver->IsJSArray()) {
697
799
  JSArray* array = JSArray::cast(receiver);
698
- if (!array->HasFastSmiOrObjectElements() ||
699
- !IsJSArrayFastElementMovingAllowed(heap, array)) {
800
+ if (!IsJSArrayFastElementMovingAllowed(heap, array)) {
801
+ return CallJsBuiltin(isolate, "ArraySlice", args);
802
+ }
803
+
804
+ if (array->HasFastElements()) {
805
+ elms = array->elements();
806
+ } else {
700
807
  return CallJsBuiltin(isolate, "ArraySlice", args);
701
808
  }
702
809
 
703
- elms = FixedArray::cast(array->elements());
704
810
  len = Smi::cast(array->length())->value();
705
811
  } else {
706
812
  // Array.slice(arguments, ...) is quite a common idiom (notably more
707
813
  // than 50% of invocations in Web apps). Treat it in C++ as well.
708
814
  Map* arguments_map =
709
- isolate->context()->global_context()->arguments_boilerplate()->map();
815
+ isolate->context()->native_context()->arguments_boilerplate()->map();
710
816
 
711
817
  bool is_arguments_object_with_fast_elements =
712
- receiver->IsJSObject()
713
- && JSObject::cast(receiver)->map() == arguments_map
714
- && JSObject::cast(receiver)->HasFastSmiOrObjectElements();
818
+ receiver->IsJSObject() &&
819
+ JSObject::cast(receiver)->map() == arguments_map;
715
820
  if (!is_arguments_object_with_fast_elements) {
716
821
  return CallJsBuiltin(isolate, "ArraySlice", args);
717
822
  }
718
- elms = FixedArray::cast(JSObject::cast(receiver)->elements());
719
- Object* len_obj = JSObject::cast(receiver)
720
- ->InObjectPropertyAt(Heap::kArgumentsLengthIndex);
823
+ JSObject* object = JSObject::cast(receiver);
824
+
825
+ if (object->HasFastElements()) {
826
+ elms = object->elements();
827
+ } else {
828
+ return CallJsBuiltin(isolate, "ArraySlice", args);
829
+ }
830
+ Object* len_obj = object->InObjectPropertyAt(Heap::kArgumentsLengthIndex);
721
831
  if (!len_obj->IsSmi()) {
722
832
  return CallJsBuiltin(isolate, "ArraySlice", args);
723
833
  }
@@ -725,12 +835,10 @@ BUILTIN(ArraySlice) {
725
835
  if (len > elms->length()) {
726
836
  return CallJsBuiltin(isolate, "ArraySlice", args);
727
837
  }
728
- for (int i = 0; i < len; i++) {
729
- if (elms->get(i) == heap->the_hole_value()) {
730
- return CallJsBuiltin(isolate, "ArraySlice", args);
731
- }
732
- }
733
838
  }
839
+
840
+ JSObject* object = JSObject::cast(receiver);
841
+
734
842
  ASSERT(len >= 0);
735
843
  int n_arguments = args.length() - 1;
736
844
 
@@ -743,6 +851,12 @@ BUILTIN(ArraySlice) {
743
851
  Object* arg1 = args[1];
744
852
  if (arg1->IsSmi()) {
745
853
  relative_start = Smi::cast(arg1)->value();
854
+ } else if (arg1->IsHeapNumber()) {
855
+ double start = HeapNumber::cast(arg1)->value();
856
+ if (start < kMinInt || start > kMaxInt) {
857
+ return CallJsBuiltin(isolate, "ArraySlice", args);
858
+ }
859
+ relative_start = static_cast<int>(start);
746
860
  } else if (!arg1->IsUndefined()) {
747
861
  return CallJsBuiltin(isolate, "ArraySlice", args);
748
862
  }
@@ -750,6 +864,12 @@ BUILTIN(ArraySlice) {
750
864
  Object* arg2 = args[2];
751
865
  if (arg2->IsSmi()) {
752
866
  relative_end = Smi::cast(arg2)->value();
867
+ } else if (arg2->IsHeapNumber()) {
868
+ double end = HeapNumber::cast(arg2)->value();
869
+ if (end < kMinInt || end > kMaxInt) {
870
+ return CallJsBuiltin(isolate, "ArraySlice", args);
871
+ }
872
+ relative_end = static_cast<int>(end);
753
873
  } else if (!arg2->IsUndefined()) {
754
874
  return CallJsBuiltin(isolate, "ArraySlice", args);
755
875
  }
@@ -764,21 +884,40 @@ BUILTIN(ArraySlice) {
764
884
  int final = (relative_end < 0) ? Max(len + relative_end, 0)
765
885
  : Min(relative_end, len);
766
886
 
767
- ElementsKind elements_kind = JSObject::cast(receiver)->GetElementsKind();
768
-
769
887
  // Calculate the length of result array.
770
888
  int result_len = Max(final - k, 0);
771
889
 
772
- MaybeObject* maybe_array =
773
- heap->AllocateJSArrayAndStorage(elements_kind,
774
- result_len,
775
- result_len);
890
+ ElementsKind kind = object->GetElementsKind();
891
+ if (IsHoleyElementsKind(kind)) {
892
+ bool packed = true;
893
+ ElementsAccessor* accessor = ElementsAccessor::ForKind(kind);
894
+ for (int i = k; i < final; i++) {
895
+ if (!accessor->HasElement(object, object, i, elms)) {
896
+ packed = false;
897
+ break;
898
+ }
899
+ }
900
+ if (packed) {
901
+ kind = GetPackedElementsKind(kind);
902
+ } else if (!receiver->IsJSArray()) {
903
+ return CallJsBuiltin(isolate, "ArraySlice", args);
904
+ }
905
+ }
906
+
776
907
  JSArray* result_array;
908
+ MaybeObject* maybe_array = heap->AllocateJSArrayAndStorage(kind,
909
+ result_len,
910
+ result_len);
911
+
912
+ AssertNoAllocation no_gc;
913
+ if (result_len == 0) return maybe_array;
777
914
  if (!maybe_array->To(&result_array)) return maybe_array;
778
915
 
779
- CopyObjectToObjectElements(elms, elements_kind, k,
780
- FixedArray::cast(result_array->elements()),
781
- elements_kind, 0, result_len);
916
+ ElementsAccessor* accessor = object->GetElementsAccessor();
917
+ MaybeObject* maybe_failure = accessor->CopyElements(
918
+ NULL, k, kind, result_array->elements(), 0, result_len, elms);
919
+ ASSERT(!maybe_failure->IsFailure());
920
+ USE(maybe_failure);
782
921
 
783
922
  return result_array;
784
923
  }
@@ -787,19 +926,22 @@ BUILTIN(ArraySlice) {
787
926
  BUILTIN(ArraySplice) {
788
927
  Heap* heap = isolate->heap();
789
928
  Object* receiver = *args.receiver();
790
- Object* elms_obj;
791
- { MaybeObject* maybe_elms_obj =
792
- EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 3);
793
- if (maybe_elms_obj == NULL)
794
- return CallJsBuiltin(isolate, "ArraySplice", args);
795
- if (!maybe_elms_obj->ToObject(&elms_obj)) return maybe_elms_obj;
929
+ FixedArrayBase* elms_obj;
930
+ MaybeObject* maybe_elms =
931
+ EnsureJSArrayWithWritableFastElements(heap, receiver, &args, 3);
932
+ if (maybe_elms == NULL) {
933
+ return CallJsBuiltin(isolate, "ArraySplice", args);
796
934
  }
935
+ if (!maybe_elms->To(&elms_obj)) return maybe_elms;
936
+
797
937
  if (!IsJSArrayFastElementMovingAllowed(heap, JSArray::cast(receiver))) {
798
938
  return CallJsBuiltin(isolate, "ArraySplice", args);
799
939
  }
800
- FixedArray* elms = FixedArray::cast(elms_obj);
801
940
  JSArray* array = JSArray::cast(receiver);
802
- ASSERT(array->HasFastSmiOrObjectElements());
941
+
942
+ if (FLAG_harmony_observation && array->map()->is_observed()) {
943
+ return CallJsBuiltin(isolate, "ArraySplice", args);
944
+ }
803
945
 
804
946
  int len = Smi::cast(array->length())->value();
805
947
 
@@ -810,6 +952,12 @@ BUILTIN(ArraySplice) {
810
952
  Object* arg1 = args[1];
811
953
  if (arg1->IsSmi()) {
812
954
  relative_start = Smi::cast(arg1)->value();
955
+ } else if (arg1->IsHeapNumber()) {
956
+ double start = HeapNumber::cast(arg1)->value();
957
+ if (start < kMinInt || start > kMaxInt) {
958
+ return CallJsBuiltin(isolate, "ArraySplice", args);
959
+ }
960
+ relative_start = static_cast<int>(start);
813
961
  } else if (!arg1->IsUndefined()) {
814
962
  return CallJsBuiltin(isolate, "ArraySplice", args);
815
963
  }
@@ -839,51 +987,83 @@ BUILTIN(ArraySplice) {
839
987
  actual_delete_count = Min(Max(value, 0), len - actual_start);
840
988
  }
841
989
 
990
+ ElementsKind elements_kind = array->GetElementsKind();
991
+
992
+ int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0;
993
+ int new_length = len - actual_delete_count + item_count;
994
+
995
+ // For double mode we do not support changing the length.
996
+ if (new_length > len && IsFastDoubleElementsKind(elements_kind)) {
997
+ return CallJsBuiltin(isolate, "ArraySplice", args);
998
+ }
999
+
1000
+ if (new_length == 0) {
1001
+ MaybeObject* maybe_array = heap->AllocateJSArrayWithElements(
1002
+ elms_obj, elements_kind, actual_delete_count);
1003
+ if (maybe_array->IsFailure()) return maybe_array;
1004
+ array->set_elements(heap->empty_fixed_array());
1005
+ array->set_length(Smi::FromInt(0));
1006
+ return maybe_array;
1007
+ }
1008
+
842
1009
  JSArray* result_array = NULL;
843
- ElementsKind elements_kind =
844
- JSObject::cast(receiver)->GetElementsKind();
845
1010
  MaybeObject* maybe_array =
846
1011
  heap->AllocateJSArrayAndStorage(elements_kind,
847
1012
  actual_delete_count,
848
1013
  actual_delete_count);
849
1014
  if (!maybe_array->To(&result_array)) return maybe_array;
850
1015
 
851
- {
852
- // Fill newly created array.
853
- CopyObjectToObjectElements(elms, elements_kind, actual_start,
854
- FixedArray::cast(result_array->elements()),
855
- elements_kind, 0, actual_delete_count);
1016
+ if (actual_delete_count > 0) {
1017
+ AssertNoAllocation no_gc;
1018
+ ElementsAccessor* accessor = array->GetElementsAccessor();
1019
+ MaybeObject* maybe_failure = accessor->CopyElements(
1020
+ NULL, actual_start, elements_kind, result_array->elements(),
1021
+ 0, actual_delete_count, elms_obj);
1022
+ // Cannot fail since the origin and target array are of the same elements
1023
+ // kind.
1024
+ ASSERT(!maybe_failure->IsFailure());
1025
+ USE(maybe_failure);
856
1026
  }
857
1027
 
858
- int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0;
859
- int new_length = len - actual_delete_count + item_count;
860
-
861
1028
  bool elms_changed = false;
862
1029
  if (item_count < actual_delete_count) {
863
1030
  // Shrink the array.
864
- const bool trim_array = !heap->lo_space()->Contains(elms) &&
1031
+ const bool trim_array = !heap->lo_space()->Contains(elms_obj) &&
865
1032
  ((actual_start + item_count) <
866
1033
  (len - actual_delete_count - actual_start));
867
1034
  if (trim_array) {
868
1035
  const int delta = actual_delete_count - item_count;
869
1036
 
870
- {
1037
+ if (elms_obj->IsFixedDoubleArray()) {
1038
+ FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj);
1039
+ MoveDoubleElements(elms, delta, elms, 0, actual_start);
1040
+ } else {
1041
+ FixedArray* elms = FixedArray::cast(elms_obj);
871
1042
  AssertNoAllocation no_gc;
872
- MoveElements(heap, &no_gc, elms, delta, elms, 0, actual_start);
1043
+ heap->MoveElements(elms, delta, 0, actual_start);
873
1044
  }
874
1045
 
875
- elms = LeftTrimFixedArray(heap, elms, delta);
1046
+ elms_obj = LeftTrimFixedArray(heap, elms_obj, delta);
876
1047
 
877
1048
  elms_changed = true;
878
1049
  } else {
879
- AssertNoAllocation no_gc;
880
- MoveElements(heap, &no_gc,
881
- elms, actual_start + item_count,
882
- elms, actual_start + actual_delete_count,
883
- (len - actual_delete_count - actual_start));
884
- FillWithHoles(heap, elms, new_length, len);
1050
+ if (elms_obj->IsFixedDoubleArray()) {
1051
+ FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj);
1052
+ MoveDoubleElements(elms, actual_start + item_count,
1053
+ elms, actual_start + actual_delete_count,
1054
+ (len - actual_delete_count - actual_start));
1055
+ FillWithHoles(elms, new_length, len);
1056
+ } else {
1057
+ FixedArray* elms = FixedArray::cast(elms_obj);
1058
+ AssertNoAllocation no_gc;
1059
+ heap->MoveElements(elms, actual_start + item_count,
1060
+ actual_start + actual_delete_count,
1061
+ (len - actual_delete_count - actual_start));
1062
+ FillWithHoles(heap, elms, new_length, len);
1063
+ }
885
1064
  }
886
1065
  } else if (item_count > actual_delete_count) {
1066
+ FixedArray* elms = FixedArray::cast(elms_obj);
887
1067
  // Currently fixed arrays cannot grow too big, so
888
1068
  // we should never hit this case.
889
1069
  ASSERT((item_count - actual_delete_count) <= (Smi::kMaxValue - len));
@@ -892,48 +1072,60 @@ BUILTIN(ArraySplice) {
892
1072
  if (new_length > elms->length()) {
893
1073
  // New backing storage is needed.
894
1074
  int capacity = new_length + (new_length >> 1) + 16;
895
- Object* obj;
896
- { MaybeObject* maybe_obj =
897
- heap->AllocateUninitializedFixedArray(capacity);
898
- if (!maybe_obj->ToObject(&obj)) return maybe_obj;
899
- }
900
- FixedArray* new_elms = FixedArray::cast(obj);
1075
+ FixedArray* new_elms;
1076
+ MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
1077
+ if (!maybe_obj->To(&new_elms)) return maybe_obj;
901
1078
 
902
- {
1079
+ AssertNoAllocation no_gc;
1080
+
1081
+ ElementsKind kind = array->GetElementsKind();
1082
+ ElementsAccessor* accessor = array->GetElementsAccessor();
1083
+ if (actual_start > 0) {
903
1084
  // Copy the part before actual_start as is.
904
- ElementsKind kind = array->GetElementsKind();
905
- CopyObjectToObjectElements(elms, kind, 0,
906
- new_elms, kind, 0, actual_start);
907
- const int to_copy = len - actual_delete_count - actual_start;
908
- CopyObjectToObjectElements(elms, kind,
909
- actual_start + actual_delete_count,
910
- new_elms, kind,
911
- actual_start + item_count, to_copy);
1085
+ MaybeObject* maybe_failure = accessor->CopyElements(
1086
+ NULL, 0, kind, new_elms, 0, actual_start, elms);
1087
+ ASSERT(!maybe_failure->IsFailure());
1088
+ USE(maybe_failure);
912
1089
  }
913
-
914
- FillWithHoles(heap, new_elms, new_length, capacity);
915
-
916
- elms = new_elms;
1090
+ MaybeObject* maybe_failure = accessor->CopyElements(
1091
+ NULL, actual_start + actual_delete_count, kind, new_elms,
1092
+ actual_start + item_count,
1093
+ ElementsAccessor::kCopyToEndAndInitializeToHole, elms);
1094
+ ASSERT(!maybe_failure->IsFailure());
1095
+ USE(maybe_failure);
1096
+
1097
+ elms_obj = new_elms;
917
1098
  elms_changed = true;
918
1099
  } else {
919
1100
  AssertNoAllocation no_gc;
920
- MoveElements(heap, &no_gc,
921
- elms, actual_start + item_count,
922
- elms, actual_start + actual_delete_count,
923
- (len - actual_delete_count - actual_start));
1101
+ heap->MoveElements(elms, actual_start + item_count,
1102
+ actual_start + actual_delete_count,
1103
+ (len - actual_delete_count - actual_start));
924
1104
  }
925
1105
  }
926
1106
 
927
- AssertNoAllocation no_gc;
928
- WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
929
- for (int k = actual_start; k < actual_start + item_count; k++) {
930
- elms->set(k, args[3 + k - actual_start], mode);
1107
+ if (IsFastDoubleElementsKind(elements_kind)) {
1108
+ FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj);
1109
+ for (int k = actual_start; k < actual_start + item_count; k++) {
1110
+ Object* arg = args[3 + k - actual_start];
1111
+ if (arg->IsSmi()) {
1112
+ elms->set(k, Smi::cast(arg)->value());
1113
+ } else {
1114
+ elms->set(k, HeapNumber::cast(arg)->value());
1115
+ }
1116
+ }
1117
+ } else {
1118
+ FixedArray* elms = FixedArray::cast(elms_obj);
1119
+ AssertNoAllocation no_gc;
1120
+ WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
1121
+ for (int k = actual_start; k < actual_start + item_count; k++) {
1122
+ elms->set(k, args[3 + k - actual_start], mode);
1123
+ }
931
1124
  }
932
1125
 
933
1126
  if (elms_changed) {
934
- array->set_elements(elms);
1127
+ array->set_elements(elms_obj);
935
1128
  }
936
-
937
1129
  // Set the length.
938
1130
  array->set_length(Smi::FromInt(new_length));
939
1131
 
@@ -943,10 +1135,10 @@ BUILTIN(ArraySplice) {
943
1135
 
944
1136
  BUILTIN(ArrayConcat) {
945
1137
  Heap* heap = isolate->heap();
946
- Context* global_context = isolate->context()->global_context();
1138
+ Context* native_context = isolate->context()->native_context();
947
1139
  JSObject* array_proto =
948
- JSObject::cast(global_context->array_function()->prototype());
949
- if (!ArrayPrototypeHasNoElements(heap, global_context, array_proto)) {
1140
+ JSObject::cast(native_context->array_function()->prototype());
1141
+ if (!ArrayPrototypeHasNoElements(heap, native_context, array_proto)) {
950
1142
  return CallJsBuiltin(isolate, "ArrayConcat", args);
951
1143
  }
952
1144
 
@@ -955,14 +1147,15 @@ BUILTIN(ArrayConcat) {
955
1147
  int n_arguments = args.length();
956
1148
  int result_len = 0;
957
1149
  ElementsKind elements_kind = GetInitialFastElementsKind();
1150
+ bool has_double = false;
1151
+ bool is_holey = false;
958
1152
  for (int i = 0; i < n_arguments; i++) {
959
1153
  Object* arg = args[i];
960
1154
  if (!arg->IsJSArray() ||
961
- !JSArray::cast(arg)->HasFastSmiOrObjectElements() ||
1155
+ !JSArray::cast(arg)->HasFastElements() ||
962
1156
  JSArray::cast(arg)->GetPrototype() != array_proto) {
963
1157
  return CallJsBuiltin(isolate, "ArrayConcat", args);
964
1158
  }
965
-
966
1159
  int len = Smi::cast(JSArray::cast(arg)->length())->value();
967
1160
 
968
1161
  // We shouldn't overflow when adding another len.
@@ -972,47 +1165,52 @@ BUILTIN(ArrayConcat) {
972
1165
  result_len += len;
973
1166
  ASSERT(result_len >= 0);
974
1167
 
975
- if (result_len > FixedArray::kMaxLength) {
1168
+ if (result_len > FixedDoubleArray::kMaxLength) {
976
1169
  return CallJsBuiltin(isolate, "ArrayConcat", args);
977
1170
  }
978
1171
 
979
- if (!JSArray::cast(arg)->HasFastSmiElements()) {
980
- if (IsFastSmiElementsKind(elements_kind)) {
981
- if (IsFastHoleyElementsKind(elements_kind)) {
982
- elements_kind = FAST_HOLEY_ELEMENTS;
983
- } else {
984
- elements_kind = FAST_ELEMENTS;
985
- }
986
- }
987
- }
988
-
989
- if (JSArray::cast(arg)->HasFastHoleyElements()) {
990
- elements_kind = GetHoleyElementsKind(elements_kind);
1172
+ ElementsKind arg_kind = JSArray::cast(arg)->map()->elements_kind();
1173
+ has_double = has_double || IsFastDoubleElementsKind(arg_kind);
1174
+ is_holey = is_holey || IsFastHoleyElementsKind(arg_kind);
1175
+ if (IsMoreGeneralElementsKindTransition(elements_kind, arg_kind)) {
1176
+ elements_kind = arg_kind;
991
1177
  }
992
1178
  }
993
1179
 
994
- // Allocate result.
1180
+ if (is_holey) elements_kind = GetHoleyElementsKind(elements_kind);
1181
+
1182
+ // If a double array is concatted into a fast elements array, the fast
1183
+ // elements array needs to be initialized to contain proper holes, since
1184
+ // boxing doubles may cause incremental marking.
1185
+ ArrayStorageAllocationMode mode =
1186
+ has_double && IsFastObjectElementsKind(elements_kind)
1187
+ ? INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE : DONT_INITIALIZE_ARRAY_ELEMENTS;
995
1188
  JSArray* result_array;
1189
+ // Allocate result.
996
1190
  MaybeObject* maybe_array =
997
1191
  heap->AllocateJSArrayAndStorage(elements_kind,
998
1192
  result_len,
999
- result_len);
1193
+ result_len,
1194
+ mode);
1000
1195
  if (!maybe_array->To(&result_array)) return maybe_array;
1001
1196
  if (result_len == 0) return result_array;
1002
1197
 
1003
- // Copy data.
1004
- int start_pos = 0;
1005
- FixedArray* result_elms(FixedArray::cast(result_array->elements()));
1198
+ int j = 0;
1199
+ FixedArrayBase* storage = result_array->elements();
1200
+ ElementsAccessor* accessor = ElementsAccessor::ForKind(elements_kind);
1006
1201
  for (int i = 0; i < n_arguments; i++) {
1007
1202
  JSArray* array = JSArray::cast(args[i]);
1008
1203
  int len = Smi::cast(array->length())->value();
1009
- FixedArray* elms = FixedArray::cast(array->elements());
1010
- CopyObjectToObjectElements(elms, elements_kind, 0,
1011
- result_elms, elements_kind,
1012
- start_pos, len);
1013
- start_pos += len;
1204
+ ElementsKind from_kind = array->GetElementsKind();
1205
+ if (len > 0) {
1206
+ MaybeObject* maybe_failure =
1207
+ accessor->CopyElements(array, 0, from_kind, storage, j, len);
1208
+ if (maybe_failure->IsFailure()) return maybe_failure;
1209
+ j += len;
1210
+ }
1014
1211
  }
1015
- ASSERT(start_pos == result_len);
1212
+
1213
+ ASSERT(j == result_len);
1016
1214
 
1017
1215
  return result_array;
1018
1216
  }
@@ -1032,12 +1230,28 @@ BUILTIN(StrictModePoisonPill) {
1032
1230
  //
1033
1231
 
1034
1232
 
1233
+ // Searches the hidden prototype chain of the given object for the first
1234
+ // object that is an instance of the given type. If no such object can
1235
+ // be found then Heap::null_value() is returned.
1236
+ static inline Object* FindHidden(Heap* heap,
1237
+ Object* object,
1238
+ FunctionTemplateInfo* type) {
1239
+ if (object->IsInstanceOf(type)) return object;
1240
+ Object* proto = object->GetPrototype();
1241
+ if (proto->IsJSObject() &&
1242
+ JSObject::cast(proto)->map()->is_hidden_prototype()) {
1243
+ return FindHidden(heap, proto, type);
1244
+ }
1245
+ return heap->null_value();
1246
+ }
1247
+
1248
+
1035
1249
  // Returns the holder JSObject if the function can legally be called
1036
1250
  // with this receiver. Returns Heap::null_value() if the call is
1037
1251
  // illegal. Any arguments that don't fit the expected type is
1038
- // overwritten with undefined. Arguments that do fit the expected
1039
- // type is overwritten with the object in the prototype chain that
1040
- // actually has that type.
1252
+ // overwritten with undefined. Note that holder and the arguments are
1253
+ // implicitly rewritten with the first object in the hidden prototype
1254
+ // chain that actually has the expected type.
1041
1255
  static inline Object* TypeCheck(Heap* heap,
1042
1256
  int argc,
1043
1257
  Object** argv,
@@ -1050,15 +1264,10 @@ static inline Object* TypeCheck(Heap* heap,
1050
1264
  SignatureInfo* sig = SignatureInfo::cast(sig_obj);
1051
1265
  // If necessary, check the receiver
1052
1266
  Object* recv_type = sig->receiver();
1053
-
1054
1267
  Object* holder = recv;
1055
1268
  if (!recv_type->IsUndefined()) {
1056
- for (; holder != heap->null_value(); holder = holder->GetPrototype()) {
1057
- if (holder->IsInstanceOf(FunctionTemplateInfo::cast(recv_type))) {
1058
- break;
1059
- }
1060
- }
1061
- if (holder == heap->null_value()) return holder;
1269
+ holder = FindHidden(heap, holder, FunctionTemplateInfo::cast(recv_type));
1270
+ if (holder == heap->null_value()) return heap->null_value();
1062
1271
  }
1063
1272
  Object* args_obj = sig->args();
1064
1273
  // If there is no argument signature we're done
@@ -1071,13 +1280,9 @@ static inline Object* TypeCheck(Heap* heap,
1071
1280
  if (argtype->IsUndefined()) continue;
1072
1281
  Object** arg = &argv[-1 - i];
1073
1282
  Object* current = *arg;
1074
- for (; current != heap->null_value(); current = current->GetPrototype()) {
1075
- if (current->IsInstanceOf(FunctionTemplateInfo::cast(argtype))) {
1076
- *arg = current;
1077
- break;
1078
- }
1079
- }
1080
- if (current == heap->null_value()) *arg = heap->undefined_value();
1283
+ current = FindHidden(heap, current, FunctionTemplateInfo::cast(argtype));
1284
+ if (current == heap->null_value()) current = heap->undefined_value();
1285
+ *arg = current;
1081
1286
  }
1082
1287
  return holder;
1083
1288
  }
@@ -1148,6 +1353,7 @@ MUST_USE_RESULT static MaybeObject* HandleApiCallHelper(
1148
1353
  result = heap->undefined_value();
1149
1354
  } else {
1150
1355
  result = *reinterpret_cast<Object**>(*value);
1356
+ result->VerifyApiCallResultType();
1151
1357
  }
1152
1358
 
1153
1359
  RETURN_IF_SCHEDULED_EXCEPTION(isolate);
@@ -1224,6 +1430,7 @@ MUST_USE_RESULT static MaybeObject* HandleApiCallAsFunctionOrConstructor(
1224
1430
  result = heap->undefined_value();
1225
1431
  } else {
1226
1432
  result = *reinterpret_cast<Object**>(*value);
1433
+ result->VerifyApiCallResultType();
1227
1434
  }
1228
1435
  }
1229
1436
  // Check for exceptions and return result.
@@ -1246,26 +1453,6 @@ BUILTIN(HandleApiCallAsConstructor) {
1246
1453
  }
1247
1454
 
1248
1455
 
1249
- static void Generate_LoadIC_ArrayLength(MacroAssembler* masm) {
1250
- LoadIC::GenerateArrayLength(masm);
1251
- }
1252
-
1253
-
1254
- static void Generate_LoadIC_StringLength(MacroAssembler* masm) {
1255
- LoadIC::GenerateStringLength(masm, false);
1256
- }
1257
-
1258
-
1259
- static void Generate_LoadIC_StringWrapperLength(MacroAssembler* masm) {
1260
- LoadIC::GenerateStringLength(masm, true);
1261
- }
1262
-
1263
-
1264
- static void Generate_LoadIC_FunctionPrototype(MacroAssembler* masm) {
1265
- LoadIC::GenerateFunctionPrototype(masm);
1266
- }
1267
-
1268
-
1269
1456
  static void Generate_LoadIC_Initialize(MacroAssembler* masm) {
1270
1457
  LoadIC::GenerateInitialize(masm);
1271
1458
  }
@@ -1291,6 +1478,11 @@ static void Generate_LoadIC_Normal(MacroAssembler* masm) {
1291
1478
  }
1292
1479
 
1293
1480
 
1481
+ static void Generate_LoadIC_Getter_ForDeopt(MacroAssembler* masm) {
1482
+ LoadStubCompiler::GenerateLoadViaGetter(masm, Handle<JSFunction>());
1483
+ }
1484
+
1485
+
1294
1486
  static void Generate_KeyedLoadIC_Initialize(MacroAssembler* masm) {
1295
1487
  KeyedLoadIC::GenerateInitialize(masm);
1296
1488
  }
@@ -1302,12 +1494,12 @@ static void Generate_KeyedLoadIC_Slow(MacroAssembler* masm) {
1302
1494
 
1303
1495
 
1304
1496
  static void Generate_KeyedLoadIC_Miss(MacroAssembler* masm) {
1305
- KeyedLoadIC::GenerateMiss(masm, false);
1497
+ KeyedLoadIC::GenerateMiss(masm, MISS);
1306
1498
  }
1307
1499
 
1308
1500
 
1309
1501
  static void Generate_KeyedLoadIC_MissForceGeneric(MacroAssembler* masm) {
1310
- KeyedLoadIC::GenerateMiss(masm, true);
1502
+ KeyedLoadIC::GenerateMiss(masm, MISS_FORCE_GENERIC);
1311
1503
  }
1312
1504
 
1313
1505
 
@@ -1368,16 +1560,6 @@ static void Generate_StoreIC_Megamorphic_Strict(MacroAssembler* masm) {
1368
1560
  }
1369
1561
 
1370
1562
 
1371
- static void Generate_StoreIC_ArrayLength(MacroAssembler* masm) {
1372
- StoreIC::GenerateArrayLength(masm);
1373
- }
1374
-
1375
-
1376
- static void Generate_StoreIC_ArrayLength_Strict(MacroAssembler* masm) {
1377
- StoreIC::GenerateArrayLength(masm);
1378
- }
1379
-
1380
-
1381
1563
  static void Generate_StoreIC_GlobalProxy(MacroAssembler* masm) {
1382
1564
  StoreIC::GenerateGlobalProxy(masm, kNonStrictMode);
1383
1565
  }
@@ -1388,6 +1570,11 @@ static void Generate_StoreIC_GlobalProxy_Strict(MacroAssembler* masm) {
1388
1570
  }
1389
1571
 
1390
1572
 
1573
+ static void Generate_StoreIC_Setter_ForDeopt(MacroAssembler* masm) {
1574
+ StoreStubCompiler::GenerateStoreViaSetter(masm, Handle<JSFunction>());
1575
+ }
1576
+
1577
+
1391
1578
  static void Generate_KeyedStoreIC_Generic(MacroAssembler* masm) {
1392
1579
  KeyedStoreIC::GenerateGeneric(masm, kNonStrictMode);
1393
1580
  }
@@ -1399,12 +1586,12 @@ static void Generate_KeyedStoreIC_Generic_Strict(MacroAssembler* masm) {
1399
1586
 
1400
1587
 
1401
1588
  static void Generate_KeyedStoreIC_Miss(MacroAssembler* masm) {
1402
- KeyedStoreIC::GenerateMiss(masm, false);
1589
+ KeyedStoreIC::GenerateMiss(masm, MISS);
1403
1590
  }
1404
1591
 
1405
1592
 
1406
1593
  static void Generate_KeyedStoreIC_MissForceGeneric(MacroAssembler* masm) {
1407
- KeyedStoreIC::GenerateMiss(masm, true);
1594
+ KeyedStoreIC::GenerateMiss(masm, MISS_FORCE_GENERIC);
1408
1595
  }
1409
1596
 
1410
1597
 
@@ -1607,7 +1794,7 @@ void Builtins::SetUp(bool create_heap_objects) {
1607
1794
  // For now we generate builtin adaptor code into a stack-allocated
1608
1795
  // buffer, before copying it into individual code objects. Be careful
1609
1796
  // with alignment, some platforms don't like unaligned code.
1610
- union { int force_alignment; byte buffer[4*KB]; } u;
1797
+ union { int force_alignment; byte buffer[8*KB]; } u;
1611
1798
 
1612
1799
  // Traverse the list of builtins and generate an adaptor in a
1613
1800
  // separate code object for each one.