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
@@ -85,6 +85,81 @@ void HValue::AssumeRepresentation(Representation r) {
85
85
  }
86
86
 
87
87
 
88
+ void HValue::InferRepresentation(HInferRepresentation* h_infer) {
89
+ ASSERT(CheckFlag(kFlexibleRepresentation));
90
+ Representation new_rep = RepresentationFromInputs();
91
+ UpdateRepresentation(new_rep, h_infer, "inputs");
92
+ new_rep = RepresentationFromUses();
93
+ UpdateRepresentation(new_rep, h_infer, "uses");
94
+ }
95
+
96
+
97
+ Representation HValue::RepresentationFromUses() {
98
+ if (HasNoUses()) return Representation::None();
99
+
100
+ // Array of use counts for each representation.
101
+ int use_count[Representation::kNumRepresentations] = { 0 };
102
+
103
+ for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
104
+ HValue* use = it.value();
105
+ Representation rep = use->observed_input_representation(it.index());
106
+ if (rep.IsNone()) continue;
107
+ if (FLAG_trace_representation) {
108
+ PrintF("#%d %s is used by #%d %s as %s%s\n",
109
+ id(), Mnemonic(), use->id(), use->Mnemonic(), rep.Mnemonic(),
110
+ (use->CheckFlag(kTruncatingToInt32) ? "-trunc" : ""));
111
+ }
112
+ use_count[rep.kind()] += use->LoopWeight();
113
+ }
114
+ if (IsPhi()) HPhi::cast(this)->AddIndirectUsesTo(&use_count[0]);
115
+ int tagged_count = use_count[Representation::kTagged];
116
+ int double_count = use_count[Representation::kDouble];
117
+ int int32_count = use_count[Representation::kInteger32];
118
+
119
+ if (tagged_count > 0) return Representation::Tagged();
120
+ if (double_count > 0) return Representation::Double();
121
+ if (int32_count > 0) return Representation::Integer32();
122
+
123
+ return Representation::None();
124
+ }
125
+
126
+
127
+ void HValue::UpdateRepresentation(Representation new_rep,
128
+ HInferRepresentation* h_infer,
129
+ const char* reason) {
130
+ Representation r = representation();
131
+ if (new_rep.is_more_general_than(r)) {
132
+ // When an HConstant is marked "not convertible to integer", then
133
+ // never try to represent it as an integer.
134
+ if (new_rep.IsInteger32() && !IsConvertibleToInteger()) {
135
+ new_rep = Representation::Tagged();
136
+ if (FLAG_trace_representation) {
137
+ PrintF("Changing #%d %s representation %s -> %s because it's NCTI"
138
+ " (%s want i)\n",
139
+ id(), Mnemonic(), r.Mnemonic(), new_rep.Mnemonic(), reason);
140
+ }
141
+ } else {
142
+ if (FLAG_trace_representation) {
143
+ PrintF("Changing #%d %s representation %s -> %s based on %s\n",
144
+ id(), Mnemonic(), r.Mnemonic(), new_rep.Mnemonic(), reason);
145
+ }
146
+ }
147
+ ChangeRepresentation(new_rep);
148
+ AddDependantsToWorklist(h_infer);
149
+ }
150
+ }
151
+
152
+
153
+ void HValue::AddDependantsToWorklist(HInferRepresentation* h_infer) {
154
+ for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
155
+ h_infer->AddToWorklist(it.value());
156
+ }
157
+ for (int i = 0; i < OperandCount(); ++i) {
158
+ h_infer->AddToWorklist(OperandAt(i));
159
+ }
160
+ }
161
+
162
+
88
163
  static int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) {
89
164
  if (result > kMaxInt) {
90
165
  *overflow = true;
@@ -156,6 +231,20 @@ void Range::Union(Range* other) {
156
231
  }
157
232
 
158
233
 
234
+ void Range::CombinedMax(Range* other) {
235
+ upper_ = Max(upper_, other->upper_);
236
+ lower_ = Max(lower_, other->lower_);
237
+ set_can_be_minus_zero(CanBeMinusZero() || other->CanBeMinusZero());
238
+ }
239
+
240
+
241
+ void Range::CombinedMin(Range* other) {
242
+ upper_ = Min(upper_, other->upper_);
243
+ lower_ = Min(lower_, other->lower_);
244
+ set_can_be_minus_zero(CanBeMinusZero() || other->CanBeMinusZero());
245
+ }
246
+
247
+
159
248
  void Range::Sar(int32_t value) {
160
249
  int32_t bits = value & 0x1F;
161
250
  lower_ = lower_ >> bits;
@@ -253,6 +342,10 @@ const char* HType::ToString() {
253
342
 
254
343
 
255
344
  HType HType::TypeFromValue(Handle<Object> value) {
345
+ // Handle dereferencing is safe here: an object's type as checked below
346
+ // never changes.
347
+ AllowHandleDereference allow_handle_deref;
348
+
256
349
  HType result = HType::Tagged();
257
350
  if (value->IsSmi()) {
258
351
  result = HType::Smi();
@@ -271,6 +364,54 @@ HType HType::TypeFromValue(Handle<Object> value) {
271
364
  }
272
365
 
273
366
 
367
+ bool HValue::Dominates(HValue* dominator, HValue* dominated) {
368
+ if (dominator->block() != dominated->block()) {
369
+ // If they are in different blocks we can use the dominance relation
370
+ // between the blocks.
371
+ return dominator->block()->Dominates(dominated->block());
372
+ } else {
373
+ // Otherwise we must see which instruction comes first, considering
374
+ // that phis always precede regular instructions.
375
+ if (dominator->IsInstruction()) {
376
+ if (dominated->IsInstruction()) {
377
+ for (HInstruction* next = HInstruction::cast(dominator)->next();
378
+ next != NULL;
379
+ next = next->next()) {
380
+ if (next == dominated) return true;
381
+ }
382
+ return false;
383
+ } else if (dominated->IsPhi()) {
384
+ return false;
385
+ } else {
386
+ UNREACHABLE();
387
+ }
388
+ } else if (dominator->IsPhi()) {
389
+ if (dominated->IsInstruction()) {
390
+ return true;
391
+ } else {
392
+ // We cannot compare which phi comes first.
393
+ UNREACHABLE();
394
+ }
395
+ } else {
396
+ UNREACHABLE();
397
+ }
398
+ return false;
399
+ }
400
+ }
401
+
402
+
403
+ bool HValue::TestDominanceUsingProcessedFlag(HValue* dominator,
404
+ HValue* dominated) {
405
+ if (dominator->block() != dominated->block()) {
406
+ return dominator->block()->Dominates(dominated->block());
407
+ } else {
408
+ // If both arguments are in the same block we check if "dominator" has
409
+ // already been processed or if it is a phi: if yes it dominates the other.
410
+ return dominator->CheckFlag(kIDefsProcessingDone) || dominator->IsPhi();
411
+ }
412
+ }
413
+
414
+
274
415
  bool HValue::IsDefinedAfter(HBasicBlock* other) const {
275
416
  return block()->block_id() > other->block_id();
276
417
  }
@@ -287,6 +428,7 @@ HUseListNode* HUseListNode::tail() {
287
428
 
288
429
  bool HValue::CheckUsesForFlag(Flag f) {
289
430
  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
431
+ if (it.value()->IsSimulate()) continue;
290
432
  if (!it.value()->CheckFlag(f)) return false;
291
433
  }
292
434
  return true;
@@ -336,7 +478,8 @@ HUseListNode* HValue::RemoveUse(HValue* value, int index) {
336
478
  // Do not reuse use list nodes in debug mode, zap them.
337
479
  if (current != NULL) {
338
480
  HUseListNode* temp =
339
- new HUseListNode(current->value(), current->index(), NULL);
481
+ new(block()->zone())
482
+ HUseListNode(current->value(), current->index(), NULL);
340
483
  current->Zap();
341
484
  current = temp;
342
485
  }
@@ -476,6 +619,11 @@ void HValue::PrintNameTo(StringStream* stream) {
476
619
  }
477
620
 
478
621
 
622
+ bool HValue::HasMonomorphicJSObjectType() {
623
+ return !GetMonomorphicJSObjectMap().is_null();
624
+ }
625
+
626
+
479
627
  bool HValue::UpdateInferredType() {
480
628
  HType type = CalculateInferredType();
481
629
  bool result = (!type.Equals(type_));
@@ -495,8 +643,8 @@ void HValue::RegisterUse(int index, HValue* new_value) {
495
643
 
496
644
  if (new_value != NULL) {
497
645
  if (removed == NULL) {
498
- new_value->use_list_ =
499
- new HUseListNode(this, index, new_value->use_list_);
646
+ new_value->use_list_ = new(new_value->block()->zone()) HUseListNode(
647
+ this, index, new_value->use_list_);
500
648
  } else {
501
649
  removed->set_tail(new_value->use_list_);
502
650
  new_value->use_list_ = removed;
@@ -646,6 +794,11 @@ void HInstruction::Verify() {
646
794
  #endif
647
795
 
648
796
 
797
+ void HDummyUse::PrintDataTo(StringStream* stream) {
798
+ value()->PrintNameTo(stream);
799
+ }
800
+
801
+
649
802
  void HUnaryCall::PrintDataTo(StringStream* stream) {
650
803
  value()->PrintNameTo(stream);
651
804
  stream->Add(" ");
@@ -669,6 +822,28 @@ void HBoundsCheck::PrintDataTo(StringStream* stream) {
669
822
  }
670
823
 
671
824
 
825
+ void HBoundsCheck::InferRepresentation(HInferRepresentation* h_infer) {
826
+ ASSERT(CheckFlag(kFlexibleRepresentation));
827
+ Representation r;
828
+ if (key_mode_ == DONT_ALLOW_SMI_KEY ||
829
+ !length()->representation().IsTagged()) {
830
+ r = Representation::Integer32();
831
+ } else if (index()->representation().IsTagged() ||
832
+ (index()->IsConstant() &&
833
+ HConstant::cast(index())->HasInteger32Value() &&
834
+ Smi::IsValid(HConstant::cast(index())->Integer32Value()))) {
835
+ // If the index is tagged, or a constant that holds a Smi, allow the length
836
+ // to be tagged, since it is usually already tagged from loading it out of
837
+ // the length field of a JSArray. This allows for direct comparison without
838
+ // untagging.
839
+ r = Representation::Tagged();
840
+ } else {
841
+ r = Representation::Integer32();
842
+ }
843
+ UpdateRepresentation(r, h_infer, "boundscheck");
844
+ }
845
+
846
+
672
847
  void HCallConstantFunction::PrintDataTo(StringStream* stream) {
673
848
  if (IsApplyFunction()) {
674
849
  stream->Add("optimized apply ");
@@ -692,7 +867,7 @@ void HCallGlobal::PrintDataTo(StringStream* stream) {
692
867
 
693
868
 
694
869
  void HCallKnownGlobal::PrintDataTo(StringStream* stream) {
695
- stream->Add("o ", target()->shared()->DebugName());
870
+ stream->Add("%o ", target()->shared()->DebugName());
696
871
  stream->Add("#%d", argument_count());
697
872
  }
698
873
 
@@ -710,6 +885,13 @@ void HClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
710
885
  }
711
886
 
712
887
 
888
+ void HWrapReceiver::PrintDataTo(StringStream* stream) {
889
+ receiver()->PrintNameTo(stream);
890
+ stream->Add(" ");
891
+ function()->PrintNameTo(stream);
892
+ }
893
+
894
+
713
895
  void HAccessArgumentsAt::PrintDataTo(StringStream* stream) {
714
896
  arguments()->PrintNameTo(stream);
715
897
  stream->Add("[");
@@ -749,6 +931,24 @@ void HReturn::PrintDataTo(StringStream* stream) {
749
931
  }
750
932
 
751
933
 
934
+ Representation HBranch::observed_input_representation(int index) {
935
+ static const ToBooleanStub::Types tagged_types(
936
+ ToBooleanStub::UNDEFINED |
937
+ ToBooleanStub::NULL_TYPE |
938
+ ToBooleanStub::SPEC_OBJECT |
939
+ ToBooleanStub::STRING);
940
+ if (expected_input_types_.ContainsAnyOf(tagged_types)) {
941
+ return Representation::Tagged();
942
+ } else if (expected_input_types_.Contains(ToBooleanStub::HEAP_NUMBER)) {
943
+ return Representation::Double();
944
+ } else if (expected_input_types_.Contains(ToBooleanStub::SMI)) {
945
+ return Representation::Integer32();
946
+ } else {
947
+ return Representation::None();
948
+ }
949
+ }
950
+
951
+
752
952
  void HCompareMap::PrintDataTo(StringStream* stream) {
753
953
  value()->PrintNameTo(stream);
754
954
  stream->Add(" (%p)", *map());
@@ -844,28 +1044,20 @@ void HLoadFieldByIndex::PrintDataTo(StringStream* stream) {
844
1044
  }
845
1045
 
846
1046
 
847
- HValue* HConstant::Canonicalize() {
848
- return HasNoUses() ? NULL : this;
849
- }
850
-
851
-
852
- HValue* HTypeof::Canonicalize() {
853
- return HasNoUses() ? NULL : this;
854
- }
855
-
856
-
857
1047
  HValue* HBitwise::Canonicalize() {
858
1048
  if (!representation().IsInteger32()) return this;
859
1049
  // If x is an int32, then x & -1 == x, x | 0 == x and x ^ 0 == x.
860
1050
  int32_t nop_constant = (op() == Token::BIT_AND) ? -1 : 0;
861
1051
  if (left()->IsConstant() &&
862
1052
  HConstant::cast(left())->HasInteger32Value() &&
863
- HConstant::cast(left())->Integer32Value() == nop_constant) {
1053
+ HConstant::cast(left())->Integer32Value() == nop_constant &&
1054
+ !right()->CheckFlag(kUint32)) {
864
1055
  return right();
865
1056
  }
866
1057
  if (right()->IsConstant() &&
867
1058
  HConstant::cast(right())->HasInteger32Value() &&
868
- HConstant::cast(right())->Integer32Value() == nop_constant) {
1059
+ HConstant::cast(right())->Integer32Value() == nop_constant &&
1060
+ !left()->CheckFlag(kUint32)) {
869
1061
  return left();
870
1062
  }
871
1063
  return this;
@@ -877,7 +1069,9 @@ HValue* HBitNot::Canonicalize() {
877
1069
  if (value()->IsBitNot()) {
878
1070
  HValue* result = HBitNot::cast(value())->value();
879
1071
  ASSERT(result->representation().IsInteger32());
880
- return result;
1072
+ if (!result->CheckFlag(kUint32)) {
1073
+ return result;
1074
+ }
881
1075
  }
882
1076
  return this;
883
1077
  }
@@ -916,6 +1110,12 @@ void HTypeof::PrintDataTo(StringStream* stream) {
916
1110
  }
917
1111
 
918
1112
 
1113
+ void HForceRepresentation::PrintDataTo(StringStream* stream) {
1114
+ stream->Add("%s ", representation().Mnemonic());
1115
+ value()->PrintNameTo(stream);
1116
+ }
1117
+
1118
+
919
1119
  void HChange::PrintDataTo(StringStream* stream) {
920
1120
  HUnaryOperation::PrintDataTo(stream);
921
1121
  stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic());
@@ -928,8 +1128,10 @@ void HChange::PrintDataTo(StringStream* stream) {
928
1128
 
929
1129
  void HJSArrayLength::PrintDataTo(StringStream* stream) {
930
1130
  value()->PrintNameTo(stream);
931
- stream->Add(" ");
932
- typecheck()->PrintNameTo(stream);
1131
+ if (HasTypeCheck()) {
1132
+ stream->Add(" ");
1133
+ typecheck()->PrintNameTo(stream);
1134
+ }
933
1135
  }
934
1136
 
935
1137
 
@@ -940,7 +1142,8 @@ HValue* HUnaryMathOperation::Canonicalize() {
940
1142
  // introduced.
941
1143
  if (value()->representation().IsInteger32()) return value();
942
1144
 
943
- #ifdef V8_TARGET_ARCH_ARM
1145
+ #if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_IA32) || \
1146
+ defined(V8_TARGET_ARCH_X64)
944
1147
  if (value()->IsDiv() && (value()->UseCount() == 1)) {
945
1148
  // TODO(2038): Implement this optimization for non ARM architectures.
946
1149
  HDiv* hdiv = HDiv::cast(value());
@@ -964,7 +1167,7 @@ HValue* HUnaryMathOperation::Canonicalize() {
964
1167
  !HInstruction::cast(new_right)->IsLinked()) {
965
1168
  HInstruction::cast(new_right)->InsertBefore(this);
966
1169
  }
967
- HMathFloorOfDiv* instr = new HMathFloorOfDiv(context(),
1170
+ HMathFloorOfDiv* instr = new(block()->zone()) HMathFloorOfDiv(context(),
968
1171
  new_left,
969
1172
  new_right);
970
1173
  // Replace this HMathFloor instruction by the new HMathFloorOfDiv.
@@ -995,10 +1198,11 @@ HValue* HCheckInstanceType::Canonicalize() {
995
1198
  value()->type().IsString()) {
996
1199
  return NULL;
997
1200
  }
998
- if (check_ == IS_SYMBOL &&
999
- value()->IsConstant() &&
1000
- HConstant::cast(value())->handle()->IsSymbol()) {
1001
- return NULL;
1201
+
1202
+ if (check_ == IS_SYMBOL && value()->IsConstant()) {
1203
+ // Dereferencing is safe here: a symbol cannot become a non-symbol.
1204
+ AllowHandleDereference allow_handle_deref;
1205
+ if (HConstant::cast(value())->handle()->IsSymbol()) return NULL;
1002
1206
  }
1003
1207
  return this;
1004
1208
  }
@@ -1038,6 +1242,35 @@ void HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) {
1038
1242
  }
1039
1243
 
1040
1244
 
1245
+ void HCheckMaps::SetSideEffectDominator(GVNFlag side_effect,
1246
+ HValue* dominator) {
1247
+ ASSERT(side_effect == kChangesMaps);
1248
+ // TODO(mstarzinger): For now we specialize on HStoreNamedField, but once
1249
+ // type information is rich enough we should generalize this to any HType
1250
+ // for which the map is known.
1251
+ if (HasNoUses() && dominator->IsStoreNamedField()) {
1252
+ HStoreNamedField* store = HStoreNamedField::cast(dominator);
1253
+ Handle<Map> map = store->transition();
1254
+ if (map.is_null() || store->object() != value()) return;
1255
+ for (int i = 0; i < map_set()->length(); i++) {
1256
+ if (map.is_identical_to(map_set()->at(i))) {
1257
+ DeleteAndReplaceWith(NULL);
1258
+ return;
1259
+ }
1260
+ }
1261
+ }
1262
+ }
1263
+
1264
+
1265
+ void HLoadElements::PrintDataTo(StringStream* stream) {
1266
+ value()->PrintNameTo(stream);
1267
+ if (HasTypeCheck()) {
1268
+ stream->Add(" ");
1269
+ typecheck()->PrintNameTo(stream);
1270
+ }
1271
+ }
1272
+
1273
+
1041
1274
  void HCheckMaps::PrintDataTo(StringStream* stream) {
1042
1275
  value()->PrintNameTo(stream);
1043
1276
  stream->Add(" [%p", *map_set()->first());
@@ -1071,6 +1304,12 @@ void HCheckInstanceType::PrintDataTo(StringStream* stream) {
1071
1304
  }
1072
1305
 
1073
1306
 
1307
+ void HCheckPrototypeMaps::PrintDataTo(StringStream* stream) {
1308
+ stream->Add("[receiver_prototype=%p,holder=%p]",
1309
+ *prototypes_.first(), *prototypes_.last());
1310
+ }
1311
+
1312
+
1074
1313
  void HCallStub::PrintDataTo(StringStream* stream) {
1075
1314
  stream->Add("%s ",
1076
1315
  CodeStub::MajorName(major_key_, false));
@@ -1099,6 +1338,7 @@ Range* HChange::InferRange(Zone* zone) {
1099
1338
  Range* input_range = value()->range();
1100
1339
  if (from().IsInteger32() &&
1101
1340
  to().IsTagged() &&
1341
+ !value()->CheckFlag(HInstruction::kUint32) &&
1102
1342
  input_range != NULL && input_range->IsInSmiRange()) {
1103
1343
  set_type(HType::Smi());
1104
1344
  }
@@ -1221,6 +1461,11 @@ Range* HMod::InferRange(Zone* zone) {
1221
1461
  if (a->CanBeMinusZero() || a->CanBeNegative()) {
1222
1462
  result->set_can_be_minus_zero(true);
1223
1463
  }
1464
+
1465
+ if (right()->range()->Includes(-1) && left()->range()->Includes(kMinInt)) {
1466
+ SetFlag(HValue::kCanOverflow);
1467
+ }
1468
+
1224
1469
  if (!right()->range()->CanBeZero()) {
1225
1470
  ClearFlag(HValue::kCanBeDivByZero);
1226
1471
  }
@@ -1231,6 +1476,24 @@ Range* HMod::InferRange(Zone* zone) {
1231
1476
  }
1232
1477
 
1233
1478
 
1479
+ Range* HMathMinMax::InferRange(Zone* zone) {
1480
+ if (representation().IsInteger32()) {
1481
+ Range* a = left()->range();
1482
+ Range* b = right()->range();
1483
+ Range* res = a->Copy(zone);
1484
+ if (operation_ == kMathMax) {
1485
+ res->CombinedMax(b);
1486
+ } else {
1487
+ ASSERT(operation_ == kMathMin);
1488
+ res->CombinedMin(b);
1489
+ }
1490
+ return res;
1491
+ } else {
1492
+ return HValue::InferRange(zone);
1493
+ }
1494
+ }
1495
+
1496
+
1234
1497
  void HPhi::PrintTo(StringStream* stream) {
1235
1498
  stream->Add("[");
1236
1499
  for (int i = 0; i < OperandCount(); ++i) {
@@ -1251,7 +1514,7 @@ void HPhi::PrintTo(StringStream* stream) {
1251
1514
 
1252
1515
 
1253
1516
  void HPhi::AddInput(HValue* value) {
1254
- inputs_.Add(NULL);
1517
+ inputs_.Add(NULL, value->block()->zone());
1255
1518
  SetOperandAt(OperandCount() - 1, value);
1256
1519
  // Mark phis that may have 'arguments' directly or indirectly as an operand.
1257
1520
  if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) {
@@ -1298,14 +1561,26 @@ void HPhi::InitRealUses(int phi_id) {
1298
1561
  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1299
1562
  HValue* value = it.value();
1300
1563
  if (!value->IsPhi()) {
1301
- Representation rep = value->RequiredInputRepresentation(it.index());
1564
+ Representation rep = value->observed_input_representation(it.index());
1302
1565
  non_phi_uses_[rep.kind()] += value->LoopWeight();
1566
+ if (FLAG_trace_representation) {
1567
+ PrintF("#%d Phi is used by real #%d %s as %s\n",
1568
+ id(), value->id(), value->Mnemonic(), rep.Mnemonic());
1569
+ }
1303
1570
  }
1304
1571
  }
1305
1572
  }
1306
1573
 
1307
1574
 
1308
1575
  void HPhi::AddNonPhiUsesFrom(HPhi* other) {
1576
+ if (FLAG_trace_representation) {
1577
+ PrintF("adding to #%d Phi uses of #%d Phi: i%d d%d t%d\n",
1578
+ id(), other->id(),
1579
+ other->non_phi_uses_[Representation::kInteger32],
1580
+ other->non_phi_uses_[Representation::kDouble],
1581
+ other->non_phi_uses_[Representation::kTagged]);
1582
+ }
1583
+
1309
1584
  for (int i = 0; i < Representation::kNumRepresentations; i++) {
1310
1585
  indirect_uses_[i] += other->non_phi_uses_[i];
1311
1586
  }
@@ -1319,12 +1594,29 @@ void HPhi::AddIndirectUsesTo(int* dest) {
1319
1594
  }
1320
1595
 
1321
1596
 
1597
+ void HSimulate::MergeInto(HSimulate* other) {
1598
+ for (int i = 0; i < values_.length(); ++i) {
1599
+ HValue* value = values_[i];
1600
+ if (HasAssignedIndexAt(i)) {
1601
+ other->AddAssignedValue(GetAssignedIndexAt(i), value);
1602
+ } else {
1603
+ if (other->pop_count_ > 0) {
1604
+ other->pop_count_--;
1605
+ } else {
1606
+ other->AddPushedValue(value);
1607
+ }
1608
+ }
1609
+ }
1610
+ other->pop_count_ += pop_count();
1611
+ }
1612
+
1613
+
1322
1614
  void HSimulate::PrintDataTo(StringStream* stream) {
1323
- stream->Add("id=%d", ast_id());
1615
+ stream->Add("id=%d", ast_id().ToInt());
1324
1616
  if (pop_count_ > 0) stream->Add(" pop %d", pop_count_);
1325
1617
  if (values_.length() > 0) {
1326
1618
  if (pop_count_ > 0) stream->Add(" /");
1327
- for (int i = 0; i < values_.length(); ++i) {
1619
+ for (int i = values_.length() - 1; i >= 0; --i) {
1328
1620
  if (i > 0) stream->Add(",");
1329
1621
  if (HasAssignedIndexAt(i)) {
1330
1622
  stream->Add(" var[%d] = ", GetAssignedIndexAt(i));
@@ -1349,45 +1641,93 @@ void HDeoptimize::PrintDataTo(StringStream* stream) {
1349
1641
 
1350
1642
  void HEnterInlined::PrintDataTo(StringStream* stream) {
1351
1643
  SmartArrayPointer<char> name = function()->debug_name()->ToCString();
1352
- stream->Add("%s, id=%d", *name, function()->id());
1644
+ stream->Add("%s, id=%d", *name, function()->id().ToInt());
1645
+ }
1646
+
1647
+
1648
+ static bool IsInteger32(double value) {
1649
+ double roundtrip_value = static_cast<double>(static_cast<int32_t>(value));
1650
+ return BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(value);
1353
1651
  }
1354
1652
 
1355
1653
 
1356
1654
  HConstant::HConstant(Handle<Object> handle, Representation r)
1357
1655
  : handle_(handle),
1358
1656
  has_int32_value_(false),
1359
- has_double_value_(false),
1360
- int32_value_(0),
1361
- double_value_(0) {
1362
- set_representation(r);
1657
+ has_double_value_(false) {
1658
+ // Dereferencing here is safe: the value of a number object does not change.
1659
+ AllowHandleDereference allow_handle_deref;
1363
1660
  SetFlag(kUseGVN);
1364
1661
  if (handle_->IsNumber()) {
1365
1662
  double n = handle_->Number();
1366
- double roundtrip_value = static_cast<double>(static_cast<int32_t>(n));
1367
- has_int32_value_ = BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(n);
1368
- if (has_int32_value_) int32_value_ = static_cast<int32_t>(n);
1663
+ has_int32_value_ = IsInteger32(n);
1664
+ int32_value_ = DoubleToInt32(n);
1369
1665
  double_value_ = n;
1370
1666
  has_double_value_ = true;
1371
1667
  }
1668
+ if (r.IsNone()) {
1669
+ if (has_int32_value_) {
1670
+ r = Representation::Integer32();
1671
+ } else if (has_double_value_) {
1672
+ r = Representation::Double();
1673
+ } else {
1674
+ r = Representation::Tagged();
1675
+ }
1676
+ }
1677
+ set_representation(r);
1372
1678
  }
1373
1679
 
1374
1680
 
1375
- HConstant* HConstant::CopyToRepresentation(Representation r) const {
1681
+ HConstant::HConstant(int32_t integer_value, Representation r)
1682
+ : has_int32_value_(true),
1683
+ has_double_value_(true),
1684
+ int32_value_(integer_value),
1685
+ double_value_(FastI2D(integer_value)) {
1686
+ set_representation(r);
1687
+ SetFlag(kUseGVN);
1688
+ }
1689
+
1690
+
1691
+ HConstant::HConstant(double double_value, Representation r)
1692
+ : has_int32_value_(IsInteger32(double_value)),
1693
+ has_double_value_(true),
1694
+ int32_value_(DoubleToInt32(double_value)),
1695
+ double_value_(double_value) {
1696
+ set_representation(r);
1697
+ SetFlag(kUseGVN);
1698
+ }
1699
+
1700
+
1701
+ HConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
1376
1702
  if (r.IsInteger32() && !has_int32_value_) return NULL;
1377
1703
  if (r.IsDouble() && !has_double_value_) return NULL;
1378
- return new HConstant(handle_, r);
1704
+ if (handle_.is_null()) {
1705
+ ASSERT(has_int32_value_ || has_double_value_);
1706
+ if (has_int32_value_) return new(zone) HConstant(int32_value_, r);
1707
+ return new(zone) HConstant(double_value_, r);
1708
+ }
1709
+ return new(zone) HConstant(handle_, r);
1379
1710
  }
1380
1711
 
1381
1712
 
1382
- HConstant* HConstant::CopyToTruncatedInt32() const {
1383
- if (!has_double_value_) return NULL;
1384
- int32_t truncated = NumberToInt32(*handle_);
1385
- return new HConstant(FACTORY->NewNumberFromInt(truncated),
1386
- Representation::Integer32());
1713
+ HConstant* HConstant::CopyToTruncatedInt32(Zone* zone) const {
1714
+ if (has_int32_value_) {
1715
+ if (handle_.is_null()) {
1716
+ return new(zone) HConstant(int32_value_, Representation::Integer32());
1717
+ } else {
1718
+ // Re-use the existing Handle if possible.
1719
+ return new(zone) HConstant(handle_, Representation::Integer32());
1720
+ }
1721
+ } else if (has_double_value_) {
1722
+ return new(zone) HConstant(DoubleToInt32(double_value_),
1723
+ Representation::Integer32());
1724
+ } else {
1725
+ return NULL;
1726
+ }
1387
1727
  }
1388
1728
 
1389
1729
 
1390
- bool HConstant::ToBoolean() const {
1730
+ bool HConstant::ToBoolean() {
1391
1731
  // Converts the constant's boolean value according to
1392
1732
  // ECMAScript section 9.2 ToBoolean conversion.
1393
1733
  if (HasInteger32Value()) return Integer32Value() != 0;
@@ -1395,17 +1735,27 @@ bool HConstant::ToBoolean() const {
1395
1735
  double v = DoubleValue();
1396
1736
  return v != 0 && !isnan(v);
1397
1737
  }
1398
- if (handle()->IsTrue()) return true;
1399
- if (handle()->IsFalse()) return false;
1400
- if (handle()->IsUndefined()) return false;
1401
- if (handle()->IsNull()) return false;
1402
- if (handle()->IsString() &&
1403
- String::cast(*handle())->length() == 0) return false;
1738
+ // Dereferencing is safe: singletons do not change and strings are
1739
+ // immutable.
1740
+ AllowHandleDereference allow_handle_deref;
1741
+ if (handle_->IsTrue()) return true;
1742
+ if (handle_->IsFalse()) return false;
1743
+ if (handle_->IsUndefined()) return false;
1744
+ if (handle_->IsNull()) return false;
1745
+ if (handle_->IsString() && String::cast(*handle_)->length() == 0) {
1746
+ return false;
1747
+ }
1404
1748
  return true;
1405
1749
  }
1406
1750
 
1407
1751
  void HConstant::PrintDataTo(StringStream* stream) {
1408
- handle()->ShortPrint(stream);
1752
+ if (has_int32_value_) {
1753
+ stream->Add("%d ", int32_value_);
1754
+ } else if (has_double_value_) {
1755
+ stream->Add("%f ", FmtElm(double_value_));
1756
+ } else {
1757
+ handle()->ShortPrint(stream);
1758
+ }
1409
1759
  }
1410
1760
 
1411
1761
 
@@ -1425,6 +1775,60 @@ void HBinaryOperation::PrintDataTo(StringStream* stream) {
1425
1775
  }
1426
1776
 
1427
1777
 
1778
+ void HBinaryOperation::InferRepresentation(HInferRepresentation* h_infer) {
1779
+ ASSERT(CheckFlag(kFlexibleRepresentation));
1780
+ Representation new_rep = RepresentationFromInputs();
1781
+ UpdateRepresentation(new_rep, h_infer, "inputs");
1782
+ // When the operation has information about its own output type, don't look
1783
+ // at uses.
1784
+ if (!observed_output_representation_.IsNone()) return;
1785
+ new_rep = RepresentationFromUses();
1786
+ UpdateRepresentation(new_rep, h_infer, "uses");
1787
+ }
1788
+
1789
+
1790
+ Representation HBinaryOperation::RepresentationFromInputs() {
1791
+ // Determine the worst case of observed input representations and
1792
+ // the currently assumed output representation.
1793
+ Representation rep = representation();
1794
+ if (observed_output_representation_.is_more_general_than(rep)) {
1795
+ rep = observed_output_representation_;
1796
+ }
1797
+ for (int i = 1; i <= 2; ++i) {
1798
+ Representation input_rep = observed_input_representation(i);
1799
+ if (input_rep.is_more_general_than(rep)) rep = input_rep;
1800
+ }
1801
+ // If any of the actual input representation is more general than what we
1802
+ // have so far but not Tagged, use that representation instead.
1803
+ Representation left_rep = left()->representation();
1804
+ Representation right_rep = right()->representation();
1805
+
1806
+ if (left_rep.is_more_general_than(rep) &&
1807
+ left()->CheckFlag(kFlexibleRepresentation)) {
1808
+ rep = left_rep;
1809
+ }
1810
+ if (right_rep.is_more_general_than(rep) &&
1811
+ right()->CheckFlag(kFlexibleRepresentation)) {
1812
+ rep = right_rep;
1813
+ }
1814
+ return rep;
1815
+ }
1816
+
1817
+
1818
+ void HBinaryOperation::AssumeRepresentation(Representation r) {
1819
+ set_observed_input_representation(r, r);
1820
+ HValue::AssumeRepresentation(r);
1821
+ }
1822
+
1823
+
1824
+ void HMathMinMax::InferRepresentation(HInferRepresentation* h_infer) {
1825
+ ASSERT(CheckFlag(kFlexibleRepresentation));
1826
+ Representation new_rep = RepresentationFromInputs();
1827
+ UpdateRepresentation(new_rep, h_infer, "inputs");
1828
+ // Do not care about uses.
1829
+ }
1830
+
1831
+
1428
1832
  Range* HBitwise::InferRange(Zone* zone) {
1429
1833
  if (op() == Token::BIT_XOR) return HValue::InferRange(zone);
1430
1834
  const int32_t kDefaultMask = static_cast<int32_t>(0xffffffff);
@@ -1501,7 +1905,7 @@ Range* HShl::InferRange(Zone* zone) {
1501
1905
  }
1502
1906
 
1503
1907
 
1504
- Range* HLoadKeyedSpecializedArrayElement::InferRange(Zone* zone) {
1908
+ Range* HLoadKeyed::InferRange(Zone* zone) {
1505
1909
  switch (elements_kind()) {
1506
1910
  case EXTERNAL_PIXEL_ELEMENTS:
1507
1911
  return new(zone) Range(0, 255);
@@ -1556,9 +1960,19 @@ void HGoto::PrintDataTo(StringStream* stream) {
1556
1960
  }
1557
1961
 
1558
1962
 
1559
- void HCompareIDAndBranch::SetInputRepresentation(Representation r) {
1560
- input_representation_ = r;
1561
- if (r.IsDouble()) {
1963
+ void HCompareIDAndBranch::InferRepresentation(HInferRepresentation* h_infer) {
1964
+ Representation rep = Representation::None();
1965
+ Representation left_rep = left()->representation();
1966
+ Representation right_rep = right()->representation();
1967
+ bool observed_integers =
1968
+ observed_input_representation(0).IsInteger32() &&
1969
+ observed_input_representation(1).IsInteger32();
1970
+ bool inputs_are_not_doubles =
1971
+ !left_rep.IsDouble() && !right_rep.IsDouble();
1972
+ if (observed_integers && inputs_are_not_doubles) {
1973
+ rep = Representation::Integer32();
1974
+ } else {
1975
+ rep = Representation::Double();
1562
1976
  // According to the ES5 spec (11.9.3, 11.8.5), Equality comparisons (==, ===
1563
1977
  // and !=) have special handling of undefined, e.g. undefined == undefined
1564
1978
  // is 'true'. Relational comparisons have a different semantic, first
@@ -1575,9 +1989,8 @@ void HCompareIDAndBranch::SetInputRepresentation(Representation r) {
1575
1989
  if (!Token::IsOrderedRelationalCompareOp(token_)) {
1576
1990
  SetFlag(kDeoptimizeOnUndefined);
1577
1991
  }
1578
- } else {
1579
- ASSERT(r.IsInteger32());
1580
1992
  }
1993
+ ChangeRepresentation(rep);
1581
1994
  }
1582
1995
 
1583
1996
 
@@ -1592,24 +2005,55 @@ void HLoadNamedField::PrintDataTo(StringStream* stream) {
1592
2005
  }
1593
2006
 
1594
2007
 
2008
+ // Returns true if an instance of this map can never find a property with this
2009
+ // name in its prototype chain. This means all prototypes up to the top are
2010
+ // fast and don't have the name in them. It would be good if we could optimize
2011
+ // polymorphic loads where the property is sometimes found in the prototype
2012
+ // chain.
2013
+ static bool PrototypeChainCanNeverResolve(
2014
+ Handle<Map> map, Handle<String> name) {
2015
+ Isolate* isolate = map->GetIsolate();
2016
+ Object* current = map->prototype();
2017
+ while (current != isolate->heap()->null_value()) {
2018
+ if (current->IsJSGlobalProxy() ||
2019
+ current->IsGlobalObject() ||
2020
+ !current->IsJSObject() ||
2021
+ JSObject::cast(current)->map()->has_named_interceptor() ||
2022
+ JSObject::cast(current)->IsAccessCheckNeeded() ||
2023
+ !JSObject::cast(current)->HasFastProperties()) {
2024
+ return false;
2025
+ }
2026
+
2027
+ LookupResult lookup(isolate);
2028
+ Map* map = JSObject::cast(current)->map();
2029
+ map->LookupDescriptor(NULL, *name, &lookup);
2030
+ if (lookup.IsFound()) return false;
2031
+ if (!lookup.IsCacheable()) return false;
2032
+ current = JSObject::cast(current)->GetPrototype();
2033
+ }
2034
+ return true;
2035
+ }
2036
+
2037
+
1595
2038
  HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
1596
2039
  HValue* object,
1597
2040
  SmallMapList* types,
1598
- Handle<String> name)
1599
- : types_(Min(types->length(), kMaxLoadPolymorphism)),
2041
+ Handle<String> name,
2042
+ Zone* zone)
2043
+ : types_(Min(types->length(), kMaxLoadPolymorphism), zone),
1600
2044
  name_(name),
1601
2045
  need_generic_(false) {
1602
2046
  SetOperandAt(0, context);
1603
2047
  SetOperandAt(1, object);
1604
2048
  set_representation(Representation::Tagged());
1605
2049
  SetGVNFlag(kDependsOnMaps);
1606
- int map_transitions = 0;
2050
+ SmallMapList negative_lookups;
1607
2051
  for (int i = 0;
1608
2052
  i < types->length() && types_.length() < kMaxLoadPolymorphism;
1609
2053
  ++i) {
1610
2054
  Handle<Map> map = types->at(i);
1611
2055
  LookupResult lookup(map->GetIsolate());
1612
- map->LookupInDescriptors(NULL, *name, &lookup);
2056
+ map->LookupDescriptor(NULL, *name, &lookup);
1613
2057
  if (lookup.IsFound()) {
1614
2058
  switch (lookup.type()) {
1615
2059
  case FIELD: {
@@ -1619,28 +2063,45 @@ HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
1619
2063
  } else {
1620
2064
  SetGVNFlag(kDependsOnBackingStoreFields);
1621
2065
  }
1622
- types_.Add(types->at(i));
2066
+ types_.Add(types->at(i), zone);
1623
2067
  break;
1624
2068
  }
1625
2069
  case CONSTANT_FUNCTION:
1626
- types_.Add(types->at(i));
2070
+ types_.Add(types->at(i), zone);
1627
2071
  break;
1628
- case MAP_TRANSITION:
1629
- // We should just ignore these since they are not relevant to a load
1630
- // operation. This means we will deopt if we actually see this map
1631
- // from optimized code.
1632
- map_transitions++;
2072
+ case CALLBACKS:
1633
2073
  break;
1634
- default:
2074
+ case TRANSITION:
2075
+ case INTERCEPTOR:
2076
+ case NONEXISTENT:
2077
+ case NORMAL:
2078
+ case HANDLER:
2079
+ UNREACHABLE();
1635
2080
  break;
1636
2081
  }
2082
+ } else if (lookup.IsCacheable() &&
2083
+ // For dicts the lookup on the map will fail, but the object may
2084
+ // contain the property so we cannot generate a negative lookup
2085
+ // (which would just be a map check and return undefined).
2086
+ !map->is_dictionary_map() &&
2087
+ !map->has_named_interceptor() &&
2088
+ PrototypeChainCanNeverResolve(map, name)) {
2089
+ negative_lookups.Add(types->at(i), zone);
1637
2090
  }
1638
2091
  }
1639
2092
 
1640
- if (types_.length() + map_transitions == types->length() &&
1641
- FLAG_deoptimize_uncommon_cases) {
2093
+ bool need_generic =
2094
+ (types->length() != negative_lookups.length() + types_.length());
2095
+ if (!need_generic && FLAG_deoptimize_uncommon_cases) {
1642
2096
  SetFlag(kUseGVN);
2097
+ for (int i = 0; i < negative_lookups.length(); i++) {
2098
+ types_.Add(negative_lookups.at(i), zone);
2099
+ }
1643
2100
  } else {
2101
+ // We don't have an easy way to handle both a call (to the generic stub) and
2102
+ // a deopt in the same hydrogen instruction, so in this case we don't add
2103
+ // the negative lookups which can deopt - just let the generic stub handle
2104
+ // them.
1644
2105
  SetAllSideEffects();
1645
2106
  need_generic_ = true;
1646
2107
  }
@@ -1680,36 +2141,64 @@ void HLoadNamedGeneric::PrintDataTo(StringStream* stream) {
1680
2141
  }
1681
2142
 
1682
2143
 
1683
- void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
1684
- object()->PrintNameTo(stream);
2144
+ void HLoadKeyed::PrintDataTo(StringStream* stream) {
2145
+ if (!is_external()) {
2146
+ elements()->PrintNameTo(stream);
2147
+ } else {
2148
+ ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
2149
+ elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
2150
+ elements()->PrintNameTo(stream);
2151
+ stream->Add(".");
2152
+ stream->Add(ElementsKindToString(elements_kind()));
2153
+ }
2154
+
1685
2155
  stream->Add("[");
1686
2156
  key()->PrintNameTo(stream);
1687
- stream->Add("]");
1688
- if (hole_check_mode_ == PERFORM_HOLE_CHECK) {
2157
+ if (IsDehoisted()) {
2158
+ stream->Add(" + %d]", index_offset());
2159
+ } else {
2160
+ stream->Add("]");
2161
+ }
2162
+
2163
+ if (HasDependency()) {
2164
+ stream->Add(" ");
2165
+ dependency()->PrintNameTo(stream);
2166
+ }
2167
+
2168
+ if (RequiresHoleCheck()) {
1689
2169
  stream->Add(" check_hole");
1690
2170
  }
1691
2171
  }
1692
2172
 
1693
2173
 
1694
- bool HLoadKeyedFastElement::RequiresHoleCheck() {
1695
- if (hole_check_mode_ == OMIT_HOLE_CHECK) {
2174
+ bool HLoadKeyed::UsesMustHandleHole() const {
2175
+ if (IsFastPackedElementsKind(elements_kind())) {
2176
+ return false;
2177
+ }
2178
+
2179
+ if (hole_mode() == ALLOW_RETURN_HOLE) return true;
2180
+
2181
+ if (IsFastDoubleElementsKind(elements_kind())) {
1696
2182
  return false;
1697
2183
  }
1698
2184
 
1699
2185
  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1700
2186
  HValue* use = it.value();
1701
- if (!use->IsChange()) return true;
2187
+ if (!use->IsChange()) {
2188
+ return false;
2189
+ }
1702
2190
  }
1703
2191
 
1704
- return false;
2192
+ return true;
1705
2193
  }
1706
2194
 
1707
2195
 
1708
- void HLoadKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
1709
- elements()->PrintNameTo(stream);
1710
- stream->Add("[");
1711
- key()->PrintNameTo(stream);
1712
- stream->Add("]");
2196
+ bool HLoadKeyed::RequiresHoleCheck() const {
2197
+ if (IsFastPackedElementsKind(elements_kind())) {
2198
+ return false;
2199
+ }
2200
+
2201
+ return !UsesMustHandleHole();
1713
2202
  }
1714
2203
 
1715
2204
 
@@ -1725,25 +2214,26 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
1725
2214
  // Recognize generic keyed loads that use property name generated
1726
2215
  // by for-in statement as a key and rewrite them into fast property load
1727
2216
  // by index.
1728
- if (key()->IsLoadKeyedFastElement()) {
1729
- HLoadKeyedFastElement* key_load = HLoadKeyedFastElement::cast(key());
1730
- if (key_load->object()->IsForInCacheArray()) {
2217
+ if (key()->IsLoadKeyed()) {
2218
+ HLoadKeyed* key_load = HLoadKeyed::cast(key());
2219
+ if (key_load->elements()->IsForInCacheArray()) {
1731
2220
  HForInCacheArray* names_cache =
1732
- HForInCacheArray::cast(key_load->object());
2221
+ HForInCacheArray::cast(key_load->elements());
1733
2222
 
1734
2223
  if (names_cache->enumerable() == object()) {
1735
2224
  HForInCacheArray* index_cache =
1736
2225
  names_cache->index_cache();
1737
2226
  HCheckMapValue* map_check =
1738
2227
  new(block()->zone()) HCheckMapValue(object(), names_cache->map());
1739
- HInstruction* index = new(block()->zone()) HLoadKeyedFastElement(
2228
+ HInstruction* index = new(block()->zone()) HLoadKeyed(
1740
2229
  index_cache,
1741
2230
  key_load->key(),
1742
- OMIT_HOLE_CHECK);
1743
- HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
1744
- object(), index);
2231
+ key_load->key(),
2232
+ key_load->elements_kind());
1745
2233
  map_check->InsertBefore(this);
1746
2234
  index->InsertBefore(this);
2235
+ HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
2236
+ object(), index);
1747
2237
  load->InsertBefore(this);
1748
2238
  return load;
1749
2239
  }
@@ -1754,55 +2244,6 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
1754
2244
  }
1755
2245
 
1756
2246
 
1757
- void HLoadKeyedSpecializedArrayElement::PrintDataTo(
1758
- StringStream* stream) {
1759
- external_pointer()->PrintNameTo(stream);
1760
- stream->Add(".");
1761
- switch (elements_kind()) {
1762
- case EXTERNAL_BYTE_ELEMENTS:
1763
- stream->Add("byte");
1764
- break;
1765
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
1766
- stream->Add("u_byte");
1767
- break;
1768
- case EXTERNAL_SHORT_ELEMENTS:
1769
- stream->Add("short");
1770
- break;
1771
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
1772
- stream->Add("u_short");
1773
- break;
1774
- case EXTERNAL_INT_ELEMENTS:
1775
- stream->Add("int");
1776
- break;
1777
- case EXTERNAL_UNSIGNED_INT_ELEMENTS:
1778
- stream->Add("u_int");
1779
- break;
1780
- case EXTERNAL_FLOAT_ELEMENTS:
1781
- stream->Add("float");
1782
- break;
1783
- case EXTERNAL_DOUBLE_ELEMENTS:
1784
- stream->Add("double");
1785
- break;
1786
- case EXTERNAL_PIXEL_ELEMENTS:
1787
- stream->Add("pixel");
1788
- break;
1789
- case FAST_ELEMENTS:
1790
- case FAST_SMI_ELEMENTS:
1791
- case FAST_DOUBLE_ELEMENTS:
1792
- case FAST_HOLEY_ELEMENTS:
1793
- case FAST_HOLEY_SMI_ELEMENTS:
1794
- case FAST_HOLEY_DOUBLE_ELEMENTS:
1795
- case DICTIONARY_ELEMENTS:
1796
- case NON_STRICT_ARGUMENTS_ELEMENTS:
1797
- UNREACHABLE();
1798
- break;
1799
- }
1800
- stream->Add("[");
1801
- key()->PrintNameTo(stream);
1802
- stream->Add("]");
1803
- }
1804
-
1805
-
1806
2247
  void HStoreNamedGeneric::PrintDataTo(StringStream* stream) {
1807
2248
  object()->PrintNameTo(stream);
1808
2249
  stream->Add(".");
@@ -1829,20 +2270,25 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) {
1829
2270
  }
1830
2271
 
1831
2272
 
1832
- void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
1833
- object()->PrintNameTo(stream);
1834
- stream->Add("[");
1835
- key()->PrintNameTo(stream);
1836
- stream->Add("] = ");
1837
- value()->PrintNameTo(stream);
1838
- }
1839
-
2273
+ void HStoreKeyed::PrintDataTo(StringStream* stream) {
2274
+ if (!is_external()) {
2275
+ elements()->PrintNameTo(stream);
2276
+ } else {
2277
+ elements()->PrintNameTo(stream);
2278
+ stream->Add(".");
2279
+ stream->Add(ElementsKindToString(elements_kind()));
2280
+ ASSERT(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
2281
+ elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
2282
+ }
1840
2283
 
1841
- void HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
1842
- elements()->PrintNameTo(stream);
1843
2284
  stream->Add("[");
1844
2285
  key()->PrintNameTo(stream);
1845
- stream->Add("] = ");
2286
+ if (IsDehoisted()) {
2287
+ stream->Add(" + %d] = ", index_offset());
2288
+ } else {
2289
+ stream->Add("] = ");
2290
+ }
2291
+
1846
2292
  value()->PrintNameTo(stream);
1847
2293
  }
1848
2294
 
@@ -1856,56 +2302,6 @@ void HStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
1856
2302
  }
1857
2303
 
1858
2304
 
1859
- void HStoreKeyedSpecializedArrayElement::PrintDataTo(
1860
- StringStream* stream) {
1861
- external_pointer()->PrintNameTo(stream);
1862
- stream->Add(".");
1863
- switch (elements_kind()) {
1864
- case EXTERNAL_BYTE_ELEMENTS:
1865
- stream->Add("byte");
1866
- break;
1867
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
1868
- stream->Add("u_byte");
1869
- break;
1870
- case EXTERNAL_SHORT_ELEMENTS:
1871
- stream->Add("short");
1872
- break;
1873
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
1874
- stream->Add("u_short");
1875
- break;
1876
- case EXTERNAL_INT_ELEMENTS:
1877
- stream->Add("int");
1878
- break;
1879
- case EXTERNAL_UNSIGNED_INT_ELEMENTS:
1880
- stream->Add("u_int");
1881
- break;
1882
- case EXTERNAL_FLOAT_ELEMENTS:
1883
- stream->Add("float");
1884
- break;
1885
- case EXTERNAL_DOUBLE_ELEMENTS:
1886
- stream->Add("double");
1887
- break;
1888
- case EXTERNAL_PIXEL_ELEMENTS:
1889
- stream->Add("pixel");
1890
- break;
1891
- case FAST_SMI_ELEMENTS:
1892
- case FAST_ELEMENTS:
1893
- case FAST_DOUBLE_ELEMENTS:
1894
- case FAST_HOLEY_SMI_ELEMENTS:
1895
- case FAST_HOLEY_ELEMENTS:
1896
- case FAST_HOLEY_DOUBLE_ELEMENTS:
1897
- case DICTIONARY_ELEMENTS:
1898
- case NON_STRICT_ARGUMENTS_ELEMENTS:
1899
- UNREACHABLE();
1900
- break;
1901
- }
1902
- stream->Add("[");
1903
- key()->PrintNameTo(stream);
1904
- stream->Add("] = ");
1905
- value()->PrintNameTo(stream);
1906
- }
1907
-
1908
-
1909
2305
  void HTransitionElementsKind::PrintDataTo(StringStream* stream) {
1910
2306
  object()->PrintNameTo(stream);
1911
2307
  ElementsKind from_kind = original_map()->elements_kind();
@@ -1925,7 +2321,7 @@ void HLoadGlobalCell::PrintDataTo(StringStream* stream) {
1925
2321
  }
1926
2322
 
1927
2323
 
1928
- bool HLoadGlobalCell::RequiresHoleCheck() {
2324
+ bool HLoadGlobalCell::RequiresHoleCheck() const {
1929
2325
  if (details_.IsDontDelete() && !details_.IsReadOnly()) return false;
1930
2326
  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1931
2327
  HValue* use = it.value();
@@ -2007,6 +2403,10 @@ HType HPhi::CalculateInferredType() {
2007
2403
 
2008
2404
 
2009
2405
  HType HConstant::CalculateInferredType() {
2406
+ if (has_int32_value_) {
2407
+ return Smi::IsValid(int32_value_) ? HType::Smi() : HType::HeapNumber();
2408
+ }
2409
+ if (has_double_value_) return HType::HeapNumber();
2010
2410
  return HType::TypeFromValue(handle_);
2011
2411
  }
2012
2412
 
@@ -2072,6 +2472,11 @@ HType HAllocateObject::CalculateInferredType() {
2072
2472
  }
2073
2473
 
2074
2474
 
2475
+ HType HAllocate::CalculateInferredType() {
2476
+ return type_;
2477
+ }
2478
+
2479
+
2075
2480
  HType HFastLiteral::CalculateInferredType() {
2076
2481
  // TODO(mstarzinger): Be smarter, could also be JSArray here.
2077
2482
  return HType::JSObject();
@@ -2154,6 +2559,13 @@ HValue* HDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2154
2559
  }
2155
2560
 
2156
2561
 
2562
+ HValue* HMathFloorOfDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2563
+ visited->Add(id());
2564
+ SetFlag(kBailoutOnMinusZero);
2565
+ return NULL;
2566
+ }
2567
+
2568
+
2157
2569
  HValue* HMul::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2158
2570
  visited->Add(id());
2159
2571
  if (range() == NULL || range()->CanBeMinusZero()) {
@@ -2185,13 +2597,22 @@ HValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2185
2597
  }
2186
2598
 
2187
2599
 
2188
- bool HStoreKeyedFastDoubleElement::NeedsCanonicalization() {
2189
- // If value was loaded from unboxed double backing store or
2190
- // converted from an integer then we don't have to canonicalize it.
2191
- if (value()->IsLoadKeyedFastDoubleElement() ||
2192
- (value()->IsChange() && HChange::cast(value())->from().IsInteger32())) {
2600
+ bool HStoreKeyed::NeedsCanonicalization() {
2601
+ // If value is an integer or smi or comes from the result of a keyed load or
2602
+ // constant then it is either be a non-hole value or in the case of a constant
2603
+ // the hole is only being stored explicitly: no need for canonicalization.
2604
+ if (value()->IsLoadKeyed() || value()->IsConstant()) {
2193
2605
  return false;
2194
2606
  }
2607
+
2608
+ if (value()->IsChange()) {
2609
+ if (HChange::cast(value())->from().IsInteger32()) {
2610
+ return false;
2611
+ }
2612
+ if (HChange::cast(value())->value()->type().IsSmi()) {
2613
+ return false;
2614
+ }
2615
+ }
2195
2616
  return true;
2196
2617
  }
2197
2618
 
@@ -2371,7 +2792,41 @@ void HBitwise::PrintDataTo(StringStream* stream) {
2371
2792
  }
2372
2793
 
2373
2794
 
2374
- Representation HPhi::InferredRepresentation() {
2795
+ void HPhi::InferRepresentation(HInferRepresentation* h_infer) {
2796
+ ASSERT(CheckFlag(kFlexibleRepresentation));
2797
+ // If there are non-Phi uses, and all of them have observed the same
2798
+ // representation, than that's what this Phi is going to use.
2799
+ Representation new_rep = RepresentationObservedByAllNonPhiUses();
2800
+ if (!new_rep.IsNone()) {
2801
+ UpdateRepresentation(new_rep, h_infer, "unanimous use observations");
2802
+ return;
2803
+ }
2804
+ new_rep = RepresentationFromInputs();
2805
+ UpdateRepresentation(new_rep, h_infer, "inputs");
2806
+ new_rep = RepresentationFromUses();
2807
+ UpdateRepresentation(new_rep, h_infer, "uses");
2808
+ new_rep = RepresentationFromUseRequirements();
2809
+ UpdateRepresentation(new_rep, h_infer, "use requirements");
2810
+ }
2811
+
2812
+
2813
+ Representation HPhi::RepresentationObservedByAllNonPhiUses() {
2814
+ int non_phi_use_count = 0;
2815
+ for (int i = Representation::kInteger32;
2816
+ i < Representation::kNumRepresentations; ++i) {
2817
+ non_phi_use_count += non_phi_uses_[i];
2818
+ }
2819
+ if (non_phi_use_count <= 1) return Representation::None();
2820
+ for (int i = 0; i < Representation::kNumRepresentations; ++i) {
2821
+ if (non_phi_uses_[i] == non_phi_use_count) {
2822
+ return Representation::FromKind(static_cast<Representation::Kind>(i));
2823
+ }
2824
+ }
2825
+ return Representation::None();
2826
+ }
2827
+
2828
+
2829
+ Representation HPhi::RepresentationFromInputs() {
2375
2830
  bool double_occurred = false;
2376
2831
  bool int32_occurred = false;
2377
2832
  for (int i = 0; i < OperandCount(); ++i) {
@@ -2380,6 +2835,7 @@ Representation HPhi::InferredRepresentation() {
2380
2835
  HPhi* hint_value = HUnknownOSRValue::cast(value)->incoming_value();
2381
2836
  if (hint_value != NULL) {
2382
2837
  Representation hint = hint_value->representation();
2838
+ if (hint.IsTagged()) return hint;
2383
2839
  if (hint.IsDouble()) double_occurred = true;
2384
2840
  if (hint.IsInteger32()) int32_occurred = true;
2385
2841
  }
@@ -2398,7 +2854,9 @@ Representation HPhi::InferredRepresentation() {
2398
2854
  return Representation::Tagged();
2399
2855
  }
2400
2856
  } else {
2401
- return Representation::Tagged();
2857
+ if (value->IsPhi() && !IsConvertibleToInteger()) {
2858
+ return Representation::Tagged();
2859
+ }
2402
2860
  }
2403
2861
  }
2404
2862
  }
@@ -2411,6 +2869,37 @@ Representation HPhi::InferredRepresentation() {
2411
2869
  }
2412
2870
 
2413
2871
 
2872
+ Representation HPhi::RepresentationFromUseRequirements() {
2873
+ Representation all_uses_require = Representation::None();
2874
+ bool all_uses_require_the_same = true;
2875
+ for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
2876
+ // We check for observed_input_representation elsewhere.
2877
+ Representation use_rep =
2878
+ it.value()->RequiredInputRepresentation(it.index());
2879
+ // No useful info from this use -> look at the next one.
2880
+ if (use_rep.IsNone()) {
2881
+ continue;
2882
+ }
2883
+ if (use_rep.Equals(all_uses_require)) {
2884
+ continue;
2885
+ }
2886
+ // This use's representation contradicts what we've seen so far.
2887
+ if (!all_uses_require.IsNone()) {
2888
+ ASSERT(!use_rep.Equals(all_uses_require));
2889
+ all_uses_require_the_same = false;
2890
+ break;
2891
+ }
2892
+ // Otherwise, initialize observed representation.
2893
+ all_uses_require = use_rep;
2894
+ }
2895
+ if (all_uses_require_the_same) {
2896
+ return all_uses_require;
2897
+ }
2898
+
2899
+ return Representation::None();
2900
+ }
2901
+
2902
+
2414
2903
  // Node-specific verification code is only included in debug mode.
2415
2904
  #ifdef DEBUG
2416
2905
 
@@ -2449,12 +2938,6 @@ void HCheckFunction::Verify() {
2449
2938
  ASSERT(HasNoUses());
2450
2939
  }
2451
2940
 
2452
-
2453
- void HCheckPrototypeMaps::Verify() {
2454
- HInstruction::Verify();
2455
- ASSERT(HasNoUses());
2456
- }
2457
-
2458
2941
  #endif
2459
2942
 
2460
2943
  } } // namespace v8::internal