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
@@ -192,7 +192,7 @@ void Decoder::PrintSRegister(int reg) {
192
192
  Print(VFPRegisters::Name(reg, false));
193
193
  }
194
194
 
195
- // Print the VFP D register name according to the active name converter.
195
+ // Print the VFP D register name according to the active name converter.
196
196
  void Decoder::PrintDRegister(int reg) {
197
197
  Print(VFPRegisters::Name(reg, true));
198
198
  }
@@ -381,7 +381,16 @@ int Decoder::FormatVFPRegister(Instruction* instr, const char* format) {
381
381
  } else if (format[1] == 'm') {
382
382
  reg = instr->VFPMRegValue(precision);
383
383
  } else if (format[1] == 'd') {
384
- reg = instr->VFPDRegValue(precision);
384
+ if ((instr->TypeValue() == 7) &&
385
+ (instr->Bit(24) == 0x0) &&
386
+ (instr->Bits(11, 9) == 0x5) &&
387
+ (instr->Bit(4) == 0x1)) {
388
+ // vmov.32 has Vd in a different place.
389
+ reg = instr->Bits(19, 16) | (instr->Bit(7) << 4);
390
+ } else {
391
+ reg = instr->VFPDRegValue(precision);
392
+ }
393
+
385
394
  if (format[2] == '+') {
386
395
  int immed8 = instr->Immed8Value();
387
396
  if (format[0] == 'S') reg += immed8 - 1;
@@ -692,11 +701,19 @@ void Decoder::DecodeType01(Instruction* instr) {
692
701
  // Rn field to encode it.
693
702
  Format(instr, "mul'cond's 'rn, 'rm, 'rs");
694
703
  } else {
695
- // The MLA instruction description (A 4.1.28) refers to the order
696
- // of registers as "Rd, Rm, Rs, Rn". But confusingly it uses the
697
- // Rn field to encode the Rd register and the Rd field to encode
698
- // the Rn register.
699
- Format(instr, "mla'cond's 'rn, 'rm, 'rs, 'rd");
704
+ if (instr->Bit(22) == 0) {
705
+ // The MLA instruction description (A 4.1.28) refers to the order
706
+ // of registers as "Rd, Rm, Rs, Rn". But confusingly it uses the
707
+ // Rn field to encode the Rd register and the Rd field to encode
708
+ // the Rn register.
709
+ Format(instr, "mla'cond's 'rn, 'rm, 'rs, 'rd");
710
+ } else {
711
+ // The MLS instruction description (A 4.1.29) refers to the order
712
+ // of registers as "Rd, Rm, Rs, Rn". But confusingly it uses the
713
+ // Rn field to encode the Rd register and the Rd field to encode
714
+ // the Rn register.
715
+ Format(instr, "mls'cond's 'rn, 'rm, 'rs, 'rd");
716
+ }
700
717
  }
701
718
  } else {
702
719
  // The signed/long multiply instructions use the terms RdHi and RdLo
@@ -822,6 +839,8 @@ void Decoder::DecodeType01(Instruction* instr) {
822
839
  } else {
823
840
  Unknown(instr); // not used by V8
824
841
  }
842
+ } else if ((type == 1) && instr->IsNopType1()) {
843
+ Format(instr, "nop'cond");
825
844
  } else {
826
845
  switch (instr->OpcodeField()) {
827
846
  case AND: {
@@ -974,6 +993,17 @@ void Decoder::DecodeType3(Instruction* instr) {
974
993
  break;
975
994
  }
976
995
  case db_x: {
996
+ if (FLAG_enable_sudiv) {
997
+ if (!instr->HasW()) {
998
+ if (instr->Bits(5, 4) == 0x1) {
999
+ if ((instr->Bit(22) == 0x0) && (instr->Bit(20) == 0x1)) {
1000
+ // SDIV (in V8 notation matching ARM ISA format) rn = rm/rs
1001
+ Format(instr, "sdiv'cond'b 'rn, 'rm, 'rs");
1002
+ break;
1003
+ }
1004
+ }
1005
+ }
1006
+ }
977
1007
  Format(instr, "'memop'cond'b 'rd, ['rn, -'shift_rm]'w");
978
1008
  break;
979
1009
  }
@@ -1077,6 +1107,7 @@ int Decoder::DecodeType7(Instruction* instr) {
1077
1107
  // Dd = vadd(Dn, Dm)
1078
1108
  // Dd = vsub(Dn, Dm)
1079
1109
  // Dd = vmul(Dn, Dm)
1110
+ // Dd = vmla(Dn, Dm)
1080
1111
  // Dd = vdiv(Dn, Dm)
1081
1112
  // vcmp(Dd, Dm)
1082
1113
  // vmrs
@@ -1139,6 +1170,12 @@ void Decoder::DecodeTypeVFP(Instruction* instr) {
1139
1170
  } else {
1140
1171
  Unknown(instr); // Not used by V8.
1141
1172
  }
1173
+ } else if ((instr->Opc1Value() == 0x0) && !(instr->Opc3Value() & 0x1)) {
1174
+ if (instr->SzValue() == 0x1) {
1175
+ Format(instr, "vmla.f64'cond 'Dd, 'Dn, 'Dm");
1176
+ } else {
1177
+ Unknown(instr); // Not used by V8.
1178
+ }
1142
1179
  } else if ((instr->Opc1Value() == 0x4) && !(instr->Opc3Value() & 0x1)) {
1143
1180
  if (instr->SzValue() == 0x1) {
1144
1181
  Format(instr, "vdiv.f64'cond 'Dd, 'Dn, 'Dm");
@@ -1152,6 +1189,14 @@ void Decoder::DecodeTypeVFP(Instruction* instr) {
1152
1189
  if ((instr->VCValue() == 0x0) &&
1153
1190
  (instr->VAValue() == 0x0)) {
1154
1191
  DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr);
1192
+ } else if ((instr->VLValue() == 0x0) &&
1193
+ (instr->VCValue() == 0x1) &&
1194
+ (instr->Bit(23) == 0x0)) {
1195
+ if (instr->Bit(21) == 0x0) {
1196
+ Format(instr, "vmov.32'cond 'Dd[0], 'rt");
1197
+ } else {
1198
+ Format(instr, "vmov.32'cond 'Dd[1], 'rt");
1199
+ }
1155
1200
  } else if ((instr->VCValue() == 0x0) &&
1156
1201
  (instr->VAValue() == 0x7) &&
1157
1202
  (instr->Bits(19, 16) == 0x1)) {
@@ -1315,7 +1360,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
1315
1360
  switch (instr->OpcodeValue()) {
1316
1361
  case 0x2:
1317
1362
  // Load and store double to two GP registers
1318
- if (instr->Bits(7, 4) != 0x1) {
1363
+ if (instr->Bits(7, 6) != 0 || instr->Bit(4) != 1) {
1319
1364
  Unknown(instr); // Not used by V8.
1320
1365
  } else if (instr->HasL()) {
1321
1366
  Format(instr, "vmov'cond 'rt, 'rn, 'Dm");
@@ -1324,6 +1369,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
1324
1369
  }
1325
1370
  break;
1326
1371
  case 0x8:
1372
+ case 0xA:
1327
1373
  if (instr->HasL()) {
1328
1374
  Format(instr, "vldr'cond 'Dd, ['rn - 4*'imm08@00]");
1329
1375
  } else {
@@ -1331,6 +1377,7 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
1331
1377
  }
1332
1378
  break;
1333
1379
  case 0xC:
1380
+ case 0xE:
1334
1381
  if (instr->HasL()) {
1335
1382
  Format(instr, "vldr'cond 'Dd, ['rn + 4*'imm08@00]");
1336
1383
  } else {
@@ -1339,7 +1386,10 @@ void Decoder::DecodeType6CoprocessorIns(Instruction* instr) {
1339
1386
  break;
1340
1387
  case 0x4:
1341
1388
  case 0x5:
1342
- case 0x9: {
1389
+ case 0x6:
1390
+ case 0x7:
1391
+ case 0x9:
1392
+ case 0xB: {
1343
1393
  bool to_vfp_register = (instr->VLValue() == 0x1);
1344
1394
  if (to_vfp_register) {
1345
1395
  Format(instr, "vldm'cond'pu 'rn'w, {'Dd-'Dd+}");
@@ -1367,7 +1417,7 @@ bool Decoder::IsConstantPoolAt(byte* instr_ptr) {
1367
1417
  int Decoder::ConstantPoolSizeAt(byte* instr_ptr) {
1368
1418
  if (IsConstantPoolAt(instr_ptr)) {
1369
1419
  int instruction_bits = *(reinterpret_cast<int*>(instr_ptr));
1370
- return instruction_bits & kConstantPoolLengthMask;
1420
+ return DecodeConstantPoolLength(instruction_bits);
1371
1421
  } else {
1372
1422
  return -1;
1373
1423
  }
@@ -1389,8 +1439,7 @@ int Decoder::InstructionDecode(byte* instr_ptr) {
1389
1439
  if ((instruction_bits & kConstantPoolMarkerMask) == kConstantPoolMarker) {
1390
1440
  out_buffer_pos_ += OS::SNPrintF(out_buffer_ + out_buffer_pos_,
1391
1441
  "constant pool begin (length %d)",
1392
- instruction_bits &
1393
- kConstantPoolLengthMask);
1442
+ DecodeConstantPoolLength(instruction_bits));
1394
1443
  return Instruction::kInstrSize;
1395
1444
  }
1396
1445
  switch (instr->TypeValue()) {
@@ -134,20 +134,6 @@ class ExitFrameConstants : public AllStatic {
134
134
  };
135
135
 
136
136
 
137
- class StandardFrameConstants : public AllStatic {
138
- public:
139
- // Fixed part of the frame consists of return address, caller fp,
140
- // context and function.
141
- static const int kFixedFrameSize = 4 * kPointerSize;
142
- static const int kExpressionsOffset = -3 * kPointerSize;
143
- static const int kMarkerOffset = -2 * kPointerSize;
144
- static const int kContextOffset = -1 * kPointerSize;
145
- static const int kCallerFPOffset = 0 * kPointerSize;
146
- static const int kCallerPCOffset = 1 * kPointerSize;
147
- static const int kCallerSPOffset = 2 * kPointerSize;
148
- };
149
-
150
-
151
137
  class JavaScriptFrameConstants : public AllStatic {
152
138
  public:
153
139
  // FP-relative.
@@ -73,9 +73,6 @@ class JumpPatchSite BASE_EMBEDDED {
73
73
  Assembler::BlockConstPoolScope block_const_pool(masm_);
74
74
  __ bind(&patch_site_);
75
75
  __ cmp(reg, Operand(reg));
76
- // Don't use b(al, ...) as that might emit the constant pool right after the
77
- // branch. After patching when the branch is no longer unconditional
78
- // execution can continue into the constant pool.
79
76
  __ b(eq, target); // Always taken before patched.
80
77
  }
81
78
 
@@ -90,6 +87,8 @@ class JumpPatchSite BASE_EMBEDDED {
90
87
  }
91
88
 
92
89
  void EmitPatchInfo() {
90
+ // Block literal pool emission whilst recording patch site information.
91
+ Assembler::BlockConstPoolScope block_const_pool(masm_);
93
92
  if (patch_site_.is_bound()) {
94
93
  int delta_to_patch_site = masm_->InstructionsGeneratedSince(&patch_site_);
95
94
  Register reg;
@@ -131,13 +130,15 @@ void FullCodeGenerator::Generate() {
131
130
  handler_table_ =
132
131
  isolate()->factory()->NewFixedArray(function()->handler_count(), TENURED);
133
132
  profiling_counter_ = isolate()->factory()->NewJSGlobalPropertyCell(
134
- Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget)));
133
+ Handle<Smi>(Smi::FromInt(FLAG_interrupt_budget), isolate()));
135
134
  SetFunctionPosition(function());
136
135
  Comment cmnt(masm_, "[ function compiled by full code generator");
137
136
 
137
+ ProfileEntryHookStub::MaybeCallEntryHook(masm_);
138
+
138
139
  #ifdef DEBUG
139
140
  if (strlen(FLAG_stop_at) > 0 &&
140
- info->function()->name()->IsEqualTo(CStrVector(FLAG_stop_at))) {
141
+ info->function()->name()->IsUtf8EqualTo(CStrVector(FLAG_stop_at))) {
141
142
  __ stop("stop-at");
142
143
  }
143
144
  #endif
@@ -148,7 +149,7 @@ void FullCodeGenerator::Generate() {
148
149
  // function calls.
149
150
  if (!info->is_classic_mode() || info->is_native()) {
150
151
  Label ok;
151
- __ cmp(r5, Operand(0));
152
+ __ cmp(r5, Operand::Zero());
152
153
  __ b(eq, &ok);
153
154
  int receiver_offset = info->scope()->num_parameters() * kPointerSize;
154
155
  __ LoadRoot(r2, Heap::kUndefinedValueRootIndex);
@@ -163,14 +164,19 @@ void FullCodeGenerator::Generate() {
163
164
 
164
165
  int locals_count = info->scope()->num_stack_slots();
165
166
 
166
- __ Push(lr, fp, cp, r1);
167
- if (locals_count > 0) {
167
+ info->set_prologue_offset(masm_->pc_offset());
168
+ {
169
+ PredictableCodeSizeScope predictible_code_size_scope(
170
+ masm_, kNoCodeAgeSequenceLength * Assembler::kInstrSize);
171
+ // The following three instructions must remain together and unmodified
172
+ // for code aging to work properly.
173
+ __ stm(db_w, sp, r1.bit() | cp.bit() | fp.bit() | lr.bit());
168
174
  // Load undefined value here, so the value is ready for the loop
169
175
  // below.
170
176
  __ LoadRoot(ip, Heap::kUndefinedValueRootIndex);
177
+ // Adjust FP to point to saved FP.
178
+ __ add(fp, sp, Operand(2 * kPointerSize));
171
179
  }
172
- // Adjust fp to point to caller's fp.
173
- __ add(fp, sp, Operand(2 * kPointerSize));
174
180
 
175
181
  { Comment cmnt(masm_, "[ Allocate locals");
176
182
  for (int i = 0; i < locals_count; i++) {
@@ -183,10 +189,13 @@ void FullCodeGenerator::Generate() {
183
189
  // Possibly allocate a local context.
184
190
  int heap_slots = info->scope()->num_heap_slots() - Context::MIN_CONTEXT_SLOTS;
185
191
  if (heap_slots > 0) {
186
- Comment cmnt(masm_, "[ Allocate local context");
187
- // Argument to NewContext is the function, which is in r1.
192
+ // Argument to NewContext is the function, which is still in r1.
193
+ Comment cmnt(masm_, "[ Allocate context");
188
194
  __ push(r1);
189
- if (heap_slots <= FastNewContextStub::kMaximumSlots) {
195
+ if (FLAG_harmony_scoping && info->scope()->is_global_scope()) {
196
+ __ Push(info->scope()->GetScopeInfo());
197
+ __ CallRuntime(Runtime::kNewGlobalContext, 2);
198
+ } else if (heap_slots <= FastNewContextStub::kMaximumSlots) {
190
199
  FastNewContextStub stub(heap_slots);
191
200
  __ CallStub(&stub);
192
201
  } else {
@@ -263,7 +272,7 @@ void FullCodeGenerator::Generate() {
263
272
  scope()->VisitIllegalRedeclaration(this);
264
273
 
265
274
  } else {
266
- PrepareForBailoutForId(AstNode::kFunctionEntryId, NO_REGISTERS);
275
+ PrepareForBailoutForId(BailoutId::FunctionEntry(), NO_REGISTERS);
267
276
  { Comment cmnt(masm_, "[ Declarations");
268
277
  // For named function expressions, declare the function name as a
269
278
  // constant.
@@ -278,11 +287,12 @@ void FullCodeGenerator::Generate() {
278
287
  }
279
288
 
280
289
  { Comment cmnt(masm_, "[ Stack check");
281
- PrepareForBailoutForId(AstNode::kDeclarationsId, NO_REGISTERS);
290
+ PrepareForBailoutForId(BailoutId::Declarations(), NO_REGISTERS);
282
291
  Label ok;
283
292
  __ LoadRoot(ip, Heap::kStackLimitRootIndex);
284
293
  __ cmp(sp, Operand(ip));
285
294
  __ b(hs, &ok);
295
+ PredictableCodeSizeScope predictable(masm_, 2 * Assembler::kInstrSize);
286
296
  StackCheckStub stub;
287
297
  __ CallStub(&stub);
288
298
  __ bind(&ok);
@@ -329,7 +339,7 @@ void FullCodeGenerator::EmitProfilingCounterReset() {
329
339
  }
330
340
  if (isolate()->IsDebuggerActive()) {
331
341
  // Detect debug break requests as soon as possible.
332
- reset_value = 10;
342
+ reset_value = FLAG_interrupt_budget >> 4;
333
343
  }
334
344
  __ mov(r2, Operand(profiling_counter_));
335
345
  __ mov(r3, Operand(Smi::FromInt(reset_value)));
@@ -337,43 +347,31 @@ void FullCodeGenerator::EmitProfilingCounterReset() {
337
347
  }
338
348
 
339
349
 
340
- static const int kMaxBackEdgeWeight = 127;
341
- static const int kBackEdgeDistanceDivisor = 142;
342
-
343
-
344
- void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt,
345
- Label* back_edge_target) {
346
- Comment cmnt(masm_, "[ Stack check");
350
+ void FullCodeGenerator::EmitBackEdgeBookkeeping(IterationStatement* stmt,
351
+ Label* back_edge_target) {
352
+ Comment cmnt(masm_, "[ Back edge bookkeeping");
353
+ // Block literal pools whilst emitting stack check code.
354
+ Assembler::BlockConstPoolScope block_const_pool(masm_);
347
355
  Label ok;
348
356
 
349
- if (FLAG_count_based_interrupts) {
350
- int weight = 1;
351
- if (FLAG_weighted_back_edges) {
352
- ASSERT(back_edge_target->is_bound());
353
- int distance = masm_->SizeOfCodeGeneratedSince(back_edge_target);
354
- weight = Min(kMaxBackEdgeWeight,
355
- Max(1, distance / kBackEdgeDistanceDivisor));
356
- }
357
- EmitProfilingCounterDecrement(weight);
358
- __ b(pl, &ok);
359
- InterruptStub stub;
360
- __ CallStub(&stub);
361
- } else {
362
- __ LoadRoot(ip, Heap::kStackLimitRootIndex);
363
- __ cmp(sp, Operand(ip));
364
- __ b(hs, &ok);
365
- StackCheckStub stub;
366
- __ CallStub(&stub);
357
+ int weight = 1;
358
+ if (FLAG_weighted_back_edges) {
359
+ ASSERT(back_edge_target->is_bound());
360
+ int distance = masm_->SizeOfCodeGeneratedSince(back_edge_target);
361
+ weight = Min(kMaxBackEdgeWeight,
362
+ Max(1, distance / kBackEdgeDistanceUnit));
367
363
  }
364
+ EmitProfilingCounterDecrement(weight);
365
+ __ b(pl, &ok);
366
+ InterruptStub stub;
367
+ __ CallStub(&stub);
368
368
 
369
369
  // Record a mapping of this PC offset to the OSR id. This is used to find
370
370
  // the AST id from the unoptimized code in order to use it as a key into
371
371
  // the deoptimization input data found in the optimized code.
372
- RecordStackCheck(stmt->OsrEntryId());
372
+ RecordBackEdge(stmt->OsrEntryId());
373
373
 
374
- if (FLAG_count_based_interrupts) {
375
- EmitProfilingCounterReset();
376
- }
374
+ EmitProfilingCounterReset();
377
375
 
378
376
  __ bind(&ok);
379
377
  PrepareForBailoutForId(stmt->EntryId(), NO_REGISTERS);
@@ -404,7 +402,7 @@ void FullCodeGenerator::EmitReturnSequence() {
404
402
  } else if (FLAG_weighted_back_edges) {
405
403
  int distance = masm_->pc_offset();
406
404
  weight = Min(kMaxBackEdgeWeight,
407
- Max(1, distance / kBackEdgeDistanceDivisor));
405
+ Max(1, distance / kBackEdgeDistanceUnit));
408
406
  }
409
407
  EmitProfilingCounterDecrement(weight);
410
408
  Label ok;
@@ -435,6 +433,8 @@ void FullCodeGenerator::EmitReturnSequence() {
435
433
  // tool from instrumenting as we rely on the code size here.
436
434
  int32_t sp_delta = (info_->scope()->num_parameters() + 1) * kPointerSize;
437
435
  CodeGenerator::RecordPositions(masm_, function()->end_position() - 1);
436
+ // TODO(svenpanne) The code below is sometimes 4 words, sometimes 5!
437
+ PredictableCodeSizeScope predictable(masm_, -1);
438
438
  __ RecordJSReturn();
439
439
  masm_->mov(sp, fp);
440
440
  masm_->ldm(ia_w, sp, fp.bit() | lr.bit());
@@ -674,18 +674,9 @@ void FullCodeGenerator::DoTest(Expression* condition,
674
674
  Label* if_true,
675
675
  Label* if_false,
676
676
  Label* fall_through) {
677
- if (CpuFeatures::IsSupported(VFP3)) {
678
- ToBooleanStub stub(result_register());
679
- __ CallStub(&stub);
680
- __ tst(result_register(), result_register());
681
- } else {
682
- // Call the runtime to find the boolean value of the source and then
683
- // translate it into control flow to the pair of labels.
684
- __ push(result_register());
685
- __ CallRuntime(Runtime::kToBool, 1);
686
- __ LoadRoot(ip, Heap::kFalseValueRootIndex);
687
- __ cmp(r0, ip);
688
- }
677
+ ToBooleanStub stub(result_register());
678
+ __ CallStub(&stub, condition->test_id());
679
+ __ tst(result_register(), result_register());
689
680
  Split(ne, if_true, if_false, fall_through);
690
681
  }
691
682
 
@@ -786,7 +777,7 @@ void FullCodeGenerator::EmitDebugCheckDeclarationContext(Variable* variable) {
786
777
  // The variable in the declaration always resides in the current function
787
778
  // context.
788
779
  ASSERT_EQ(0, scope()->ContextChainLength(variable->scope()));
789
- if (FLAG_debug_code) {
780
+ if (generate_debug_code_) {
790
781
  // Check that we're not inside a with or catch context.
791
782
  __ ldr(r1, FieldMemOperand(cp, HeapObject::kMapOffset));
792
783
  __ CompareRoot(r1, Heap::kWithContextMapRootIndex);
@@ -808,10 +799,11 @@ void FullCodeGenerator::VisitVariableDeclaration(
808
799
  bool hole_init = mode == CONST || mode == CONST_HARMONY || mode == LET;
809
800
  switch (variable->location()) {
810
801
  case Variable::UNALLOCATED:
811
- globals_->Add(variable->name());
802
+ globals_->Add(variable->name(), zone());
812
803
  globals_->Add(variable->binding_needs_init()
813
804
  ? isolate()->factory()->the_hole_value()
814
- : isolate()->factory()->undefined_value());
805
+ : isolate()->factory()->undefined_value(),
806
+ zone());
815
807
  break;
816
808
 
817
809
  case Variable::PARAMETER:
@@ -838,10 +830,9 @@ void FullCodeGenerator::VisitVariableDeclaration(
838
830
  Comment cmnt(masm_, "[ VariableDeclaration");
839
831
  __ mov(r2, Operand(variable->name()));
840
832
  // Declaration nodes are always introduced in one of four modes.
841
- ASSERT(mode == VAR || mode == LET ||
842
- mode == CONST || mode == CONST_HARMONY);
843
- PropertyAttributes attr = (mode == CONST || mode == CONST_HARMONY)
844
- ? READ_ONLY : NONE;
833
+ ASSERT(IsDeclaredVariableMode(mode));
834
+ PropertyAttributes attr =
835
+ IsImmutableVariableMode(mode) ? READ_ONLY : NONE;
845
836
  __ mov(r1, Operand(Smi::FromInt(attr)));
846
837
  // Push initial value, if any.
847
838
  // Note: For variables we must not push an initial value (such as
@@ -867,12 +858,12 @@ void FullCodeGenerator::VisitFunctionDeclaration(
867
858
  Variable* variable = proxy->var();
868
859
  switch (variable->location()) {
869
860
  case Variable::UNALLOCATED: {
870
- globals_->Add(variable->name());
861
+ globals_->Add(variable->name(), zone());
871
862
  Handle<SharedFunctionInfo> function =
872
863
  Compiler::BuildFunctionInfo(declaration->fun(), script());
873
864
  // Check for stack-overflow exception.
874
865
  if (function.is_null()) return SetStackOverflow();
875
- globals_->Add(function);
866
+ globals_->Add(function, zone());
876
867
  break;
877
868
  }
878
869
 
@@ -918,34 +909,33 @@ void FullCodeGenerator::VisitFunctionDeclaration(
918
909
 
919
910
 
920
911
  void FullCodeGenerator::VisitModuleDeclaration(ModuleDeclaration* declaration) {
921
- VariableProxy* proxy = declaration->proxy();
922
- Variable* variable = proxy->var();
923
- Handle<JSModule> instance = declaration->module()->interface()->Instance();
924
- ASSERT(!instance.is_null());
912
+ Variable* variable = declaration->proxy()->var();
913
+ ASSERT(variable->location() == Variable::CONTEXT);
914
+ ASSERT(variable->interface()->IsFrozen());
925
915
 
926
- switch (variable->location()) {
927
- case Variable::UNALLOCATED: {
928
- Comment cmnt(masm_, "[ ModuleDeclaration");
929
- globals_->Add(variable->name());
930
- globals_->Add(instance);
931
- Visit(declaration->module());
932
- break;
933
- }
916
+ Comment cmnt(masm_, "[ ModuleDeclaration");
917
+ EmitDebugCheckDeclarationContext(variable);
934
918
 
935
- case Variable::CONTEXT: {
936
- Comment cmnt(masm_, "[ ModuleDeclaration");
937
- EmitDebugCheckDeclarationContext(variable);
938
- __ mov(r1, Operand(instance));
939
- __ str(r1, ContextOperand(cp, variable->index()));
940
- Visit(declaration->module());
941
- break;
942
- }
919
+ // Load instance object.
920
+ __ LoadContext(r1, scope_->ContextChainLength(scope_->GlobalScope()));
921
+ __ ldr(r1, ContextOperand(r1, variable->interface()->Index()));
922
+ __ ldr(r1, ContextOperand(r1, Context::EXTENSION_INDEX));
943
923
 
944
- case Variable::PARAMETER:
945
- case Variable::LOCAL:
946
- case Variable::LOOKUP:
947
- UNREACHABLE();
948
- }
924
+ // Assign it.
925
+ __ str(r1, ContextOperand(cp, variable->index()));
926
+ // We know that we have written a module, which is not a smi.
927
+ __ RecordWriteContextSlot(cp,
928
+ Context::SlotOffset(variable->index()),
929
+ r1,
930
+ r3,
931
+ kLRHasBeenSaved,
932
+ kDontSaveFPRegs,
933
+ EMIT_REMEMBERED_SET,
934
+ OMIT_SMI_CHECK);
935
+ PrepareForBailoutForId(declaration->proxy()->id(), NO_REGISTERS);
936
+
937
+ // Traverse into body.
938
+ Visit(declaration->module());
949
939
  }
950
940
 
951
941
 
@@ -988,6 +978,14 @@ void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
988
978
  }
989
979
 
990
980
 
981
+ void FullCodeGenerator::DeclareModules(Handle<FixedArray> descriptions) {
982
+ // Call the runtime to declare the modules.
983
+ __ Push(descriptions);
984
+ __ CallRuntime(Runtime::kDeclareModules, 1);
985
+ // Return value is ignored.
986
+ }
987
+
988
+
991
989
  void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
992
990
  Comment cmnt(masm_, "[ SwitchStatement");
993
991
  Breakable nested_statement(this, stmt);
@@ -1041,7 +1039,7 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
1041
1039
  CallIC(ic, RelocInfo::CODE_TARGET, clause->CompareId());
1042
1040
  patch_site.EmitPatchInfo();
1043
1041
 
1044
- __ cmp(r0, Operand(0));
1042
+ __ cmp(r0, Operand::Zero());
1045
1043
  __ b(ne, &next_test);
1046
1044
  __ Drop(1); // Switch value is no longer needed.
1047
1045
  __ b(clause->body_target());
@@ -1131,26 +1129,34 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
1131
1129
  // modification check. Otherwise, we got a fixed array, and we have
1132
1130
  // to do a slow check.
1133
1131
  Label fixed_array;
1134
- __ mov(r2, r0);
1135
- __ ldr(r1, FieldMemOperand(r2, HeapObject::kMapOffset));
1132
+ __ ldr(r2, FieldMemOperand(r0, HeapObject::kMapOffset));
1136
1133
  __ LoadRoot(ip, Heap::kMetaMapRootIndex);
1137
- __ cmp(r1, ip);
1134
+ __ cmp(r2, ip);
1138
1135
  __ b(ne, &fixed_array);
1139
1136
 
1140
1137
  // We got a map in register r0. Get the enumeration cache from it.
1138
+ Label no_descriptors;
1141
1139
  __ bind(&use_cache);
1142
- __ LoadInstanceDescriptors(r0, r1);
1143
- __ ldr(r1, FieldMemOperand(r1, DescriptorArray::kEnumerationIndexOffset));
1144
- __ ldr(r2, FieldMemOperand(r1, DescriptorArray::kEnumCacheBridgeCacheOffset));
1140
+
1141
+ __ EnumLength(r1, r0);
1142
+ __ cmp(r1, Operand(Smi::FromInt(0)));
1143
+ __ b(eq, &no_descriptors);
1144
+
1145
+ __ LoadInstanceDescriptors(r0, r2);
1146
+ __ ldr(r2, FieldMemOperand(r2, DescriptorArray::kEnumCacheOffset));
1147
+ __ ldr(r2, FieldMemOperand(r2, DescriptorArray::kEnumCacheBridgeCacheOffset));
1145
1148
 
1146
1149
  // Set up the four remaining stack slots.
1147
1150
  __ push(r0); // Map.
1148
- __ ldr(r1, FieldMemOperand(r2, FixedArray::kLengthOffset));
1149
1151
  __ mov(r0, Operand(Smi::FromInt(0)));
1150
1152
  // Push enumeration cache, enumeration cache length (as smi) and zero.
1151
1153
  __ Push(r2, r1, r0);
1152
1154
  __ jmp(&loop);
1153
1155
 
1156
+ __ bind(&no_descriptors);
1157
+ __ Drop(1);
1158
+ __ jmp(&exit);
1159
+
1154
1160
  // We got a fixed array in register r0. Iterate through that.
1155
1161
  Label non_proxy;
1156
1162
  __ bind(&fixed_array);
@@ -1159,7 +1165,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
1159
1165
  isolate()->factory()->NewJSGlobalPropertyCell(
1160
1166
  Handle<Object>(
1161
1167
  Smi::FromInt(TypeFeedbackCells::kForInFastCaseMarker)));
1162
- RecordTypeFeedbackCell(stmt->PrepareId(), cell);
1168
+ RecordTypeFeedbackCell(stmt->ForInFeedbackId(), cell);
1163
1169
  __ LoadHeapObject(r1, cell);
1164
1170
  __ mov(r2, Operand(Smi::FromInt(TypeFeedbackCells::kForInSlowCaseMarker)));
1165
1171
  __ str(r2, FieldMemOperand(r1, JSGlobalPropertyCell::kValueOffset));
@@ -1234,7 +1240,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
1234
1240
  __ add(r0, r0, Operand(Smi::FromInt(1)));
1235
1241
  __ push(r0);
1236
1242
 
1237
- EmitStackCheck(stmt, &loop);
1243
+ EmitBackEdgeBookkeeping(stmt, &loop);
1238
1244
  __ b(&loop);
1239
1245
 
1240
1246
  // Remove the pointers stored on the stack.
@@ -1315,9 +1321,9 @@ void FullCodeGenerator::EmitLoadGlobalCheckExtensions(Variable* var,
1315
1321
  __ Move(next, current);
1316
1322
  }
1317
1323
  __ bind(&loop);
1318
- // Terminate at global context.
1324
+ // Terminate at native context.
1319
1325
  __ ldr(temp, FieldMemOperand(next, HeapObject::kMapOffset));
1320
- __ LoadRoot(ip, Heap::kGlobalContextMapRootIndex);
1326
+ __ LoadRoot(ip, Heap::kNativeContextMapRootIndex);
1321
1327
  __ cmp(temp, ip);
1322
1328
  __ b(eq, &fast);
1323
1329
  // Check that extension is NULL.
@@ -1387,9 +1393,9 @@ void FullCodeGenerator::EmitDynamicLookupFastCase(Variable* var,
1387
1393
  } else if (var->mode() == DYNAMIC_LOCAL) {
1388
1394
  Variable* local = var->local_if_not_shadowed();
1389
1395
  __ ldr(r0, ContextSlotOperandCheckExtensions(local, slow));
1390
- if (local->mode() == CONST ||
1391
- local->mode() == CONST_HARMONY ||
1392
- local->mode() == LET) {
1396
+ if (local->mode() == LET ||
1397
+ local->mode() == CONST ||
1398
+ local->mode() == CONST_HARMONY) {
1393
1399
  __ CompareRoot(r0, Heap::kTheHoleValueRootIndex);
1394
1400
  if (local->mode() == CONST) {
1395
1401
  __ LoadRoot(r0, Heap::kUndefinedValueRootIndex, eq);
@@ -1603,9 +1609,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1603
1609
  // Mark all computed expressions that are bound to a key that
1604
1610
  // is shadowed by a later occurrence of the same key. For the
1605
1611
  // marked expressions, no store code is emitted.
1606
- expr->CalculateEmitStore();
1612
+ expr->CalculateEmitStore(zone());
1607
1613
 
1608
- AccessorTable accessor_table(isolate()->zone());
1614
+ AccessorTable accessor_table(zone());
1609
1615
  for (int i = 0; i < expr->properties()->length(); i++) {
1610
1616
  ObjectLiteral::Property* property = expr->properties()->at(i);
1611
1617
  if (property->IsCompileTimeValue()) continue;
@@ -1631,7 +1637,7 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1631
1637
  Handle<Code> ic = is_classic_mode()
1632
1638
  ? isolate()->builtins()->StoreIC_Initialize()
1633
1639
  : isolate()->builtins()->StoreIC_Initialize_Strict();
1634
- CallIC(ic, RelocInfo::CODE_TARGET, key->id());
1640
+ CallIC(ic, RelocInfo::CODE_TARGET, key->LiteralFeedbackId());
1635
1641
  PrepareForBailoutForId(key->id(), NO_REGISTERS);
1636
1642
  } else {
1637
1643
  VisitForEffect(value);
@@ -1713,7 +1719,9 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
1713
1719
  if (has_fast_elements && constant_elements_values->map() ==
1714
1720
  isolate()->heap()->fixed_cow_array_map()) {
1715
1721
  FastCloneShallowArrayStub stub(
1716
- FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS, length);
1722
+ FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS,
1723
+ DONT_TRACK_ALLOCATION_SITE,
1724
+ length);
1717
1725
  __ CallStub(&stub);
1718
1726
  __ IncrementCounter(
1719
1727
  isolate()->counters()->cow_arrays_created_stub(), 1, r1, r2);
@@ -1724,10 +1732,17 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
1724
1732
  } else {
1725
1733
  ASSERT(IsFastSmiOrObjectElementsKind(constant_elements_kind) ||
1726
1734
  FLAG_smi_only_arrays);
1727
- FastCloneShallowArrayStub::Mode mode = has_fast_elements
1728
- ? FastCloneShallowArrayStub::CLONE_ELEMENTS
1729
- : FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS;
1730
- FastCloneShallowArrayStub stub(mode, length);
1735
+ FastCloneShallowArrayStub::Mode mode =
1736
+ FastCloneShallowArrayStub::CLONE_ANY_ELEMENTS;
1737
+ AllocationSiteMode allocation_site_mode = FLAG_track_allocation_sites
1738
+ ? TRACK_ALLOCATION_SITE : DONT_TRACK_ALLOCATION_SITE;
1739
+
1740
+ if (has_fast_elements) {
1741
+ mode = FastCloneShallowArrayStub::CLONE_ELEMENTS;
1742
+ allocation_site_mode = DONT_TRACK_ALLOCATION_SITE;
1743
+ }
1744
+
1745
+ FastCloneShallowArrayStub stub(mode, allocation_site_mode, length);
1731
1746
  __ CallStub(&stub);
1732
1747
  }
1733
1748
 
@@ -1837,11 +1852,11 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1837
1852
  break;
1838
1853
  case NAMED_PROPERTY:
1839
1854
  EmitNamedPropertyLoad(property);
1840
- PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1855
+ PrepareForBailoutForId(property->LoadId(), TOS_REG);
1841
1856
  break;
1842
1857
  case KEYED_PROPERTY:
1843
1858
  EmitKeyedPropertyLoad(property);
1844
- PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1859
+ PrepareForBailoutForId(property->LoadId(), TOS_REG);
1845
1860
  break;
1846
1861
  }
1847
1862
  }
@@ -1898,7 +1913,7 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
1898
1913
  __ mov(r2, Operand(key->handle()));
1899
1914
  // Call load IC. It has arguments receiver and property name r0 and r2.
1900
1915
  Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1901
- CallIC(ic, RelocInfo::CODE_TARGET, prop->id());
1916
+ CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId());
1902
1917
  }
1903
1918
 
1904
1919
 
@@ -1906,7 +1921,7 @@ void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
1906
1921
  SetSourcePosition(prop->position());
1907
1922
  // Call keyed load IC. It has arguments key and receiver in r0 and r1.
1908
1923
  Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
1909
- CallIC(ic, RelocInfo::CODE_TARGET, prop->id());
1924
+ CallIC(ic, RelocInfo::CODE_TARGET, prop->PropertyFeedbackId());
1910
1925
  }
1911
1926
 
1912
1927
 
@@ -1933,7 +1948,8 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
1933
1948
 
1934
1949
  __ bind(&stub_call);
1935
1950
  BinaryOpStub stub(op, mode);
1936
- CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->id());
1951
+ CallIC(stub.GetCode(), RelocInfo::CODE_TARGET,
1952
+ expr->BinaryOperationFeedbackId());
1937
1953
  patch_site.EmitPatchInfo();
1938
1954
  __ jmp(&done);
1939
1955
 
@@ -1984,7 +2000,7 @@ void FullCodeGenerator::EmitInlineSmiBinaryOp(BinaryOperation* expr,
1984
2000
  __ mov(ip, Operand(scratch1, ASR, 31));
1985
2001
  __ cmp(ip, Operand(scratch2));
1986
2002
  __ b(ne, &stub_call);
1987
- __ cmp(scratch1, Operand(0));
2003
+ __ cmp(scratch1, Operand::Zero());
1988
2004
  __ mov(right, Operand(scratch1), LeaveCC, ne);
1989
2005
  __ b(ne, &done);
1990
2006
  __ add(scratch2, right, Operand(left), SetCC);
@@ -2016,14 +2032,15 @@ void FullCodeGenerator::EmitBinaryOp(BinaryOperation* expr,
2016
2032
  __ pop(r1);
2017
2033
  BinaryOpStub stub(op, mode);
2018
2034
  JumpPatchSite patch_site(masm_); // unbound, signals no inlined smi code.
2019
- CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->id());
2035
+ CallIC(stub.GetCode(), RelocInfo::CODE_TARGET,
2036
+ expr->BinaryOperationFeedbackId());
2020
2037
  patch_site.EmitPatchInfo();
2021
2038
  context()->Plug(r0);
2022
2039
  }
2023
2040
 
2024
2041
 
2025
2042
  void FullCodeGenerator::EmitAssignment(Expression* expr) {
2026
- // Invalid left-hand sides are rewritten to have a 'throw
2043
+ // Invalid left-hand sides are rewritten by the parser to have a 'throw
2027
2044
  // ReferenceError' on the left-hand side.
2028
2045
  if (!expr->IsValidLeftHandSide()) {
2029
2046
  VisitForEffect(expr);
@@ -2147,7 +2164,7 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
2147
2164
  // in harmony mode.
2148
2165
  if (var->IsStackAllocated() || var->IsContextSlot()) {
2149
2166
  MemOperand location = VarOperand(var, r1);
2150
- if (FLAG_debug_code && op == Token::INIT_LET) {
2167
+ if (generate_debug_code_ && op == Token::INIT_LET) {
2151
2168
  // Check for an uninitialized let binding.
2152
2169
  __ ldr(r2, location);
2153
2170
  __ CompareRoot(r2, Heap::kTheHoleValueRootIndex);
@@ -2180,43 +2197,16 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
2180
2197
  ASSERT(prop != NULL);
2181
2198
  ASSERT(prop->key()->AsLiteral() != NULL);
2182
2199
 
2183
- // If the assignment starts a block of assignments to the same object,
2184
- // change to slow case to avoid the quadratic behavior of repeatedly
2185
- // adding fast properties.
2186
- if (expr->starts_initialization_block()) {
2187
- __ push(result_register());
2188
- __ ldr(ip, MemOperand(sp, kPointerSize)); // Receiver is now under value.
2189
- __ push(ip);
2190
- __ CallRuntime(Runtime::kToSlowProperties, 1);
2191
- __ pop(result_register());
2192
- }
2193
-
2194
2200
  // Record source code position before IC call.
2195
2201
  SetSourcePosition(expr->position());
2196
2202
  __ mov(r2, Operand(prop->key()->AsLiteral()->handle()));
2197
- // Load receiver to r1. Leave a copy in the stack if needed for turning the
2198
- // receiver into fast case.
2199
- if (expr->ends_initialization_block()) {
2200
- __ ldr(r1, MemOperand(sp));
2201
- } else {
2202
- __ pop(r1);
2203
- }
2203
+ __ pop(r1);
2204
2204
 
2205
2205
  Handle<Code> ic = is_classic_mode()
2206
2206
  ? isolate()->builtins()->StoreIC_Initialize()
2207
2207
  : isolate()->builtins()->StoreIC_Initialize_Strict();
2208
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
2209
-
2210
- // If the assignment ends an initialization block, revert to fast case.
2211
- if (expr->ends_initialization_block()) {
2212
- __ push(r0); // Result of assignment, saved even if not needed.
2213
- // Receiver is under the result value.
2214
- __ ldr(ip, MemOperand(sp, kPointerSize));
2215
- __ push(ip);
2216
- __ CallRuntime(Runtime::kToFastProperties, 1);
2217
- __ pop(r0);
2218
- __ Drop(1);
2219
- }
2208
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId());
2209
+
2220
2210
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
2221
2211
  context()->Plug(r0);
2222
2212
  }
@@ -2225,44 +2215,16 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
2225
2215
  void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2226
2216
  // Assignment to a property, using a keyed store IC.
2227
2217
 
2228
- // If the assignment starts a block of assignments to the same object,
2229
- // change to slow case to avoid the quadratic behavior of repeatedly
2230
- // adding fast properties.
2231
- if (expr->starts_initialization_block()) {
2232
- __ push(result_register());
2233
- // Receiver is now under the key and value.
2234
- __ ldr(ip, MemOperand(sp, 2 * kPointerSize));
2235
- __ push(ip);
2236
- __ CallRuntime(Runtime::kToSlowProperties, 1);
2237
- __ pop(result_register());
2238
- }
2239
-
2240
2218
  // Record source code position before IC call.
2241
2219
  SetSourcePosition(expr->position());
2242
2220
  __ pop(r1); // Key.
2243
- // Load receiver to r2. Leave a copy in the stack if needed for turning the
2244
- // receiver into fast case.
2245
- if (expr->ends_initialization_block()) {
2246
- __ ldr(r2, MemOperand(sp));
2247
- } else {
2248
- __ pop(r2);
2249
- }
2221
+ __ pop(r2);
2250
2222
 
2251
2223
  Handle<Code> ic = is_classic_mode()
2252
2224
  ? isolate()->builtins()->KeyedStoreIC_Initialize()
2253
2225
  : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
2254
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
2255
-
2256
- // If the assignment ends an initialization block, revert to fast case.
2257
- if (expr->ends_initialization_block()) {
2258
- __ push(r0); // Result of assignment, saved even if not needed.
2259
- // Receiver is under the result value.
2260
- __ ldr(ip, MemOperand(sp, kPointerSize));
2261
- __ push(ip);
2262
- __ CallRuntime(Runtime::kToFastProperties, 1);
2263
- __ pop(r0);
2264
- __ Drop(1);
2265
- }
2226
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->AssignmentFeedbackId());
2227
+
2266
2228
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
2267
2229
  context()->Plug(r0);
2268
2230
  }
@@ -2275,6 +2237,7 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
2275
2237
  if (key->IsPropertyName()) {
2276
2238
  VisitForAccumulatorValue(expr->obj());
2277
2239
  EmitNamedPropertyLoad(expr);
2240
+ PrepareForBailoutForId(expr->LoadId(), TOS_REG);
2278
2241
  context()->Plug(r0);
2279
2242
  } else {
2280
2243
  VisitForStackValue(expr->obj());
@@ -2288,9 +2251,11 @@ void FullCodeGenerator::VisitProperty(Property* expr) {
2288
2251
 
2289
2252
  void FullCodeGenerator::CallIC(Handle<Code> code,
2290
2253
  RelocInfo::Mode rmode,
2291
- unsigned ast_id) {
2254
+ TypeFeedbackId ast_id) {
2292
2255
  ic_total_count_++;
2293
- __ Call(code, rmode, ast_id);
2256
+ // All calls must have a predictable size in full-codegen code to ensure that
2257
+ // the debugger can patch them correctly.
2258
+ __ Call(code, rmode, ast_id, al, NEVER_INLINE_TARGET_ADDRESS);
2294
2259
  }
2295
2260
 
2296
2261
  void FullCodeGenerator::EmitCallWithIC(Call* expr,
@@ -2310,7 +2275,7 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr,
2310
2275
  // Call the IC initialization code.
2311
2276
  Handle<Code> ic =
2312
2277
  isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
2313
- CallIC(ic, mode, expr->id());
2278
+ CallIC(ic, mode, expr->CallFeedbackId());
2314
2279
  RecordJSReturnSite(expr);
2315
2280
  // Restore context register.
2316
2281
  __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
@@ -2343,7 +2308,7 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr,
2343
2308
  Handle<Code> ic =
2344
2309
  isolate()->stub_cache()->ComputeKeyedCallInitialize(arg_count);
2345
2310
  __ ldr(r2, MemOperand(sp, (arg_count + 1) * kPointerSize)); // Key.
2346
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
2311
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->CallFeedbackId());
2347
2312
  RecordJSReturnSite(expr);
2348
2313
  // Restore context register.
2349
2314
  __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
@@ -2363,20 +2328,18 @@ void FullCodeGenerator::EmitCallWithStub(Call* expr, CallFunctionFlags flags) {
2363
2328
  // Record source position for debugger.
2364
2329
  SetSourcePosition(expr->position());
2365
2330
 
2366
- // Record call targets in unoptimized code, but not in the snapshot.
2367
- if (!Serializer::enabled()) {
2368
- flags = static_cast<CallFunctionFlags>(flags | RECORD_CALL_TARGET);
2369
- Handle<Object> uninitialized =
2370
- TypeFeedbackCells::UninitializedSentinel(isolate());
2371
- Handle<JSGlobalPropertyCell> cell =
2372
- isolate()->factory()->NewJSGlobalPropertyCell(uninitialized);
2373
- RecordTypeFeedbackCell(expr->id(), cell);
2374
- __ mov(r2, Operand(cell));
2375
- }
2331
+ // Record call targets in unoptimized code.
2332
+ flags = static_cast<CallFunctionFlags>(flags | RECORD_CALL_TARGET);
2333
+ Handle<Object> uninitialized =
2334
+ TypeFeedbackCells::UninitializedSentinel(isolate());
2335
+ Handle<JSGlobalPropertyCell> cell =
2336
+ isolate()->factory()->NewJSGlobalPropertyCell(uninitialized);
2337
+ RecordTypeFeedbackCell(expr->CallFeedbackId(), cell);
2338
+ __ mov(r2, Operand(cell));
2376
2339
 
2377
2340
  CallFunctionStub stub(arg_count, flags);
2378
2341
  __ ldr(r1, MemOperand(sp, (arg_count + 1) * kPointerSize));
2379
- __ CallStub(&stub);
2342
+ __ CallStub(&stub, expr->CallFeedbackId());
2380
2343
  RecordJSReturnSite(expr);
2381
2344
  // Restore context register.
2382
2345
  __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
@@ -2422,7 +2385,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
2422
2385
  VariableProxy* proxy = callee->AsVariableProxy();
2423
2386
  Property* property = callee->AsProperty();
2424
2387
 
2425
- if (proxy != NULL && proxy->var()->is_possibly_eval()) {
2388
+ if (proxy != NULL && proxy->var()->is_possibly_eval(isolate())) {
2426
2389
  // In a call to eval, we first call %ResolvePossiblyDirectEval to
2427
2390
  // resolve the function we need to call and the receiver of the
2428
2391
  // call. Then we call the resolved function using the given
@@ -2562,21 +2525,15 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) {
2562
2525
  __ mov(r0, Operand(arg_count));
2563
2526
  __ ldr(r1, MemOperand(sp, arg_count * kPointerSize));
2564
2527
 
2565
- // Record call targets in unoptimized code, but not in the snapshot.
2566
- CallFunctionFlags flags;
2567
- if (!Serializer::enabled()) {
2568
- flags = RECORD_CALL_TARGET;
2569
- Handle<Object> uninitialized =
2570
- TypeFeedbackCells::UninitializedSentinel(isolate());
2571
- Handle<JSGlobalPropertyCell> cell =
2572
- isolate()->factory()->NewJSGlobalPropertyCell(uninitialized);
2573
- RecordTypeFeedbackCell(expr->id(), cell);
2574
- __ mov(r2, Operand(cell));
2575
- } else {
2576
- flags = NO_CALL_FUNCTION_FLAGS;
2577
- }
2528
+ // Record call targets in unoptimized code.
2529
+ Handle<Object> uninitialized =
2530
+ TypeFeedbackCells::UninitializedSentinel(isolate());
2531
+ Handle<JSGlobalPropertyCell> cell =
2532
+ isolate()->factory()->NewJSGlobalPropertyCell(uninitialized);
2533
+ RecordTypeFeedbackCell(expr->CallNewFeedbackId(), cell);
2534
+ __ mov(r2, Operand(cell));
2578
2535
 
2579
- CallConstructStub stub(flags);
2536
+ CallConstructStub stub(RECORD_CALL_TARGET);
2580
2537
  __ Call(stub.GetCode(), RelocInfo::CONSTRUCT_CALL);
2581
2538
  PrepareForBailoutForId(expr->ReturnId(), TOS_REG);
2582
2539
  context()->Plug(r0);
@@ -2718,7 +2675,7 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
2718
2675
  context()->PrepareTest(&materialize_true, &materialize_false,
2719
2676
  &if_true, &if_false, &fall_through);
2720
2677
 
2721
- if (FLAG_debug_code) __ AbortIfSmi(r0);
2678
+ __ AssertNotSmi(r0);
2722
2679
 
2723
2680
  __ ldr(r1, FieldMemOperand(r0, HeapObject::kMapOffset));
2724
2681
  __ ldrb(ip, FieldMemOperand(r1, Map::kBitField2Offset));
@@ -2733,27 +2690,31 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
2733
2690
  __ b(eq, if_false);
2734
2691
 
2735
2692
  // Look for valueOf symbol in the descriptor array, and indicate false if
2736
- // found. The type is not checked, so if it is a transition it is a false
2737
- // negative.
2693
+ // found. Since we omit an enumeration index check, if it is added via a
2694
+ // transition that shares its descriptor array, this is a false positive.
2695
+ Label entry, loop, done;
2696
+
2697
+ // Skip loop if no descriptors are valid.
2698
+ __ NumberOfOwnDescriptors(r3, r1);
2699
+ __ cmp(r3, Operand::Zero());
2700
+ __ b(eq, &done);
2701
+
2738
2702
  __ LoadInstanceDescriptors(r1, r4);
2739
- __ ldr(r3, FieldMemOperand(r4, FixedArray::kLengthOffset));
2740
- // r4: descriptor array
2741
- // r3: length of descriptor array
2742
- // Calculate the end of the descriptor array.
2703
+ // r4: descriptor array.
2704
+ // r3: valid entries in the descriptor array.
2743
2705
  STATIC_ASSERT(kSmiTag == 0);
2744
2706
  STATIC_ASSERT(kSmiTagSize == 1);
2745
2707
  STATIC_ASSERT(kPointerSize == 4);
2746
- __ add(r2, r4, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
2708
+ __ mov(ip, Operand(DescriptorArray::kDescriptorSize));
2709
+ __ mul(r3, r3, ip);
2710
+ // Calculate location of the first key name.
2711
+ __ add(r4, r4, Operand(DescriptorArray::kFirstOffset - kHeapObjectTag));
2712
+ // Calculate the end of the descriptor array.
2713
+ __ mov(r2, r4);
2747
2714
  __ add(r2, r2, Operand(r3, LSL, kPointerSizeLog2 - kSmiTagSize));
2748
2715
 
2749
- // Calculate location of the first key name.
2750
- __ add(r4,
2751
- r4,
2752
- Operand(FixedArray::kHeaderSize - kHeapObjectTag +
2753
- DescriptorArray::kFirstIndex * kPointerSize));
2754
2716
  // Loop through all the keys in the descriptor array. If one of these is the
2755
2717
  // symbol valueOf the result is false.
2756
- Label entry, loop;
2757
2718
  // The use of ip to store the valueOf symbol asumes that it is not otherwise
2758
2719
  // used in the loop below.
2759
2720
  __ mov(ip, Operand(FACTORY->value_of_symbol()));
@@ -2762,18 +2723,19 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
2762
2723
  __ ldr(r3, MemOperand(r4, 0));
2763
2724
  __ cmp(r3, ip);
2764
2725
  __ b(eq, if_false);
2765
- __ add(r4, r4, Operand(kPointerSize));
2726
+ __ add(r4, r4, Operand(DescriptorArray::kDescriptorSize * kPointerSize));
2766
2727
  __ bind(&entry);
2767
2728
  __ cmp(r4, Operand(r2));
2768
2729
  __ b(ne, &loop);
2769
2730
 
2770
- // If a valueOf property is not found on the object check that it's
2731
+ __ bind(&done);
2732
+ // If a valueOf property is not found on the object check that its
2771
2733
  // prototype is the un-modified String prototype. If not result is false.
2772
2734
  __ ldr(r2, FieldMemOperand(r1, Map::kPrototypeOffset));
2773
2735
  __ JumpIfSmi(r2, if_false);
2774
2736
  __ ldr(r2, FieldMemOperand(r2, HeapObject::kMapOffset));
2775
- __ ldr(r3, ContextOperand(cp, Context::GLOBAL_INDEX));
2776
- __ ldr(r3, FieldMemOperand(r3, GlobalObject::kGlobalContextOffset));
2737
+ __ ldr(r3, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX));
2738
+ __ ldr(r3, FieldMemOperand(r3, GlobalObject::kNativeContextOffset));
2777
2739
  __ ldr(r3, ContextOperand(r3, Context::STRING_FUNCTION_PROTOTYPE_MAP_INDEX));
2778
2740
  __ cmp(r2, r3);
2779
2741
  __ b(ne, if_false);
@@ -3050,13 +3012,14 @@ void FullCodeGenerator::EmitRandomHeapNumber(CallRuntime* expr) {
3050
3012
  // Convert 32 random bits in r0 to 0.(32 random bits) in a double
3051
3013
  // by computing:
3052
3014
  // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)).
3053
- if (CpuFeatures::IsSupported(VFP3)) {
3015
+ if (CpuFeatures::IsSupported(VFP2)) {
3054
3016
  __ PrepareCallCFunction(1, r0);
3055
- __ ldr(r0, ContextOperand(context_register(), Context::GLOBAL_INDEX));
3056
- __ ldr(r0, FieldMemOperand(r0, GlobalObject::kGlobalContextOffset));
3017
+ __ ldr(r0,
3018
+ ContextOperand(context_register(), Context::GLOBAL_OBJECT_INDEX));
3019
+ __ ldr(r0, FieldMemOperand(r0, GlobalObject::kNativeContextOffset));
3057
3020
  __ CallCFunction(ExternalReference::random_uint32_function(isolate()), 1);
3058
3021
 
3059
- CpuFeatures::Scope scope(VFP3);
3022
+ CpuFeatures::Scope scope(VFP2);
3060
3023
  // 0x41300000 is the top half of 1.0 x 2^20 as a double.
3061
3024
  // Create this constant using mov/orr to avoid PC relative load.
3062
3025
  __ mov(r1, Operand(0x41000000));
@@ -3064,7 +3027,7 @@ void FullCodeGenerator::EmitRandomHeapNumber(CallRuntime* expr) {
3064
3027
  // Move 0x41300000xxxxxxxx (x = random bits) to VFP.
3065
3028
  __ vmov(d7, r0, r1);
3066
3029
  // Move 0x4130000000000000 to VFP.
3067
- __ mov(r0, Operand(0, RelocInfo::NONE));
3030
+ __ mov(r0, Operand::Zero());
3068
3031
  __ vmov(d8, r0, r1);
3069
3032
  // Subtract and store the result in the heap number.
3070
3033
  __ vsub(d7, d7, d8);
@@ -3073,9 +3036,10 @@ void FullCodeGenerator::EmitRandomHeapNumber(CallRuntime* expr) {
3073
3036
  __ mov(r0, r4);
3074
3037
  } else {
3075
3038
  __ PrepareCallCFunction(2, r0);
3076
- __ ldr(r1, ContextOperand(context_register(), Context::GLOBAL_INDEX));
3039
+ __ ldr(r1,
3040
+ ContextOperand(context_register(), Context::GLOBAL_OBJECT_INDEX));
3077
3041
  __ mov(r0, Operand(r4));
3078
- __ ldr(r1, FieldMemOperand(r1, GlobalObject::kGlobalContextOffset));
3042
+ __ ldr(r1, FieldMemOperand(r1, GlobalObject::kNativeContextOffset));
3079
3043
  __ CallCFunction(
3080
3044
  ExternalReference::fill_heap_number_with_random_function(isolate()), 2);
3081
3045
  }
@@ -3137,20 +3101,19 @@ void FullCodeGenerator::EmitDateField(CallRuntime* expr) {
3137
3101
 
3138
3102
  VisitForAccumulatorValue(args->at(0)); // Load the object.
3139
3103
 
3140
- Label runtime, done;
3104
+ Label runtime, done, not_date_object;
3141
3105
  Register object = r0;
3142
3106
  Register result = r0;
3143
3107
  Register scratch0 = r9;
3144
3108
  Register scratch1 = r1;
3145
3109
 
3146
- #ifdef DEBUG
3147
- __ AbortIfSmi(object);
3110
+ __ JumpIfSmi(object, &not_date_object);
3148
3111
  __ CompareObjectType(object, scratch1, scratch1, JS_DATE_TYPE);
3149
- __ Assert(eq, "Trying to get date field from non-date.");
3150
- #endif
3112
+ __ b(ne, &not_date_object);
3151
3113
 
3152
3114
  if (index->value() == 0) {
3153
3115
  __ ldr(result, FieldMemOperand(object, JSDate::kValueOffset));
3116
+ __ jmp(&done);
3154
3117
  } else {
3155
3118
  if (index->value() < JSDate::kFirstUncachedField) {
3156
3119
  ExternalReference stamp = ExternalReference::date_cache_stamp(isolate());
@@ -3167,19 +3130,56 @@ void FullCodeGenerator::EmitDateField(CallRuntime* expr) {
3167
3130
  __ PrepareCallCFunction(2, scratch1);
3168
3131
  __ mov(r1, Operand(index));
3169
3132
  __ CallCFunction(ExternalReference::get_date_field_function(isolate()), 2);
3170
- __ bind(&done);
3133
+ __ jmp(&done);
3171
3134
  }
3135
+
3136
+ __ bind(&not_date_object);
3137
+ __ CallRuntime(Runtime::kThrowNotDateError, 0);
3138
+ __ bind(&done);
3139
+ context()->Plug(r0);
3140
+ }
3141
+
3142
+
3143
+ void FullCodeGenerator::EmitOneByteSeqStringSetChar(CallRuntime* expr) {
3144
+ ZoneList<Expression*>* args = expr->arguments();
3145
+ ASSERT_EQ(3, args->length());
3146
+
3147
+ VisitForStackValue(args->at(1)); // index
3148
+ VisitForStackValue(args->at(2)); // value
3149
+ __ pop(r2);
3150
+ __ pop(r1);
3151
+ VisitForAccumulatorValue(args->at(0)); // string
3152
+
3153
+ static const String::Encoding encoding = String::ONE_BYTE_ENCODING;
3154
+ SeqStringSetCharGenerator::Generate(masm_, encoding, r0, r1, r2);
3155
+ context()->Plug(r0);
3156
+ }
3157
+
3158
+
3159
+ void FullCodeGenerator::EmitTwoByteSeqStringSetChar(CallRuntime* expr) {
3160
+ ZoneList<Expression*>* args = expr->arguments();
3161
+ ASSERT_EQ(3, args->length());
3162
+
3163
+ VisitForStackValue(args->at(1)); // index
3164
+ VisitForStackValue(args->at(2)); // value
3165
+ __ pop(r2);
3166
+ __ pop(r1);
3167
+ VisitForAccumulatorValue(args->at(0)); // string
3168
+
3169
+ static const String::Encoding encoding = String::TWO_BYTE_ENCODING;
3170
+ SeqStringSetCharGenerator::Generate(masm_, encoding, r0, r1, r2);
3172
3171
  context()->Plug(r0);
3173
3172
  }
3174
3173
 
3175
3174
 
3175
+
3176
3176
  void FullCodeGenerator::EmitMathPow(CallRuntime* expr) {
3177
3177
  // Load the arguments on the stack and call the runtime function.
3178
3178
  ZoneList<Expression*>* args = expr->arguments();
3179
3179
  ASSERT(args->length() == 2);
3180
3180
  VisitForStackValue(args->at(0));
3181
3181
  VisitForStackValue(args->at(1));
3182
- if (CpuFeatures::IsSupported(VFP3)) {
3182
+ if (CpuFeatures::IsSupported(VFP2)) {
3183
3183
  MathPowStub stub(MathPowStub::ON_STACK);
3184
3184
  __ CallStub(&stub);
3185
3185
  } else {
@@ -3431,10 +3431,11 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) {
3431
3431
  }
3432
3432
  VisitForAccumulatorValue(args->last()); // Function.
3433
3433
 
3434
- // Check for proxy.
3435
- Label proxy, done;
3436
- __ CompareObjectType(r0, r1, r1, JS_FUNCTION_PROXY_TYPE);
3437
- __ b(eq, &proxy);
3434
+ Label runtime, done;
3435
+ // Check for non-function argument (including proxy).
3436
+ __ JumpIfSmi(r0, &runtime);
3437
+ __ CompareObjectType(r0, r1, r1, JS_FUNCTION_TYPE);
3438
+ __ b(ne, &runtime);
3438
3439
 
3439
3440
  // InvokeFunction requires the function in r1. Move it in there.
3440
3441
  __ mov(r1, result_register());
@@ -3444,7 +3445,7 @@ void FullCodeGenerator::EmitCallFunction(CallRuntime* expr) {
3444
3445
  __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
3445
3446
  __ jmp(&done);
3446
3447
 
3447
- __ bind(&proxy);
3448
+ __ bind(&runtime);
3448
3449
  __ push(r0);
3449
3450
  __ CallRuntime(Runtime::kCall, args->length());
3450
3451
  __ bind(&done);
@@ -3472,7 +3473,7 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
3472
3473
  int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value();
3473
3474
 
3474
3475
  Handle<FixedArray> jsfunction_result_caches(
3475
- isolate()->global_context()->jsfunction_result_caches());
3476
+ isolate()->native_context()->jsfunction_result_caches());
3476
3477
  if (jsfunction_result_caches->length() <= cache_id) {
3477
3478
  __ Abort("Attempt to use undefined cache.");
3478
3479
  __ LoadRoot(r0, Heap::kUndefinedValueRootIndex);
@@ -3484,8 +3485,8 @@ void FullCodeGenerator::EmitGetFromCache(CallRuntime* expr) {
3484
3485
 
3485
3486
  Register key = r0;
3486
3487
  Register cache = r1;
3487
- __ ldr(cache, ContextOperand(cp, Context::GLOBAL_INDEX));
3488
- __ ldr(cache, FieldMemOperand(cache, GlobalObject::kGlobalContextOffset));
3488
+ __ ldr(cache, ContextOperand(cp, Context::GLOBAL_OBJECT_INDEX));
3489
+ __ ldr(cache, FieldMemOperand(cache, GlobalObject::kNativeContextOffset));
3489
3490
  __ ldr(cache, ContextOperand(cache, Context::JSFUNCTION_RESULT_CACHES_INDEX));
3490
3491
  __ ldr(cache,
3491
3492
  FieldMemOperand(cache, FixedArray::OffsetOfElementAt(cache_id)));
@@ -3582,9 +3583,7 @@ void FullCodeGenerator::EmitGetCachedArrayIndex(CallRuntime* expr) {
3582
3583
  ASSERT(args->length() == 1);
3583
3584
  VisitForAccumulatorValue(args->at(0));
3584
3585
 
3585
- if (FLAG_debug_code) {
3586
- __ AbortIfNotString(r0);
3587
- }
3586
+ __ AssertString(r0);
3588
3587
 
3589
3588
  __ ldr(r0, FieldMemOperand(r0, String::kHashFieldOffset));
3590
3589
  __ IndexFromHash(r0, r0);
@@ -3644,7 +3643,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3644
3643
 
3645
3644
  // Check that all array elements are sequential ASCII strings, and
3646
3645
  // accumulate the sum of their lengths, as a smi-encoded value.
3647
- __ mov(string_length, Operand(0));
3646
+ __ mov(string_length, Operand::Zero());
3648
3647
  __ add(element,
3649
3648
  elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
3650
3649
  __ add(elements_end, element, Operand(array_length, LSL, kPointerSizeLog2));
@@ -3656,8 +3655,8 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3656
3655
  // string_length: Accumulated sum of string lengths (smi).
3657
3656
  // element: Current array element.
3658
3657
  // elements_end: Array end.
3659
- if (FLAG_debug_code) {
3660
- __ cmp(array_length, Operand(0));
3658
+ if (generate_debug_code_) {
3659
+ __ cmp(array_length, Operand::Zero());
3661
3660
  __ Assert(gt, "No empty arrays here in EmitFastAsciiArrayJoin");
3662
3661
  }
3663
3662
  __ bind(&loop);
@@ -3666,7 +3665,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3666
3665
  __ ldr(scratch1, FieldMemOperand(string, HeapObject::kMapOffset));
3667
3666
  __ ldrb(scratch1, FieldMemOperand(scratch1, Map::kInstanceTypeOffset));
3668
3667
  __ JumpIfInstanceTypeIsNotSequentialAscii(scratch1, scratch2, &bailout);
3669
- __ ldr(scratch1, FieldMemOperand(string, SeqAsciiString::kLengthOffset));
3668
+ __ ldr(scratch1, FieldMemOperand(string, SeqOneByteString::kLengthOffset));
3670
3669
  __ add(string_length, string_length, Operand(scratch1), SetCC);
3671
3670
  __ b(vs, &bailout);
3672
3671
  __ cmp(element, elements_end);
@@ -3695,12 +3694,12 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3695
3694
  // Add (separator length times array_length) - separator length to the
3696
3695
  // string_length to get the length of the result string. array_length is not
3697
3696
  // smi but the other values are, so the result is a smi
3698
- __ ldr(scratch1, FieldMemOperand(separator, SeqAsciiString::kLengthOffset));
3697
+ __ ldr(scratch1, FieldMemOperand(separator, SeqOneByteString::kLengthOffset));
3699
3698
  __ sub(string_length, string_length, Operand(scratch1));
3700
3699
  __ smull(scratch2, ip, array_length, scratch1);
3701
3700
  // Check for smi overflow. No overflow if higher 33 bits of 64-bit result are
3702
3701
  // zero.
3703
- __ cmp(ip, Operand(0));
3702
+ __ cmp(ip, Operand::Zero());
3704
3703
  __ b(ne, &bailout);
3705
3704
  __ tst(scratch2, Operand(0x80000000));
3706
3705
  __ b(ne, &bailout);
@@ -3733,10 +3732,10 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3733
3732
  array_length = no_reg;
3734
3733
  __ add(result_pos,
3735
3734
  result,
3736
- Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
3735
+ Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag));
3737
3736
 
3738
3737
  // Check the length of the separator.
3739
- __ ldr(scratch1, FieldMemOperand(separator, SeqAsciiString::kLengthOffset));
3738
+ __ ldr(scratch1, FieldMemOperand(separator, SeqOneByteString::kLengthOffset));
3740
3739
  __ cmp(scratch1, Operand(Smi::FromInt(1)));
3741
3740
  __ b(eq, &one_char_separator);
3742
3741
  __ b(gt, &long_separator);
@@ -3752,7 +3751,9 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3752
3751
  __ ldr(string, MemOperand(element, kPointerSize, PostIndex));
3753
3752
  __ ldr(string_length, FieldMemOperand(string, String::kLengthOffset));
3754
3753
  __ SmiUntag(string_length);
3755
- __ add(string, string, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
3754
+ __ add(string,
3755
+ string,
3756
+ Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag));
3756
3757
  __ CopyBytes(string, result_pos, string_length, scratch1);
3757
3758
  __ cmp(element, elements_end);
3758
3759
  __ b(lt, &empty_separator_loop); // End while (element < elements_end).
@@ -3762,7 +3763,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3762
3763
  // One-character separator case
3763
3764
  __ bind(&one_char_separator);
3764
3765
  // Replace separator with its ASCII character value.
3765
- __ ldrb(separator, FieldMemOperand(separator, SeqAsciiString::kHeaderSize));
3766
+ __ ldrb(separator, FieldMemOperand(separator, SeqOneByteString::kHeaderSize));
3766
3767
  // Jump into the loop after the code that copies the separator, so the first
3767
3768
  // element is not preceded by a separator
3768
3769
  __ jmp(&one_char_separator_loop_entry);
@@ -3782,7 +3783,9 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3782
3783
  __ ldr(string, MemOperand(element, kPointerSize, PostIndex));
3783
3784
  __ ldr(string_length, FieldMemOperand(string, String::kLengthOffset));
3784
3785
  __ SmiUntag(string_length);
3785
- __ add(string, string, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
3786
+ __ add(string,
3787
+ string,
3788
+ Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag));
3786
3789
  __ CopyBytes(string, result_pos, string_length, scratch1);
3787
3790
  __ cmp(element, elements_end);
3788
3791
  __ b(lt, &one_char_separator_loop); // End while (element < elements_end).
@@ -3803,14 +3806,16 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(CallRuntime* expr) {
3803
3806
  __ SmiUntag(string_length);
3804
3807
  __ add(string,
3805
3808
  separator,
3806
- Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
3809
+ Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag));
3807
3810
  __ CopyBytes(string, result_pos, string_length, scratch1);
3808
3811
 
3809
3812
  __ bind(&long_separator);
3810
3813
  __ ldr(string, MemOperand(element, kPointerSize, PostIndex));
3811
3814
  __ ldr(string_length, FieldMemOperand(string, String::kLengthOffset));
3812
3815
  __ SmiUntag(string_length);
3813
- __ add(string, string, Operand(SeqAsciiString::kHeaderSize - kHeapObjectTag));
3816
+ __ add(string,
3817
+ string,
3818
+ Operand(SeqOneByteString::kHeaderSize - kHeapObjectTag));
3814
3819
  __ CopyBytes(string, result_pos, string_length, scratch1);
3815
3820
  __ cmp(element, elements_end);
3816
3821
  __ b(lt, &long_separator_loop); // End while (element < elements_end).
@@ -3854,7 +3859,7 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
3854
3859
  RelocInfo::Mode mode = RelocInfo::CODE_TARGET;
3855
3860
  Handle<Code> ic =
3856
3861
  isolate()->stub_cache()->ComputeCallInitialize(arg_count, mode);
3857
- CallIC(ic, mode, expr->id());
3862
+ CallIC(ic, mode, expr->CallRuntimeFeedbackId());
3858
3863
  // Restore context register.
3859
3864
  __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
3860
3865
  } else {
@@ -4009,7 +4014,8 @@ void FullCodeGenerator::EmitUnaryOperation(UnaryOperation* expr,
4009
4014
  // accumulator register r0.
4010
4015
  VisitForAccumulatorValue(expr->expression());
4011
4016
  SetSourcePosition(expr->position());
4012
- CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->id());
4017
+ CallIC(stub.GetCode(), RelocInfo::CODE_TARGET,
4018
+ expr->UnaryOperationFeedbackId());
4013
4019
  context()->Plug(r0);
4014
4020
  }
4015
4021
 
@@ -4067,7 +4073,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4067
4073
  if (assign_type == VARIABLE) {
4068
4074
  PrepareForBailout(expr->expression(), TOS_REG);
4069
4075
  } else {
4070
- PrepareForBailoutForId(expr->CountId(), TOS_REG);
4076
+ PrepareForBailoutForId(prop->LoadId(), TOS_REG);
4071
4077
  }
4072
4078
 
4073
4079
  // Call ToNumber only if operand is not a smi.
@@ -4114,13 +4120,14 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4114
4120
  // Call stub. Undo operation first.
4115
4121
  __ sub(r0, r0, Operand(Smi::FromInt(count_value)));
4116
4122
  }
4117
- __ mov(r1, Operand(Smi::FromInt(count_value)));
4123
+ __ mov(r1, r0);
4124
+ __ mov(r0, Operand(Smi::FromInt(count_value)));
4118
4125
 
4119
4126
  // Record position before stub call.
4120
4127
  SetSourcePosition(expr->position());
4121
4128
 
4122
4129
  BinaryOpStub stub(Token::ADD, NO_OVERWRITE);
4123
- CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->CountId());
4130
+ CallIC(stub.GetCode(), RelocInfo::CODE_TARGET, expr->CountBinOpFeedbackId());
4124
4131
  patch_site.EmitPatchInfo();
4125
4132
  __ bind(&done);
4126
4133
 
@@ -4152,7 +4159,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4152
4159
  Handle<Code> ic = is_classic_mode()
4153
4160
  ? isolate()->builtins()->StoreIC_Initialize()
4154
4161
  : isolate()->builtins()->StoreIC_Initialize_Strict();
4155
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
4162
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId());
4156
4163
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
4157
4164
  if (expr->is_postfix()) {
4158
4165
  if (!context()->IsEffect()) {
@@ -4169,7 +4176,7 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4169
4176
  Handle<Code> ic = is_classic_mode()
4170
4177
  ? isolate()->builtins()->KeyedStoreIC_Initialize()
4171
4178
  : isolate()->builtins()->KeyedStoreIC_Initialize_Strict();
4172
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
4179
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->CountStoreFeedbackId());
4173
4180
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
4174
4181
  if (expr->is_postfix()) {
4175
4182
  if (!context()->IsEffect()) {
@@ -4339,29 +4346,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
4339
4346
 
4340
4347
  default: {
4341
4348
  VisitForAccumulatorValue(expr->right());
4342
- Condition cond = eq;
4343
- switch (op) {
4344
- case Token::EQ_STRICT:
4345
- case Token::EQ:
4346
- cond = eq;
4347
- break;
4348
- case Token::LT:
4349
- cond = lt;
4350
- break;
4351
- case Token::GT:
4352
- cond = gt;
4353
- break;
4354
- case Token::LTE:
4355
- cond = le;
4356
- break;
4357
- case Token::GTE:
4358
- cond = ge;
4359
- break;
4360
- case Token::IN:
4361
- case Token::INSTANCEOF:
4362
- default:
4363
- UNREACHABLE();
4364
- }
4349
+ Condition cond = CompareIC::ComputeCondition(op);
4365
4350
  __ pop(r1);
4366
4351
 
4367
4352
  bool inline_smi_code = ShouldInlineSmiCase(op);
@@ -4378,10 +4363,10 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
4378
4363
  // Record position and call the compare IC.
4379
4364
  SetSourcePosition(expr->position());
4380
4365
  Handle<Code> ic = CompareIC::GetUninitialized(op);
4381
- CallIC(ic, RelocInfo::CODE_TARGET, expr->id());
4366
+ CallIC(ic, RelocInfo::CODE_TARGET, expr->CompareOperationFeedbackId());
4382
4367
  patch_site.EmitPatchInfo();
4383
4368
  PrepareForBailoutBeforeSplit(expr, true, if_true, if_false);
4384
- __ cmp(r0, Operand(0));
4369
+ __ cmp(r0, Operand::Zero());
4385
4370
  Split(cond, if_true, if_false, fall_through);
4386
4371
  }
4387
4372
  }
@@ -4462,7 +4447,7 @@ void FullCodeGenerator::PushFunctionArgumentForContextAllocation() {
4462
4447
  Scope* declaration_scope = scope()->DeclarationScope();
4463
4448
  if (declaration_scope->is_global_scope() ||
4464
4449
  declaration_scope->is_module_scope()) {
4465
- // Contexts nested in the global context have a canonical empty function
4450
+ // Contexts nested in the native context have a canonical empty function
4466
4451
  // as their closure, not the anonymous closure containing the global
4467
4452
  // code. Pass a smi sentinel and let the runtime look up the empty
4468
4453
  // function.
@@ -4492,14 +4477,57 @@ void FullCodeGenerator::EnterFinallyBlock() {
4492
4477
  ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize);
4493
4478
  STATIC_ASSERT(kSmiTag == 0);
4494
4479
  __ add(r1, r1, Operand(r1)); // Convert to smi.
4480
+
4481
+ // Store result register while executing finally block.
4482
+ __ push(r1);
4483
+
4484
+ // Store pending message while executing finally block.
4485
+ ExternalReference pending_message_obj =
4486
+ ExternalReference::address_of_pending_message_obj(isolate());
4487
+ __ mov(ip, Operand(pending_message_obj));
4488
+ __ ldr(r1, MemOperand(ip));
4489
+ __ push(r1);
4490
+
4491
+ ExternalReference has_pending_message =
4492
+ ExternalReference::address_of_has_pending_message(isolate());
4493
+ __ mov(ip, Operand(has_pending_message));
4494
+ __ ldr(r1, MemOperand(ip));
4495
+ __ SmiTag(r1);
4496
+ __ push(r1);
4497
+
4498
+ ExternalReference pending_message_script =
4499
+ ExternalReference::address_of_pending_message_script(isolate());
4500
+ __ mov(ip, Operand(pending_message_script));
4501
+ __ ldr(r1, MemOperand(ip));
4495
4502
  __ push(r1);
4496
4503
  }
4497
4504
 
4498
4505
 
4499
4506
  void FullCodeGenerator::ExitFinallyBlock() {
4500
4507
  ASSERT(!result_register().is(r1));
4508
+ // Restore pending message from stack.
4509
+ __ pop(r1);
4510
+ ExternalReference pending_message_script =
4511
+ ExternalReference::address_of_pending_message_script(isolate());
4512
+ __ mov(ip, Operand(pending_message_script));
4513
+ __ str(r1, MemOperand(ip));
4514
+
4515
+ __ pop(r1);
4516
+ __ SmiUntag(r1);
4517
+ ExternalReference has_pending_message =
4518
+ ExternalReference::address_of_has_pending_message(isolate());
4519
+ __ mov(ip, Operand(has_pending_message));
4520
+ __ str(r1, MemOperand(ip));
4521
+
4522
+ __ pop(r1);
4523
+ ExternalReference pending_message_obj =
4524
+ ExternalReference::address_of_pending_message_obj(isolate());
4525
+ __ mov(ip, Operand(pending_message_obj));
4526
+ __ str(r1, MemOperand(ip));
4527
+
4501
4528
  // Restore result register from stack.
4502
4529
  __ pop(r1);
4530
+
4503
4531
  // Uncook return address and return.
4504
4532
  __ pop(result_register());
4505
4533
  ASSERT_EQ(1, kSmiTagSize + kSmiShiftSize);