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
@@ -142,7 +142,9 @@ class Simulator {
142
142
  num_s_registers = 32,
143
143
  d0 = 0, d1, d2, d3, d4, d5, d6, d7,
144
144
  d8, d9, d10, d11, d12, d13, d14, d15,
145
- num_d_registers = 16
145
+ d16, d17, d18, d19, d20, d21, d22, d23,
146
+ d24, d25, d26, d27, d28, d29, d30, d31,
147
+ num_d_registers = 32
146
148
  };
147
149
 
148
150
  explicit Simulator(Isolate* isolate);
@@ -163,12 +165,30 @@ class Simulator {
163
165
  // Support for VFP.
164
166
  void set_s_register(int reg, unsigned int value);
165
167
  unsigned int get_s_register(int reg) const;
166
- void set_d_register_from_double(int dreg, const double& dbl);
167
- double get_double_from_d_register(int dreg);
168
- void set_s_register_from_float(int sreg, const float dbl);
169
- float get_float_from_s_register(int sreg);
170
- void set_s_register_from_sinteger(int reg, const int value);
171
- int get_sinteger_from_s_register(int reg);
168
+
169
+ void set_d_register_from_double(int dreg, const double& dbl) {
170
+ SetVFPRegister<double, 2>(dreg, dbl);
171
+ }
172
+
173
+ double get_double_from_d_register(int dreg) {
174
+ return GetFromVFPRegister<double, 2>(dreg);
175
+ }
176
+
177
+ void set_s_register_from_float(int sreg, const float flt) {
178
+ SetVFPRegister<float, 1>(sreg, flt);
179
+ }
180
+
181
+ float get_float_from_s_register(int sreg) {
182
+ return GetFromVFPRegister<float, 1>(sreg);
183
+ }
184
+
185
+ void set_s_register_from_sinteger(int sreg, const int sint) {
186
+ SetVFPRegister<int, 1>(sreg, sint);
187
+ }
188
+
189
+ int get_sinteger_from_s_register(int sreg) {
190
+ return GetFromVFPRegister<int, 1>(sreg);
191
+ }
172
192
 
173
193
  // Special case of set_register and get_register to access the raw PC value.
174
194
  void set_pc(int32_t value);
@@ -187,6 +207,8 @@ class Simulator {
187
207
  // generated RegExp code with 7 parameters. This is a convenience function,
188
208
  // which sets up the simulator state and grabs the result on return.
189
209
  int32_t Call(byte* entry, int argument_count, ...);
210
+ // Alternative: call a 2-argument double function.
211
+ double CallFP(byte* entry, double d0, double d1);
190
212
 
191
213
  // Push an address onto the JS stack.
192
214
  uintptr_t PushAddress(uintptr_t address);
@@ -332,6 +354,14 @@ class Simulator {
332
354
  void SetFpResult(const double& result);
333
355
  void TrashCallerSaveRegisters();
334
356
 
357
+ template<class ReturnType, int register_size>
358
+ ReturnType GetFromVFPRegister(int reg_index);
359
+
360
+ template<class InputType, int register_size>
361
+ void SetVFPRegister(int reg_index, const InputType& value);
362
+
363
+ void CallInternal(byte* entry);
364
+
335
365
  // Architecture state.
336
366
  // Saturating instructions require a Q flag to indicate saturation.
337
367
  // There is currently no way to read the CPSR directly, and thus read the Q
@@ -343,7 +373,7 @@ class Simulator {
343
373
  bool v_flag_;
344
374
 
345
375
  // VFP architecture state.
346
- unsigned int vfp_register[num_s_registers];
376
+ unsigned int vfp_registers_[num_d_registers * 2];
347
377
  bool n_flag_FPSCR_;
348
378
  bool z_flag_FPSCR_;
349
379
  bool c_flag_FPSCR_;
@@ -283,11 +283,12 @@ void StubCompiler::GenerateLoadGlobalFunctionPrototype(MacroAssembler* masm,
283
283
  int index,
284
284
  Register prototype) {
285
285
  // Load the global or builtins object from the current context.
286
- __ ldr(prototype, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
287
- // Load the global context from the global or builtins object.
288
286
  __ ldr(prototype,
289
- FieldMemOperand(prototype, GlobalObject::kGlobalContextOffset));
290
- // Load the function from the global context.
287
+ MemOperand(cp, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
288
+ // Load the native context from the global or builtins object.
289
+ __ ldr(prototype,
290
+ FieldMemOperand(prototype, GlobalObject::kNativeContextOffset));
291
+ // Load the function from the native context.
291
292
  __ ldr(prototype, MemOperand(prototype, Context::SlotOffset(index)));
292
293
  // Load the initial map. The global functions all have initial maps.
293
294
  __ ldr(prototype,
@@ -304,13 +305,14 @@ void StubCompiler::GenerateDirectLoadGlobalFunctionPrototype(
304
305
  Label* miss) {
305
306
  Isolate* isolate = masm->isolate();
306
307
  // Check we're still in the same context.
307
- __ ldr(prototype, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX)));
308
- __ Move(ip, isolate->global());
308
+ __ ldr(prototype,
309
+ MemOperand(cp, Context::SlotOffset(Context::GLOBAL_OBJECT_INDEX)));
310
+ __ Move(ip, isolate->global_object());
309
311
  __ cmp(prototype, ip);
310
312
  __ b(ne, miss);
311
313
  // Get the global function with the given index.
312
314
  Handle<JSFunction> function(
313
- JSFunction::cast(isolate->global_context()->get(index)));
315
+ JSFunction::cast(isolate->native_context()->get(index)));
314
316
  // Load its initial map. The global functions all have initial maps.
315
317
  __ Move(prototype, Handle<Map>(function->initial_map()));
316
318
  // Load the prototype from the initial map.
@@ -325,18 +327,23 @@ void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
325
327
  Register dst,
326
328
  Register src,
327
329
  Handle<JSObject> holder,
328
- int index) {
329
- // Adjust for the number of properties stored in the holder.
330
- index -= holder->map()->inobject_properties();
331
- if (index < 0) {
332
- // Get the property straight out of the holder.
333
- int offset = holder->map()->instance_size() + (index * kPointerSize);
330
+ PropertyIndex index) {
331
+ if (index.is_header_index()) {
332
+ int offset = index.header_index() * kPointerSize;
334
333
  __ ldr(dst, FieldMemOperand(src, offset));
335
334
  } else {
336
- // Calculate the offset into the properties array.
337
- int offset = index * kPointerSize + FixedArray::kHeaderSize;
338
- __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset));
339
- __ ldr(dst, FieldMemOperand(dst, offset));
335
+ // Adjust for the number of properties stored in the holder.
336
+ int slot = index.field_index() - holder->map()->inobject_properties();
337
+ if (slot < 0) {
338
+ // Get the property straight out of the holder.
339
+ int offset = holder->map()->instance_size() + (slot * kPointerSize);
340
+ __ ldr(dst, FieldMemOperand(src, offset));
341
+ } else {
342
+ // Calculate the offset into the properties array.
343
+ int offset = slot * kPointerSize + FixedArray::kHeaderSize;
344
+ __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset));
345
+ __ ldr(dst, FieldMemOperand(dst, offset));
346
+ }
340
347
  }
341
348
  }
342
349
 
@@ -435,22 +442,59 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
435
442
  Handle<JSObject> object,
436
443
  int index,
437
444
  Handle<Map> transition,
445
+ Handle<String> name,
438
446
  Register receiver_reg,
439
447
  Register name_reg,
440
- Register scratch,
448
+ Register scratch1,
449
+ Register scratch2,
441
450
  Label* miss_label) {
442
451
  // r0 : value
443
452
  Label exit;
444
453
 
454
+ LookupResult lookup(masm->isolate());
455
+ object->Lookup(*name, &lookup);
456
+ if (lookup.IsFound() && (lookup.IsReadOnly() || !lookup.IsCacheable())) {
457
+ // In sloppy mode, we could just return the value and be done. However, we
458
+ // might be in strict mode, where we have to throw. Since we cannot tell,
459
+ // go into slow case unconditionally.
460
+ __ jmp(miss_label);
461
+ return;
462
+ }
463
+
445
464
  // Check that the map of the object hasn't changed.
446
465
  CompareMapMode mode = transition.is_null() ? ALLOW_ELEMENT_TRANSITION_MAPS
447
466
  : REQUIRE_EXACT_MAP;
448
- __ CheckMap(receiver_reg, scratch, Handle<Map>(object->map()), miss_label,
467
+ __ CheckMap(receiver_reg, scratch1, Handle<Map>(object->map()), miss_label,
449
468
  DO_SMI_CHECK, mode);
450
469
 
451
470
  // Perform global security token check if needed.
452
471
  if (object->IsJSGlobalProxy()) {
453
- __ CheckAccessGlobalProxy(receiver_reg, scratch, miss_label);
472
+ __ CheckAccessGlobalProxy(receiver_reg, scratch1, miss_label);
473
+ }
474
+
475
+ // Check that we are allowed to write this.
476
+ if (!transition.is_null() && object->GetPrototype()->IsJSObject()) {
477
+ JSObject* holder;
478
+ if (lookup.IsFound()) {
479
+ holder = lookup.holder();
480
+ } else {
481
+ // Find the top object.
482
+ holder = *object;
483
+ do {
484
+ holder = JSObject::cast(holder->GetPrototype());
485
+ } while (holder->GetPrototype()->IsJSObject());
486
+ }
487
+ // We need an extra register, push
488
+ __ push(name_reg);
489
+ Label miss_pop, done_check;
490
+ CheckPrototypes(object, receiver_reg, Handle<JSObject>(holder), name_reg,
491
+ scratch1, scratch2, name, &miss_pop);
492
+ __ jmp(&done_check);
493
+ __ bind(&miss_pop);
494
+ __ pop(name_reg);
495
+ __ jmp(miss_label);
496
+ __ bind(&done_check);
497
+ __ pop(name_reg);
454
498
  }
455
499
 
456
500
  // Stub never generated for non-global objects that require access
@@ -474,14 +518,14 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
474
518
 
475
519
  if (!transition.is_null()) {
476
520
  // Update the map of the object.
477
- __ mov(scratch, Operand(transition));
478
- __ str(scratch, FieldMemOperand(receiver_reg, HeapObject::kMapOffset));
521
+ __ mov(scratch1, Operand(transition));
522
+ __ str(scratch1, FieldMemOperand(receiver_reg, HeapObject::kMapOffset));
479
523
 
480
524
  // Update the write barrier for the map field and pass the now unused
481
525
  // name_reg as scratch register.
482
526
  __ RecordWriteField(receiver_reg,
483
527
  HeapObject::kMapOffset,
484
- scratch,
528
+ scratch1,
485
529
  name_reg,
486
530
  kLRHasNotBeenSaved,
487
531
  kDontSaveFPRegs,
@@ -508,15 +552,16 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
508
552
  __ RecordWriteField(receiver_reg,
509
553
  offset,
510
554
  name_reg,
511
- scratch,
555
+ scratch1,
512
556
  kLRHasNotBeenSaved,
513
557
  kDontSaveFPRegs);
514
558
  } else {
515
559
  // Write to the properties array.
516
560
  int offset = index * kPointerSize + FixedArray::kHeaderSize;
517
561
  // Get the properties array
518
- __ ldr(scratch, FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset));
519
- __ str(r0, FieldMemOperand(scratch, offset));
562
+ __ ldr(scratch1,
563
+ FieldMemOperand(receiver_reg, JSObject::kPropertiesOffset));
564
+ __ str(r0, FieldMemOperand(scratch1, offset));
520
565
 
521
566
  // Skip updating write barrier if storing a smi.
522
567
  __ JumpIfSmi(r0, &exit);
@@ -524,7 +569,7 @@ void StubCompiler::GenerateStoreField(MacroAssembler* masm,
524
569
  // Update the write barrier for the array address.
525
570
  // Ok to clobber receiver_reg and name_reg, since we return.
526
571
  __ mov(name_reg, r0);
527
- __ RecordWriteField(scratch,
572
+ __ RecordWriteField(scratch1,
528
573
  offset,
529
574
  name_reg,
530
575
  receiver_reg,
@@ -547,6 +592,15 @@ void StubCompiler::GenerateLoadMiss(MacroAssembler* masm, Code::Kind kind) {
547
592
  }
548
593
 
549
594
 
595
+ void StubCompiler::GenerateStoreMiss(MacroAssembler* masm, Code::Kind kind) {
596
+ ASSERT(kind == Code::STORE_IC || kind == Code::KEYED_STORE_IC);
597
+ Handle<Code> code = (kind == Code::STORE_IC)
598
+ ? masm->isolate()->builtins()->StoreIC_Miss()
599
+ : masm->isolate()->builtins()->KeyedStoreIC_Miss();
600
+ __ Jump(code, RelocInfo::CODE_TARGET);
601
+ }
602
+
603
+
550
604
  static void GenerateCallFunction(MacroAssembler* masm,
551
605
  Handle<Object> object,
552
606
  const ParameterCount& arguments,
@@ -690,7 +744,7 @@ static void GenerateFastApiDirectCall(MacroAssembler* masm,
690
744
  __ mov(ip, Operand(argc));
691
745
  __ str(ip, MemOperand(r0, 2 * kPointerSize));
692
746
  // v8::Arguments::is_construct_call = 0
693
- __ mov(ip, Operand(0));
747
+ __ mov(ip, Operand::Zero());
694
748
  __ str(ip, MemOperand(r0, 3 * kPointerSize));
695
749
 
696
750
  const int kStackUnwindSpace = argc + kFastApiCallArguments + 1;
@@ -948,8 +1002,8 @@ static void StoreIntAsFloat(MacroAssembler* masm,
948
1002
  Register fval,
949
1003
  Register scratch1,
950
1004
  Register scratch2) {
951
- if (CpuFeatures::IsSupported(VFP3)) {
952
- CpuFeatures::Scope scope(VFP3);
1005
+ if (CpuFeatures::IsSupported(VFP2)) {
1006
+ CpuFeatures::Scope scope(VFP2);
953
1007
  __ vmov(s0, ival);
954
1008
  __ add(scratch1, dst, Operand(wordoffset, LSL, 2));
955
1009
  __ vcvt_f32_s32(s0, s0);
@@ -963,7 +1017,7 @@ static void StoreIntAsFloat(MacroAssembler* masm,
963
1017
 
964
1018
  __ and_(fval, ival, Operand(kBinary32SignMask), SetCC);
965
1019
  // Negate value if it is negative.
966
- __ rsb(ival, ival, Operand(0, RelocInfo::NONE), LeaveCC, ne);
1020
+ __ rsb(ival, ival, Operand::Zero(), LeaveCC, ne);
967
1021
 
968
1022
  // We have -1, 0 or 1, which we treat specially. Register ival contains
969
1023
  // absolute value: it is either equal to 1 (special case of -1 and 1),
@@ -1008,42 +1062,6 @@ static void StoreIntAsFloat(MacroAssembler* masm,
1008
1062
  }
1009
1063
 
1010
1064
 
1011
- // Convert unsigned integer with specified number of leading zeroes in binary
1012
- // representation to IEEE 754 double.
1013
- // Integer to convert is passed in register hiword.
1014
- // Resulting double is returned in registers hiword:loword.
1015
- // This functions does not work correctly for 0.
1016
- static void GenerateUInt2Double(MacroAssembler* masm,
1017
- Register hiword,
1018
- Register loword,
1019
- Register scratch,
1020
- int leading_zeroes) {
1021
- const int meaningful_bits = kBitsPerInt - leading_zeroes - 1;
1022
- const int biased_exponent = HeapNumber::kExponentBias + meaningful_bits;
1023
-
1024
- const int mantissa_shift_for_hi_word =
1025
- meaningful_bits - HeapNumber::kMantissaBitsInTopWord;
1026
-
1027
- const int mantissa_shift_for_lo_word =
1028
- kBitsPerInt - mantissa_shift_for_hi_word;
1029
-
1030
- __ mov(scratch, Operand(biased_exponent << HeapNumber::kExponentShift));
1031
- if (mantissa_shift_for_hi_word > 0) {
1032
- __ mov(loword, Operand(hiword, LSL, mantissa_shift_for_lo_word));
1033
- __ orr(hiword, scratch, Operand(hiword, LSR, mantissa_shift_for_hi_word));
1034
- } else {
1035
- __ mov(loword, Operand(0, RelocInfo::NONE));
1036
- __ orr(hiword, scratch, Operand(hiword, LSL, mantissa_shift_for_hi_word));
1037
- }
1038
-
1039
- // If least significant bit of biased exponent was not 1 it was corrupted
1040
- // by most significant bit of mantissa so we should fix that.
1041
- if (!(biased_exponent & 1)) {
1042
- __ bic(hiword, hiword, Operand(1 << HeapNumber::kExponentShift));
1043
- }
1044
- }
1045
-
1046
-
1047
1065
  #undef __
1048
1066
  #define __ ACCESS_MASM(masm())
1049
1067
 
@@ -1156,7 +1174,7 @@ void StubCompiler::GenerateLoadField(Handle<JSObject> object,
1156
1174
  Register scratch1,
1157
1175
  Register scratch2,
1158
1176
  Register scratch3,
1159
- int index,
1177
+ PropertyIndex index,
1160
1178
  Handle<String> name,
1161
1179
  Label* miss) {
1162
1180
  // Check that the receiver isn't a smi.
@@ -1192,6 +1210,45 @@ void StubCompiler::GenerateLoadConstant(Handle<JSObject> object,
1192
1210
  }
1193
1211
 
1194
1212
 
1213
+ void StubCompiler::GenerateDictionaryLoadCallback(Register receiver,
1214
+ Register name_reg,
1215
+ Register scratch1,
1216
+ Register scratch2,
1217
+ Register scratch3,
1218
+ Handle<AccessorInfo> callback,
1219
+ Handle<String> name,
1220
+ Label* miss) {
1221
+ ASSERT(!receiver.is(scratch1));
1222
+ ASSERT(!receiver.is(scratch2));
1223
+ ASSERT(!receiver.is(scratch3));
1224
+
1225
+ // Load the properties dictionary.
1226
+ Register dictionary = scratch1;
1227
+ __ ldr(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset));
1228
+
1229
+ // Probe the dictionary.
1230
+ Label probe_done;
1231
+ StringDictionaryLookupStub::GeneratePositiveLookup(masm(),
1232
+ miss,
1233
+ &probe_done,
1234
+ dictionary,
1235
+ name_reg,
1236
+ scratch2,
1237
+ scratch3);
1238
+ __ bind(&probe_done);
1239
+
1240
+ // If probing finds an entry in the dictionary, scratch3 contains the
1241
+ // pointer into the dictionary. Check that the value is the callback.
1242
+ Register pointer = scratch3;
1243
+ const int kElementsStartOffset = StringDictionary::kHeaderSize +
1244
+ StringDictionary::kElementsStartIndex * kPointerSize;
1245
+ const int kValueOffset = kElementsStartOffset + kPointerSize;
1246
+ __ ldr(scratch2, FieldMemOperand(pointer, kValueOffset));
1247
+ __ cmp(scratch2, Operand(callback));
1248
+ __ b(ne, miss);
1249
+ }
1250
+
1251
+
1195
1252
  void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
1196
1253
  Handle<JSObject> holder,
1197
1254
  Register receiver,
@@ -1199,6 +1256,7 @@ void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
1199
1256
  Register scratch1,
1200
1257
  Register scratch2,
1201
1258
  Register scratch3,
1259
+ Register scratch4,
1202
1260
  Handle<AccessorInfo> callback,
1203
1261
  Handle<String> name,
1204
1262
  Label* miss) {
@@ -1209,6 +1267,11 @@ void StubCompiler::GenerateLoadCallback(Handle<JSObject> object,
1209
1267
  Register reg = CheckPrototypes(object, receiver, holder, scratch1,
1210
1268
  scratch2, scratch3, name, miss);
1211
1269
 
1270
+ if (!holder->HasFastProperties() && !holder->IsJSGlobalObject()) {
1271
+ GenerateDictionaryLoadCallback(
1272
+ reg, name_reg, scratch2, scratch3, scratch4, callback, name, miss);
1273
+ }
1274
+
1212
1275
  // Build AccessorInfo::args_ list on the stack and push property name below
1213
1276
  // the exit frame to make GC aware of them and store pointers to them.
1214
1277
  __ push(receiver);
@@ -1265,12 +1328,13 @@ void StubCompiler::GenerateLoadInterceptor(Handle<JSObject> object,
1265
1328
  // later.
1266
1329
  bool compile_followup_inline = false;
1267
1330
  if (lookup->IsFound() && lookup->IsCacheable()) {
1268
- if (lookup->type() == FIELD) {
1331
+ if (lookup->IsField()) {
1269
1332
  compile_followup_inline = true;
1270
1333
  } else if (lookup->type() == CALLBACKS &&
1271
1334
  lookup->GetCallbackObject()->IsAccessorInfo()) {
1272
- compile_followup_inline =
1273
- AccessorInfo::cast(lookup->GetCallbackObject())->getter() != NULL;
1335
+ AccessorInfo* callback = AccessorInfo::cast(lookup->GetCallbackObject());
1336
+ compile_followup_inline = callback->getter() != NULL &&
1337
+ callback->IsCompatibleReceiver(*object);
1274
1338
  }
1275
1339
  }
1276
1340
 
@@ -1338,7 +1402,7 @@ void StubCompiler::GenerateLoadInterceptor(Handle<JSObject> object,
1338
1402
  miss);
1339
1403
  }
1340
1404
 
1341
- if (lookup->type() == FIELD) {
1405
+ if (lookup->IsField()) {
1342
1406
  // We found FIELD property in prototype chain of interceptor's holder.
1343
1407
  // Retrieve a field from field's holder.
1344
1408
  GenerateFastPropertyLoad(masm(), r0, holder_reg,
@@ -1459,7 +1523,7 @@ void CallStubCompiler::GenerateMissBranch() {
1459
1523
 
1460
1524
  Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object,
1461
1525
  Handle<JSObject> holder,
1462
- int index,
1526
+ PropertyIndex index,
1463
1527
  Handle<String> name) {
1464
1528
  // ----------- S t a t e -------------
1465
1529
  // -- r2 : name
@@ -1487,7 +1551,7 @@ Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object,
1487
1551
  GenerateMissBranch();
1488
1552
 
1489
1553
  // Return the generated code.
1490
- return GetCode(FIELD, name);
1554
+ return GetCode(Code::FIELD, name);
1491
1555
  }
1492
1556
 
1493
1557
 
@@ -1532,7 +1596,7 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1532
1596
  Label call_builtin;
1533
1597
 
1534
1598
  if (argc == 1) { // Otherwise fall through to call the builtin.
1535
- Label attempt_to_grow_elements;
1599
+ Label attempt_to_grow_elements, with_write_barrier, check_double;
1536
1600
 
1537
1601
  Register elements = r6;
1538
1602
  Register end_elements = r5;
@@ -1543,10 +1607,9 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1543
1607
  __ CheckMap(elements,
1544
1608
  r0,
1545
1609
  Heap::kFixedArrayMapRootIndex,
1546
- &call_builtin,
1610
+ &check_double,
1547
1611
  DONT_DO_SMI_CHECK);
1548
1612
 
1549
-
1550
1613
  // Get the array's length into r0 and calculate new length.
1551
1614
  __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset));
1552
1615
  STATIC_ASSERT(kSmiTagSize == 1);
@@ -1561,7 +1624,6 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1561
1624
  __ b(gt, &attempt_to_grow_elements);
1562
1625
 
1563
1626
  // Check if value is a smi.
1564
- Label with_write_barrier;
1565
1627
  __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize));
1566
1628
  __ JumpIfNotSmi(r4, &with_write_barrier);
1567
1629
 
@@ -1581,6 +1643,40 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1581
1643
  __ Drop(argc + 1);
1582
1644
  __ Ret();
1583
1645
 
1646
+ __ bind(&check_double);
1647
+
1648
+ // Check that the elements are in fast mode and writable.
1649
+ __ CheckMap(elements,
1650
+ r0,
1651
+ Heap::kFixedDoubleArrayMapRootIndex,
1652
+ &call_builtin,
1653
+ DONT_DO_SMI_CHECK);
1654
+
1655
+ // Get the array's length into r0 and calculate new length.
1656
+ __ ldr(r0, FieldMemOperand(receiver, JSArray::kLengthOffset));
1657
+ STATIC_ASSERT(kSmiTagSize == 1);
1658
+ STATIC_ASSERT(kSmiTag == 0);
1659
+ __ add(r0, r0, Operand(Smi::FromInt(argc)));
1660
+
1661
+ // Get the elements' length.
1662
+ __ ldr(r4, FieldMemOperand(elements, FixedArray::kLengthOffset));
1663
+
1664
+ // Check if we could survive without allocation.
1665
+ __ cmp(r0, r4);
1666
+ __ b(gt, &call_builtin);
1667
+
1668
+ __ ldr(r4, MemOperand(sp, (argc - 1) * kPointerSize));
1669
+ __ StoreNumberToDoubleElements(
1670
+ r4, r0, elements, r3, r5, r2, r9,
1671
+ &call_builtin, argc * kDoubleSize);
1672
+
1673
+ // Save new length.
1674
+ __ str(r0, FieldMemOperand(receiver, JSArray::kLengthOffset));
1675
+
1676
+ // Check for a smi.
1677
+ __ Drop(argc + 1);
1678
+ __ Ret();
1679
+
1584
1680
  __ bind(&with_write_barrier);
1585
1681
 
1586
1682
  __ ldr(r3, FieldMemOperand(receiver, HeapObject::kMapOffset));
@@ -1592,6 +1688,11 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1592
1688
  // In case of fast smi-only, convert to fast object, otherwise bail out.
1593
1689
  __ bind(&not_fast_object);
1594
1690
  __ CheckFastSmiElements(r3, r7, &call_builtin);
1691
+
1692
+ __ ldr(r7, FieldMemOperand(r4, HeapObject::kMapOffset));
1693
+ __ LoadRoot(ip, Heap::kHeapNumberMapRootIndex);
1694
+ __ cmp(r7, ip);
1695
+ __ b(eq, &call_builtin);
1595
1696
  // edx: receiver
1596
1697
  // r3: map
1597
1698
  Label try_holey_map;
@@ -1602,7 +1703,9 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1602
1703
  &try_holey_map);
1603
1704
  __ mov(r2, receiver);
1604
1705
  ElementsTransitionGenerator::
1605
- GenerateMapChangeElementsTransition(masm());
1706
+ GenerateMapChangeElementsTransition(masm(),
1707
+ DONT_TRACK_ALLOCATION_SITE,
1708
+ NULL);
1606
1709
  __ jmp(&fast_object);
1607
1710
 
1608
1711
  __ bind(&try_holey_map);
@@ -1613,7 +1716,9 @@ Handle<Code> CallStubCompiler::CompileArrayPushCall(
1613
1716
  &call_builtin);
1614
1717
  __ mov(r2, receiver);
1615
1718
  ElementsTransitionGenerator::
1616
- GenerateMapChangeElementsTransition(masm());
1719
+ GenerateMapChangeElementsTransition(masm(),
1720
+ DONT_TRACK_ALLOCATION_SITE,
1721
+ NULL);
1617
1722
  __ bind(&fast_object);
1618
1723
  } else {
1619
1724
  __ CheckFastObjectElements(r3, r3, &call_builtin);
@@ -2032,7 +2137,7 @@ Handle<Code> CallStubCompiler::CompileStringFromCharCodeCall(
2032
2137
  GenerateMissBranch();
2033
2138
 
2034
2139
  // Return the generated code.
2035
- return cell.is_null() ? GetCode(function) : GetCode(NORMAL, name);
2140
+ return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name);
2036
2141
  }
2037
2142
 
2038
2143
 
@@ -2050,11 +2155,11 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall(
2050
2155
  // -- sp[argc * 4] : receiver
2051
2156
  // -----------------------------------
2052
2157
 
2053
- if (!CpuFeatures::IsSupported(VFP3)) {
2158
+ if (!CpuFeatures::IsSupported(VFP2)) {
2054
2159
  return Handle<Code>::null();
2055
2160
  }
2056
2161
 
2057
- CpuFeatures::Scope scope_vfp3(VFP3);
2162
+ CpuFeatures::Scope scope_vfp2(VFP2);
2058
2163
  const int argc = arguments().immediate();
2059
2164
  // If the object is not a JSObject or we got an unexpected number of
2060
2165
  // arguments, bail out to the regular call.
@@ -2149,7 +2254,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall(
2149
2254
  __ mov(r0, Operand(r0, LSL, kSmiTagSize));
2150
2255
 
2151
2256
  // Check for -0.
2152
- __ cmp(r0, Operand(0, RelocInfo::NONE));
2257
+ __ cmp(r0, Operand::Zero());
2153
2258
  __ b(&restore_fpscr_and_return, ne);
2154
2259
  // r5 already holds the HeapNumber exponent.
2155
2260
  __ tst(r5, Operand(HeapNumber::kSignMask));
@@ -2178,7 +2283,7 @@ Handle<Code> CallStubCompiler::CompileMathFloorCall(
2178
2283
  GenerateMissBranch();
2179
2284
 
2180
2285
  // Return the generated code.
2181
- return cell.is_null() ? GetCode(function) : GetCode(NORMAL, name);
2286
+ return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name);
2182
2287
  }
2183
2288
 
2184
2289
 
@@ -2277,7 +2382,7 @@ Handle<Code> CallStubCompiler::CompileMathAbsCall(
2277
2382
  GenerateMissBranch();
2278
2383
 
2279
2384
  // Return the generated code.
2280
- return cell.is_null() ? GetCode(function) : GetCode(NORMAL, name);
2385
+ return cell.is_null() ? GetCode(function) : GetCode(Code::NORMAL, name);
2281
2386
  }
2282
2387
 
2283
2388
 
@@ -2332,23 +2437,15 @@ Handle<Code> CallStubCompiler::CompileFastApiCall(
2332
2437
  }
2333
2438
 
2334
2439
 
2335
- Handle<Code> CallStubCompiler::CompileCallConstant(Handle<Object> object,
2336
- Handle<JSObject> holder,
2337
- Handle<JSFunction> function,
2338
- Handle<String> name,
2339
- CheckType check) {
2440
+ void CallStubCompiler::CompileHandlerFrontend(Handle<Object> object,
2441
+ Handle<JSObject> holder,
2442
+ Handle<String> name,
2443
+ CheckType check,
2444
+ Label* success) {
2340
2445
  // ----------- S t a t e -------------
2341
2446
  // -- r2 : name
2342
2447
  // -- lr : return address
2343
2448
  // -----------------------------------
2344
- if (HasCustomCallGenerator(function)) {
2345
- Handle<Code> code = CompileCustomCall(object, holder,
2346
- Handle<JSGlobalPropertyCell>::null(),
2347
- function, name);
2348
- // A null handle means bail out to the regular compiler code below.
2349
- if (!code.is_null()) return code;
2350
- }
2351
-
2352
2449
  Label miss;
2353
2450
  GenerateNameCheck(name, &miss);
2354
2451
 
@@ -2382,78 +2479,89 @@ Handle<Code> CallStubCompiler::CompileCallConstant(Handle<Object> object,
2382
2479
  break;
2383
2480
 
2384
2481
  case STRING_CHECK:
2385
- if (function->IsBuiltin() || !function->shared()->is_classic_mode()) {
2386
- // Check that the object is a two-byte string or a symbol.
2387
- __ CompareObjectType(r1, r3, r3, FIRST_NONSTRING_TYPE);
2388
- __ b(ge, &miss);
2389
- // Check that the maps starting from the prototype haven't changed.
2390
- GenerateDirectLoadGlobalFunctionPrototype(
2391
- masm(), Context::STRING_FUNCTION_INDEX, r0, &miss);
2392
- CheckPrototypes(
2393
- Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2394
- r0, holder, r3, r1, r4, name, &miss);
2395
- } else {
2396
- // Calling non-strict non-builtins with a value as the receiver
2397
- // requires boxing.
2398
- __ jmp(&miss);
2399
- }
2482
+ // Check that the object is a two-byte string or a symbol.
2483
+ __ CompareObjectType(r1, r3, r3, FIRST_NONSTRING_TYPE);
2484
+ __ b(ge, &miss);
2485
+ // Check that the maps starting from the prototype haven't changed.
2486
+ GenerateDirectLoadGlobalFunctionPrototype(
2487
+ masm(), Context::STRING_FUNCTION_INDEX, r0, &miss);
2488
+ CheckPrototypes(
2489
+ Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2490
+ r0, holder, r3, r1, r4, name, &miss);
2400
2491
  break;
2401
2492
 
2402
- case NUMBER_CHECK:
2403
- if (function->IsBuiltin() || !function->shared()->is_classic_mode()) {
2404
- Label fast;
2405
- // Check that the object is a smi or a heap number.
2406
- __ JumpIfSmi(r1, &fast);
2407
- __ CompareObjectType(r1, r0, r0, HEAP_NUMBER_TYPE);
2408
- __ b(ne, &miss);
2409
- __ bind(&fast);
2410
- // Check that the maps starting from the prototype haven't changed.
2411
- GenerateDirectLoadGlobalFunctionPrototype(
2412
- masm(), Context::NUMBER_FUNCTION_INDEX, r0, &miss);
2413
- CheckPrototypes(
2414
- Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2415
- r0, holder, r3, r1, r4, name, &miss);
2416
- } else {
2417
- // Calling non-strict non-builtins with a value as the receiver
2418
- // requires boxing.
2419
- __ jmp(&miss);
2420
- }
2493
+ case NUMBER_CHECK: {
2494
+ Label fast;
2495
+ // Check that the object is a smi or a heap number.
2496
+ __ JumpIfSmi(r1, &fast);
2497
+ __ CompareObjectType(r1, r0, r0, HEAP_NUMBER_TYPE);
2498
+ __ b(ne, &miss);
2499
+ __ bind(&fast);
2500
+ // Check that the maps starting from the prototype haven't changed.
2501
+ GenerateDirectLoadGlobalFunctionPrototype(
2502
+ masm(), Context::NUMBER_FUNCTION_INDEX, r0, &miss);
2503
+ CheckPrototypes(
2504
+ Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2505
+ r0, holder, r3, r1, r4, name, &miss);
2421
2506
  break;
2422
-
2423
- case BOOLEAN_CHECK:
2424
- if (function->IsBuiltin() || !function->shared()->is_classic_mode()) {
2425
- Label fast;
2426
- // Check that the object is a boolean.
2427
- __ LoadRoot(ip, Heap::kTrueValueRootIndex);
2428
- __ cmp(r1, ip);
2429
- __ b(eq, &fast);
2430
- __ LoadRoot(ip, Heap::kFalseValueRootIndex);
2431
- __ cmp(r1, ip);
2432
- __ b(ne, &miss);
2433
- __ bind(&fast);
2434
- // Check that the maps starting from the prototype haven't changed.
2435
- GenerateDirectLoadGlobalFunctionPrototype(
2436
- masm(), Context::BOOLEAN_FUNCTION_INDEX, r0, &miss);
2437
- CheckPrototypes(
2438
- Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2439
- r0, holder, r3, r1, r4, name, &miss);
2440
- } else {
2441
- // Calling non-strict non-builtins with a value as the receiver
2442
- // requires boxing.
2443
- __ jmp(&miss);
2444
- }
2507
+ }
2508
+ case BOOLEAN_CHECK: {
2509
+ Label fast;
2510
+ // Check that the object is a boolean.
2511
+ __ LoadRoot(ip, Heap::kTrueValueRootIndex);
2512
+ __ cmp(r1, ip);
2513
+ __ b(eq, &fast);
2514
+ __ LoadRoot(ip, Heap::kFalseValueRootIndex);
2515
+ __ cmp(r1, ip);
2516
+ __ b(ne, &miss);
2517
+ __ bind(&fast);
2518
+ // Check that the maps starting from the prototype haven't changed.
2519
+ GenerateDirectLoadGlobalFunctionPrototype(
2520
+ masm(), Context::BOOLEAN_FUNCTION_INDEX, r0, &miss);
2521
+ CheckPrototypes(
2522
+ Handle<JSObject>(JSObject::cast(object->GetPrototype())),
2523
+ r0, holder, r3, r1, r4, name, &miss);
2445
2524
  break;
2525
+ }
2446
2526
  }
2447
2527
 
2528
+ __ b(success);
2529
+
2530
+ // Handle call cache miss.
2531
+ __ bind(&miss);
2532
+ GenerateMissBranch();
2533
+ }
2534
+
2535
+
2536
+ void CallStubCompiler::CompileHandlerBackend(Handle<JSFunction> function) {
2448
2537
  CallKind call_kind = CallICBase::Contextual::decode(extra_state_)
2449
2538
  ? CALL_AS_FUNCTION
2450
2539
  : CALL_AS_METHOD;
2451
2540
  __ InvokeFunction(
2452
2541
  function, arguments(), JUMP_FUNCTION, NullCallWrapper(), call_kind);
2542
+ }
2543
+
2544
+
2545
+ Handle<Code> CallStubCompiler::CompileCallConstant(
2546
+ Handle<Object> object,
2547
+ Handle<JSObject> holder,
2548
+ Handle<String> name,
2549
+ CheckType check,
2550
+ Handle<JSFunction> function) {
2551
+ if (HasCustomCallGenerator(function)) {
2552
+ Handle<Code> code = CompileCustomCall(object, holder,
2553
+ Handle<JSGlobalPropertyCell>::null(),
2554
+ function, name);
2555
+ // A null handle means bail out to the regular compiler code below.
2556
+ if (!code.is_null()) return code;
2557
+ }
2558
+
2559
+ Label success;
2560
+
2561
+ CompileHandlerFrontend(object, holder, name, check, &success);
2562
+ __ bind(&success);
2563
+ CompileHandlerBackend(function);
2453
2564
 
2454
- // Handle call cache miss.
2455
- __ bind(&miss);
2456
- GenerateMissBranch();
2457
2565
 
2458
2566
  // Return the generated code.
2459
2567
  return GetCode(function);
@@ -2494,7 +2602,7 @@ Handle<Code> CallStubCompiler::CompileCallInterceptor(Handle<JSObject> object,
2494
2602
  GenerateMissBranch();
2495
2603
 
2496
2604
  // Return the generated code.
2497
- return GetCode(INTERCEPTOR, name);
2605
+ return GetCode(Code::INTERCEPTOR, name);
2498
2606
  }
2499
2607
 
2500
2608
 
@@ -2552,7 +2660,7 @@ Handle<Code> CallStubCompiler::CompileCallGlobal(
2552
2660
  GenerateMissBranch();
2553
2661
 
2554
2662
  // Return the generated code.
2555
- return GetCode(NORMAL, name);
2663
+ return GetCode(Code::NORMAL, name);
2556
2664
  }
2557
2665
 
2558
2666
 
@@ -2568,20 +2676,29 @@ Handle<Code> StoreStubCompiler::CompileStoreField(Handle<JSObject> object,
2568
2676
  // -----------------------------------
2569
2677
  Label miss;
2570
2678
 
2571
- GenerateStoreField(masm(), object, index, transition, r1, r2, r3, &miss);
2679
+ GenerateStoreField(masm(),
2680
+ object,
2681
+ index,
2682
+ transition,
2683
+ name,
2684
+ r1, r2, r3, r4,
2685
+ &miss);
2572
2686
  __ bind(&miss);
2573
2687
  Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss();
2574
2688
  __ Jump(ic, RelocInfo::CODE_TARGET);
2575
2689
 
2576
2690
  // Return the generated code.
2577
- return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name);
2691
+ return GetCode(transition.is_null()
2692
+ ? Code::FIELD
2693
+ : Code::MAP_TRANSITION, name);
2578
2694
  }
2579
2695
 
2580
2696
 
2581
2697
  Handle<Code> StoreStubCompiler::CompileStoreCallback(
2582
- Handle<JSObject> object,
2583
- Handle<AccessorInfo> callback,
2584
- Handle<String> name) {
2698
+ Handle<String> name,
2699
+ Handle<JSObject> receiver,
2700
+ Handle<JSObject> holder,
2701
+ Handle<AccessorInfo> callback) {
2585
2702
  // ----------- S t a t e -------------
2586
2703
  // -- r0 : value
2587
2704
  // -- r1 : receiver
@@ -2589,19 +2706,12 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
2589
2706
  // -- lr : return address
2590
2707
  // -----------------------------------
2591
2708
  Label miss;
2709
+ // Check that the maps haven't changed.
2710
+ __ JumpIfSmi(r1, &miss);
2711
+ CheckPrototypes(receiver, r1, holder, r3, r4, r5, name, &miss);
2592
2712
 
2593
- // Check that the map of the object hasn't changed.
2594
- __ CheckMap(r1, r3, Handle<Map>(object->map()), &miss,
2595
- DO_SMI_CHECK, ALLOW_ELEMENT_TRANSITION_MAPS);
2596
-
2597
- // Perform global security token check if needed.
2598
- if (object->IsJSGlobalProxy()) {
2599
- __ CheckAccessGlobalProxy(r1, r3, &miss);
2600
- }
2601
-
2602
- // Stub never generated for non-global objects that require access
2603
- // checks.
2604
- ASSERT(object->IsJSGlobalProxy() || !object->IsAccessCheckNeeded());
2713
+ // Stub never generated for non-global objects that require access checks.
2714
+ ASSERT(holder->IsJSGlobalProxy() || !holder->IsAccessCheckNeeded());
2605
2715
 
2606
2716
  __ push(r1); // receiver
2607
2717
  __ mov(ip, Operand(callback)); // callback info
@@ -2619,7 +2729,80 @@ Handle<Code> StoreStubCompiler::CompileStoreCallback(
2619
2729
  __ Jump(ic, RelocInfo::CODE_TARGET);
2620
2730
 
2621
2731
  // Return the generated code.
2622
- return GetCode(CALLBACKS, name);
2732
+ return GetCode(Code::CALLBACKS, name);
2733
+ }
2734
+
2735
+
2736
+ #undef __
2737
+ #define __ ACCESS_MASM(masm)
2738
+
2739
+
2740
+ void StoreStubCompiler::GenerateStoreViaSetter(
2741
+ MacroAssembler* masm,
2742
+ Handle<JSFunction> setter) {
2743
+ // ----------- S t a t e -------------
2744
+ // -- r0 : value
2745
+ // -- r1 : receiver
2746
+ // -- r2 : name
2747
+ // -- lr : return address
2748
+ // -----------------------------------
2749
+ {
2750
+ FrameScope scope(masm, StackFrame::INTERNAL);
2751
+
2752
+ // Save value register, so we can restore it later.
2753
+ __ push(r0);
2754
+
2755
+ if (!setter.is_null()) {
2756
+ // Call the JavaScript setter with receiver and value on the stack.
2757
+ __ Push(r1, r0);
2758
+ ParameterCount actual(1);
2759
+ __ InvokeFunction(setter, actual, CALL_FUNCTION, NullCallWrapper(),
2760
+ CALL_AS_METHOD);
2761
+ } else {
2762
+ // If we generate a global code snippet for deoptimization only, remember
2763
+ // the place to continue after deoptimization.
2764
+ masm->isolate()->heap()->SetSetterStubDeoptPCOffset(masm->pc_offset());
2765
+ }
2766
+
2767
+ // We have to return the passed value, not the return value of the setter.
2768
+ __ pop(r0);
2769
+
2770
+ // Restore context register.
2771
+ __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2772
+ }
2773
+ __ Ret();
2774
+ }
2775
+
2776
+
2777
+ #undef __
2778
+ #define __ ACCESS_MASM(masm())
2779
+
2780
+
2781
+ Handle<Code> StoreStubCompiler::CompileStoreViaSetter(
2782
+ Handle<String> name,
2783
+ Handle<JSObject> receiver,
2784
+ Handle<JSObject> holder,
2785
+ Handle<JSFunction> setter) {
2786
+ // ----------- S t a t e -------------
2787
+ // -- r0 : value
2788
+ // -- r1 : receiver
2789
+ // -- r2 : name
2790
+ // -- lr : return address
2791
+ // -----------------------------------
2792
+ Label miss;
2793
+
2794
+ // Check that the maps haven't changed.
2795
+ __ JumpIfSmi(r1, &miss);
2796
+ CheckPrototypes(receiver, r1, holder, r3, r4, r5, name, &miss);
2797
+
2798
+ GenerateStoreViaSetter(masm(), setter);
2799
+
2800
+ __ bind(&miss);
2801
+ Handle<Code> ic = masm()->isolate()->builtins()->StoreIC_Miss();
2802
+ __ Jump(ic, RelocInfo::CODE_TARGET);
2803
+
2804
+ // Return the generated code.
2805
+ return GetCode(Code::CALLBACKS, name);
2623
2806
  }
2624
2807
 
2625
2808
 
@@ -2664,7 +2847,7 @@ Handle<Code> StoreStubCompiler::CompileStoreInterceptor(
2664
2847
  __ Jump(ic, RelocInfo::CODE_TARGET);
2665
2848
 
2666
2849
  // Return the generated code.
2667
- return GetCode(INTERCEPTOR, name);
2850
+ return GetCode(Code::INTERCEPTOR, name);
2668
2851
  }
2669
2852
 
2670
2853
 
@@ -2710,13 +2893,15 @@ Handle<Code> StoreStubCompiler::CompileStoreGlobal(
2710
2893
  __ Jump(ic, RelocInfo::CODE_TARGET);
2711
2894
 
2712
2895
  // Return the generated code.
2713
- return GetCode(NORMAL, name);
2896
+ return GetCode(Code::NORMAL, name);
2714
2897
  }
2715
2898
 
2716
2899
 
2717
- Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
2718
- Handle<JSObject> object,
2719
- Handle<JSObject> last) {
2900
+ Handle<Code> LoadStubCompiler::CompileLoadNonexistent(
2901
+ Handle<JSObject> object,
2902
+ Handle<JSObject> last,
2903
+ Handle<String> name,
2904
+ Handle<GlobalObject> global) {
2720
2905
  // ----------- S t a t e -------------
2721
2906
  // -- r0 : receiver
2722
2907
  // -- lr : return address
@@ -2726,14 +2911,24 @@ Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
2726
2911
  // Check that receiver is not a smi.
2727
2912
  __ JumpIfSmi(r0, &miss);
2728
2913
 
2914
+
2915
+ Register scratch = r1;
2916
+
2729
2917
  // Check the maps of the full prototype chain.
2730
- CheckPrototypes(object, r0, last, r3, r1, r4, name, &miss);
2918
+ Register result =
2919
+ CheckPrototypes(object, r0, last, r3, scratch, r4, name, &miss);
2731
2920
 
2732
2921
  // If the last object in the prototype chain is a global object,
2733
2922
  // check that the global property cell is empty.
2734
- if (last->IsGlobalObject()) {
2735
- GenerateCheckPropertyCell(
2736
- masm(), Handle<GlobalObject>::cast(last), name, r1, &miss);
2923
+ if (!global.is_null()) {
2924
+ GenerateCheckPropertyCell(masm(), global, name, scratch, &miss);
2925
+ }
2926
+
2927
+ if (!last->HasFastProperties()) {
2928
+ __ ldr(scratch, FieldMemOperand(result, HeapObject::kMapOffset));
2929
+ __ ldr(scratch, FieldMemOperand(scratch, Map::kPrototypeOffset));
2930
+ __ cmp(scratch, Operand(isolate()->factory()->null_value()));
2931
+ __ b(ne, &miss);
2737
2932
  }
2738
2933
 
2739
2934
  // Return undefined if maps of the full prototype chain are still the
@@ -2745,74 +2940,74 @@ Handle<Code> LoadStubCompiler::CompileLoadNonexistent(Handle<String> name,
2745
2940
  GenerateLoadMiss(masm(), Code::LOAD_IC);
2746
2941
 
2747
2942
  // Return the generated code.
2748
- return GetCode(NONEXISTENT, factory()->empty_string());
2943
+ return GetCode(Code::NONEXISTENT, factory()->empty_string());
2749
2944
  }
2750
2945
 
2751
2946
 
2752
- Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object,
2753
- Handle<JSObject> holder,
2754
- int index,
2755
- Handle<String> name) {
2756
- // ----------- S t a t e -------------
2757
- // -- r0 : receiver
2758
- // -- r2 : name
2759
- // -- lr : return address
2760
- // -----------------------------------
2761
- Label miss;
2947
+ Register* LoadStubCompiler::registers() {
2948
+ // receiver, name, scratch1, scratch2, scratch3, scratch4.
2949
+ static Register registers[] = { r0, r2, r3, r1, r4, r5 };
2950
+ return registers;
2951
+ }
2762
2952
 
2763
- GenerateLoadField(object, holder, r0, r3, r1, r4, index, name, &miss);
2764
- __ bind(&miss);
2765
- GenerateLoadMiss(masm(), Code::LOAD_IC);
2766
2953
 
2767
- // Return the generated code.
2768
- return GetCode(FIELD, name);
2954
+ Register* KeyedLoadStubCompiler::registers() {
2955
+ // receiver, name, scratch1, scratch2, scratch3, scratch4.
2956
+ static Register registers[] = { r1, r0, r2, r3, r4, r5 };
2957
+ return registers;
2769
2958
  }
2770
2959
 
2771
2960
 
2772
- Handle<Code> LoadStubCompiler::CompileLoadCallback(
2773
- Handle<String> name,
2774
- Handle<JSObject> object,
2775
- Handle<JSObject> holder,
2776
- Handle<AccessorInfo> callback) {
2777
- // ----------- S t a t e -------------
2778
- // -- r0 : receiver
2779
- // -- r2 : name
2780
- // -- lr : return address
2781
- // -----------------------------------
2782
- Label miss;
2783
- GenerateLoadCallback(object, holder, r0, r2, r3, r1, r4, callback, name,
2784
- &miss);
2785
- __ bind(&miss);
2786
- GenerateLoadMiss(masm(), Code::LOAD_IC);
2787
-
2788
- // Return the generated code.
2789
- return GetCode(CALLBACKS, name);
2961
+ void KeyedLoadStubCompiler::GenerateNameCheck(Handle<String> name,
2962
+ Register name_reg,
2963
+ Label* miss) {
2964
+ __ cmp(name_reg, Operand(name));
2965
+ __ b(ne, miss);
2790
2966
  }
2791
2967
 
2792
2968
 
2793
- Handle<Code> LoadStubCompiler::CompileLoadConstant(Handle<JSObject> object,
2794
- Handle<JSObject> holder,
2795
- Handle<JSFunction> value,
2796
- Handle<String> name) {
2969
+ #undef __
2970
+ #define __ ACCESS_MASM(masm)
2971
+
2972
+
2973
+ void LoadStubCompiler::GenerateLoadViaGetter(MacroAssembler* masm,
2974
+ Handle<JSFunction> getter) {
2797
2975
  // ----------- S t a t e -------------
2798
2976
  // -- r0 : receiver
2799
2977
  // -- r2 : name
2800
2978
  // -- lr : return address
2801
2979
  // -----------------------------------
2802
- Label miss;
2980
+ {
2981
+ FrameScope scope(masm, StackFrame::INTERNAL);
2803
2982
 
2804
- GenerateLoadConstant(object, holder, r0, r3, r1, r4, value, name, &miss);
2805
- __ bind(&miss);
2806
- GenerateLoadMiss(masm(), Code::LOAD_IC);
2983
+ if (!getter.is_null()) {
2984
+ // Call the JavaScript getter with the receiver on the stack.
2985
+ __ push(r0);
2986
+ ParameterCount actual(0);
2987
+ __ InvokeFunction(getter, actual, CALL_FUNCTION, NullCallWrapper(),
2988
+ CALL_AS_METHOD);
2989
+ } else {
2990
+ // If we generate a global code snippet for deoptimization only, remember
2991
+ // the place to continue after deoptimization.
2992
+ masm->isolate()->heap()->SetGetterStubDeoptPCOffset(masm->pc_offset());
2993
+ }
2807
2994
 
2808
- // Return the generated code.
2809
- return GetCode(CONSTANT_FUNCTION, name);
2995
+ // Restore context register.
2996
+ __ ldr(cp, MemOperand(fp, StandardFrameConstants::kContextOffset));
2997
+ }
2998
+ __ Ret();
2810
2999
  }
2811
3000
 
2812
3001
 
2813
- Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> object,
2814
- Handle<JSObject> holder,
2815
- Handle<String> name) {
3002
+ #undef __
3003
+ #define __ ACCESS_MASM(masm())
3004
+
3005
+
3006
+ Handle<Code> LoadStubCompiler::CompileLoadViaGetter(
3007
+ Handle<JSObject> receiver,
3008
+ Handle<JSObject> holder,
3009
+ Handle<String> name,
3010
+ Handle<JSFunction> getter) {
2816
3011
  // ----------- S t a t e -------------
2817
3012
  // -- r0 : receiver
2818
3013
  // -- r2 : name
@@ -2820,15 +3015,17 @@ Handle<Code> LoadStubCompiler::CompileLoadInterceptor(Handle<JSObject> object,
2820
3015
  // -----------------------------------
2821
3016
  Label miss;
2822
3017
 
2823
- LookupResult lookup(isolate());
2824
- LookupPostInterceptor(holder, name, &lookup);
2825
- GenerateLoadInterceptor(object, holder, &lookup, r0, r2, r3, r1, r4, name,
2826
- &miss);
3018
+ // Check that the maps haven't changed.
3019
+ __ JumpIfSmi(r0, &miss);
3020
+ CheckPrototypes(receiver, r0, holder, r3, r4, r1, name, &miss);
3021
+
3022
+ GenerateLoadViaGetter(masm(), getter);
3023
+
2827
3024
  __ bind(&miss);
2828
3025
  GenerateLoadMiss(masm(), Code::LOAD_IC);
2829
3026
 
2830
3027
  // Return the generated code.
2831
- return GetCode(INTERCEPTOR, name);
3028
+ return GetCode(Code::CALLBACKS, name);
2832
3029
  }
2833
3030
 
2834
3031
 
@@ -2870,198 +3067,35 @@ Handle<Code> LoadStubCompiler::CompileLoadGlobal(
2870
3067
  GenerateLoadMiss(masm(), Code::LOAD_IC);
2871
3068
 
2872
3069
  // Return the generated code.
2873
- return GetCode(NORMAL, name);
3070
+ return GetCode(Code::NORMAL, name);
2874
3071
  }
2875
3072
 
2876
3073
 
2877
- Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name,
2878
- Handle<JSObject> receiver,
2879
- Handle<JSObject> holder,
2880
- int index) {
3074
+ Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
3075
+ Handle<Map> receiver_map) {
2881
3076
  // ----------- S t a t e -------------
2882
3077
  // -- lr : return address
2883
3078
  // -- r0 : key
2884
3079
  // -- r1 : receiver
2885
3080
  // -----------------------------------
2886
- Label miss;
2887
-
2888
- // Check the key is the cached one.
2889
- __ cmp(r0, Operand(name));
2890
- __ b(ne, &miss);
3081
+ ElementsKind elements_kind = receiver_map->elements_kind();
3082
+ if (receiver_map->has_fast_elements() ||
3083
+ receiver_map->has_external_array_elements()) {
3084
+ Handle<Code> stub = KeyedLoadFastElementStub(
3085
+ receiver_map->instance_type() == JS_ARRAY_TYPE,
3086
+ elements_kind).GetCode();
3087
+ __ DispatchMap(r1, r2, receiver_map, stub, DO_SMI_CHECK);
3088
+ } else {
3089
+ Handle<Code> stub =
3090
+ KeyedLoadDictionaryElementStub().GetCode();
3091
+ __ DispatchMap(r1, r2, receiver_map, stub, DO_SMI_CHECK);
3092
+ }
2891
3093
 
2892
- GenerateLoadField(receiver, holder, r1, r2, r3, r4, index, name, &miss);
2893
- __ bind(&miss);
2894
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3094
+ Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
3095
+ __ Jump(ic, RelocInfo::CODE_TARGET);
2895
3096
 
2896
- return GetCode(FIELD, name);
2897
- }
2898
-
2899
-
2900
- Handle<Code> KeyedLoadStubCompiler::CompileLoadCallback(
2901
- Handle<String> name,
2902
- Handle<JSObject> receiver,
2903
- Handle<JSObject> holder,
2904
- Handle<AccessorInfo> callback) {
2905
- // ----------- S t a t e -------------
2906
- // -- lr : return address
2907
- // -- r0 : key
2908
- // -- r1 : receiver
2909
- // -----------------------------------
2910
- Label miss;
2911
-
2912
- // Check the key is the cached one.
2913
- __ cmp(r0, Operand(name));
2914
- __ b(ne, &miss);
2915
-
2916
- GenerateLoadCallback(receiver, holder, r1, r0, r2, r3, r4, callback, name,
2917
- &miss);
2918
- __ bind(&miss);
2919
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2920
-
2921
- return GetCode(CALLBACKS, name);
2922
- }
2923
-
2924
-
2925
- Handle<Code> KeyedLoadStubCompiler::CompileLoadConstant(
2926
- Handle<String> name,
2927
- Handle<JSObject> receiver,
2928
- Handle<JSObject> holder,
2929
- Handle<JSFunction> value) {
2930
- // ----------- S t a t e -------------
2931
- // -- lr : return address
2932
- // -- r0 : key
2933
- // -- r1 : receiver
2934
- // -----------------------------------
2935
- Label miss;
2936
-
2937
- // Check the key is the cached one.
2938
- __ cmp(r0, Operand(name));
2939
- __ b(ne, &miss);
2940
-
2941
- GenerateLoadConstant(receiver, holder, r1, r2, r3, r4, value, name, &miss);
2942
- __ bind(&miss);
2943
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2944
-
2945
- // Return the generated code.
2946
- return GetCode(CONSTANT_FUNCTION, name);
2947
- }
2948
-
2949
-
2950
- Handle<Code> KeyedLoadStubCompiler::CompileLoadInterceptor(
2951
- Handle<JSObject> receiver,
2952
- Handle<JSObject> holder,
2953
- Handle<String> name) {
2954
- // ----------- S t a t e -------------
2955
- // -- lr : return address
2956
- // -- r0 : key
2957
- // -- r1 : receiver
2958
- // -----------------------------------
2959
- Label miss;
2960
-
2961
- // Check the key is the cached one.
2962
- __ cmp(r0, Operand(name));
2963
- __ b(ne, &miss);
2964
-
2965
- LookupResult lookup(isolate());
2966
- LookupPostInterceptor(holder, name, &lookup);
2967
- GenerateLoadInterceptor(receiver, holder, &lookup, r1, r0, r2, r3, r4, name,
2968
- &miss);
2969
- __ bind(&miss);
2970
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2971
-
2972
- return GetCode(INTERCEPTOR, name);
2973
- }
2974
-
2975
-
2976
- Handle<Code> KeyedLoadStubCompiler::CompileLoadArrayLength(
2977
- Handle<String> name) {
2978
- // ----------- S t a t e -------------
2979
- // -- lr : return address
2980
- // -- r0 : key
2981
- // -- r1 : receiver
2982
- // -----------------------------------
2983
- Label miss;
2984
-
2985
- // Check the key is the cached one.
2986
- __ cmp(r0, Operand(name));
2987
- __ b(ne, &miss);
2988
-
2989
- GenerateLoadArrayLength(masm(), r1, r2, &miss);
2990
- __ bind(&miss);
2991
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
2992
-
2993
- return GetCode(CALLBACKS, name);
2994
- }
2995
-
2996
-
2997
- Handle<Code> KeyedLoadStubCompiler::CompileLoadStringLength(
2998
- Handle<String> name) {
2999
- // ----------- S t a t e -------------
3000
- // -- lr : return address
3001
- // -- r0 : key
3002
- // -- r1 : receiver
3003
- // -----------------------------------
3004
- Label miss;
3005
-
3006
- Counters* counters = masm()->isolate()->counters();
3007
- __ IncrementCounter(counters->keyed_load_string_length(), 1, r2, r3);
3008
-
3009
- // Check the key is the cached one.
3010
- __ cmp(r0, Operand(name));
3011
- __ b(ne, &miss);
3012
-
3013
- GenerateLoadStringLength(masm(), r1, r2, r3, &miss, true);
3014
- __ bind(&miss);
3015
- __ DecrementCounter(counters->keyed_load_string_length(), 1, r2, r3);
3016
-
3017
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3018
-
3019
- return GetCode(CALLBACKS, name);
3020
- }
3021
-
3022
-
3023
- Handle<Code> KeyedLoadStubCompiler::CompileLoadFunctionPrototype(
3024
- Handle<String> name) {
3025
- // ----------- S t a t e -------------
3026
- // -- lr : return address
3027
- // -- r0 : key
3028
- // -- r1 : receiver
3029
- // -----------------------------------
3030
- Label miss;
3031
-
3032
- Counters* counters = masm()->isolate()->counters();
3033
- __ IncrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3);
3034
-
3035
- // Check the name hasn't changed.
3036
- __ cmp(r0, Operand(name));
3037
- __ b(ne, &miss);
3038
-
3039
- GenerateLoadFunctionPrototype(masm(), r1, r2, r3, &miss);
3040
- __ bind(&miss);
3041
- __ DecrementCounter(counters->keyed_load_function_prototype(), 1, r2, r3);
3042
- GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3043
-
3044
- return GetCode(CALLBACKS, name);
3045
- }
3046
-
3047
-
3048
- Handle<Code> KeyedLoadStubCompiler::CompileLoadElement(
3049
- Handle<Map> receiver_map) {
3050
- // ----------- S t a t e -------------
3051
- // -- lr : return address
3052
- // -- r0 : key
3053
- // -- r1 : receiver
3054
- // -----------------------------------
3055
- ElementsKind elements_kind = receiver_map->elements_kind();
3056
- Handle<Code> stub = KeyedLoadElementStub(elements_kind).GetCode();
3057
-
3058
- __ DispatchMap(r1, r2, receiver_map, stub, DO_SMI_CHECK);
3059
-
3060
- Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
3061
- __ Jump(ic, RelocInfo::CODE_TARGET);
3062
-
3063
- // Return the generated code.
3064
- return GetCode(NORMAL, factory()->empty_string());
3097
+ // Return the generated code.
3098
+ return GetCode(Code::NORMAL, factory()->empty_string());
3065
3099
  }
3066
3100
 
3067
3101
 
@@ -3089,7 +3123,7 @@ Handle<Code> KeyedLoadStubCompiler::CompileLoadPolymorphic(
3089
3123
  __ Jump(miss_ic, RelocInfo::CODE_TARGET, al);
3090
3124
 
3091
3125
  // Return the generated code.
3092
- return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC);
3126
+ return GetCode(Code::NORMAL, factory()->empty_string(), POLYMORPHIC);
3093
3127
  }
3094
3128
 
3095
3129
 
@@ -3114,7 +3148,13 @@ Handle<Code> KeyedStoreStubCompiler::CompileStoreField(Handle<JSObject> object,
3114
3148
 
3115
3149
  // r3 is used as scratch register. r1 and r2 keep their values if a jump to
3116
3150
  // the miss label is generated.
3117
- GenerateStoreField(masm(), object, index, transition, r2, r1, r3, &miss);
3151
+ GenerateStoreField(masm(),
3152
+ object,
3153
+ index,
3154
+ transition,
3155
+ name,
3156
+ r2, r1, r3, r4,
3157
+ &miss);
3118
3158
  __ bind(&miss);
3119
3159
 
3120
3160
  __ DecrementCounter(counters->keyed_store_field(), 1, r3, r4);
@@ -3122,7 +3162,9 @@ Handle<Code> KeyedStoreStubCompiler::CompileStoreField(Handle<JSObject> object,
3122
3162
  __ Jump(ic, RelocInfo::CODE_TARGET);
3123
3163
 
3124
3164
  // Return the generated code.
3125
- return GetCode(transition.is_null() ? FIELD : MAP_TRANSITION, name);
3165
+ return GetCode(transition.is_null()
3166
+ ? Code::FIELD
3167
+ : Code::MAP_TRANSITION, name);
3126
3168
  }
3127
3169
 
3128
3170
 
@@ -3146,7 +3188,7 @@ Handle<Code> KeyedStoreStubCompiler::CompileStoreElement(
3146
3188
  __ Jump(ic, RelocInfo::CODE_TARGET);
3147
3189
 
3148
3190
  // Return the generated code.
3149
- return GetCode(NORMAL, factory()->empty_string());
3191
+ return GetCode(Code::NORMAL, factory()->empty_string());
3150
3192
  }
3151
3193
 
3152
3194
 
@@ -3185,7 +3227,7 @@ Handle<Code> KeyedStoreStubCompiler::CompileStorePolymorphic(
3185
3227
  __ Jump(miss_ic, RelocInfo::CODE_TARGET, al);
3186
3228
 
3187
3229
  // Return the generated code.
3188
- return GetCode(NORMAL, factory()->empty_string(), MEGAMORPHIC);
3230
+ return GetCode(Code::NORMAL, factory()->empty_string(), POLYMORPHIC);
3189
3231
  }
3190
3232
 
3191
3233
 
@@ -3235,7 +3277,13 @@ Handle<Code> ConstructStubCompiler::CompileConstructStub(
3235
3277
  // r1: constructor function
3236
3278
  // r2: initial map
3237
3279
  // r7: undefined
3280
+ ASSERT(function->has_initial_map());
3238
3281
  __ ldrb(r3, FieldMemOperand(r2, Map::kInstanceSizeOffset));
3282
+ #ifdef DEBUG
3283
+ int instance_size = function->initial_map()->instance_size();
3284
+ __ cmp(r3, Operand(instance_size >> kPointerSizeLog2));
3285
+ __ Check(eq, "Instance size of initial map changed.");
3286
+ #endif
3239
3287
  __ AllocateInNewSpace(r3, r4, r5, r6, &generic_stub_call, SIZE_IN_WORDS);
3240
3288
 
3241
3289
  // Allocated the JSObject, now initialize the fields. Map is set to initial
@@ -3293,7 +3341,6 @@ Handle<Code> ConstructStubCompiler::CompileConstructStub(
3293
3341
  }
3294
3342
 
3295
3343
  // Fill the unused in-object property fields with undefined.
3296
- ASSERT(function->has_initial_map());
3297
3344
  for (int i = shared->this_property_assignments_count();
3298
3345
  i < function->initial_map()->inobject_properties();
3299
3346
  i++) {
@@ -3414,9 +3461,10 @@ static void GenerateSmiKeyCheck(MacroAssembler* masm,
3414
3461
  Register scratch0,
3415
3462
  Register scratch1,
3416
3463
  DwVfpRegister double_scratch0,
3464
+ DwVfpRegister double_scratch1,
3417
3465
  Label* fail) {
3418
- if (CpuFeatures::IsSupported(VFP3)) {
3419
- CpuFeatures::Scope scope(VFP3);
3466
+ if (CpuFeatures::IsSupported(VFP2)) {
3467
+ CpuFeatures::Scope scope(VFP2);
3420
3468
  Label key_ok;
3421
3469
  // Check for smi or a smi inside a heap number. We convert the heap
3422
3470
  // number and check if the conversion is exact and fits into the smi
@@ -3430,13 +3478,12 @@ static void GenerateSmiKeyCheck(MacroAssembler* masm,
3430
3478
  __ sub(ip, key, Operand(kHeapObjectTag));
3431
3479
  __ vldr(double_scratch0, ip, HeapNumber::kValueOffset);
3432
3480
  __ EmitVFPTruncate(kRoundToZero,
3433
- double_scratch0.low(),
3434
- double_scratch0,
3435
3481
  scratch0,
3482
+ double_scratch0,
3436
3483
  scratch1,
3484
+ double_scratch1,
3437
3485
  kCheckForInexactConversion);
3438
3486
  __ b(ne, fail);
3439
- __ vmov(scratch0, double_scratch0.low());
3440
3487
  __ TrySmiTag(scratch0, fail, scratch1);
3441
3488
  __ mov(key, scratch0);
3442
3489
  __ bind(&key_ok);
@@ -3447,336 +3494,6 @@ static void GenerateSmiKeyCheck(MacroAssembler* masm,
3447
3494
  }
3448
3495
 
3449
3496
 
3450
- void KeyedLoadStubCompiler::GenerateLoadExternalArray(
3451
- MacroAssembler* masm,
3452
- ElementsKind elements_kind) {
3453
- // ---------- S t a t e --------------
3454
- // -- lr : return address
3455
- // -- r0 : key
3456
- // -- r1 : receiver
3457
- // -----------------------------------
3458
- Label miss_force_generic, slow, failed_allocation;
3459
-
3460
- Register key = r0;
3461
- Register receiver = r1;
3462
-
3463
- // This stub is meant to be tail-jumped to, the receiver must already
3464
- // have been verified by the caller to not be a smi.
3465
-
3466
- // Check that the key is a smi or a heap number convertible to a smi.
3467
- GenerateSmiKeyCheck(masm, key, r4, r5, d1, &miss_force_generic);
3468
-
3469
- __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset));
3470
- // r3: elements array
3471
-
3472
- // Check that the index is in range.
3473
- __ ldr(ip, FieldMemOperand(r3, ExternalArray::kLengthOffset));
3474
- __ cmp(key, ip);
3475
- // Unsigned comparison catches both negative and too-large values.
3476
- __ b(hs, &miss_force_generic);
3477
-
3478
- __ ldr(r3, FieldMemOperand(r3, ExternalArray::kExternalPointerOffset));
3479
- // r3: base pointer of external storage
3480
-
3481
- // We are not untagging smi key and instead work with it
3482
- // as if it was premultiplied by 2.
3483
- STATIC_ASSERT((kSmiTag == 0) && (kSmiTagSize == 1));
3484
-
3485
- Register value = r2;
3486
- switch (elements_kind) {
3487
- case EXTERNAL_BYTE_ELEMENTS:
3488
- __ ldrsb(value, MemOperand(r3, key, LSR, 1));
3489
- break;
3490
- case EXTERNAL_PIXEL_ELEMENTS:
3491
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
3492
- __ ldrb(value, MemOperand(r3, key, LSR, 1));
3493
- break;
3494
- case EXTERNAL_SHORT_ELEMENTS:
3495
- __ ldrsh(value, MemOperand(r3, key, LSL, 0));
3496
- break;
3497
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
3498
- __ ldrh(value, MemOperand(r3, key, LSL, 0));
3499
- break;
3500
- case EXTERNAL_INT_ELEMENTS:
3501
- case EXTERNAL_UNSIGNED_INT_ELEMENTS:
3502
- __ ldr(value, MemOperand(r3, key, LSL, 1));
3503
- break;
3504
- case EXTERNAL_FLOAT_ELEMENTS:
3505
- if (CpuFeatures::IsSupported(VFP3)) {
3506
- CpuFeatures::Scope scope(VFP3);
3507
- __ add(r2, r3, Operand(key, LSL, 1));
3508
- __ vldr(s0, r2, 0);
3509
- } else {
3510
- __ ldr(value, MemOperand(r3, key, LSL, 1));
3511
- }
3512
- break;
3513
- case EXTERNAL_DOUBLE_ELEMENTS:
3514
- if (CpuFeatures::IsSupported(VFP3)) {
3515
- CpuFeatures::Scope scope(VFP3);
3516
- __ add(r2, r3, Operand(key, LSL, 2));
3517
- __ vldr(d0, r2, 0);
3518
- } else {
3519
- __ add(r4, r3, Operand(key, LSL, 2));
3520
- // r4: pointer to the beginning of the double we want to load.
3521
- __ ldr(r2, MemOperand(r4, 0));
3522
- __ ldr(r3, MemOperand(r4, Register::kSizeInBytes));
3523
- }
3524
- break;
3525
- case FAST_ELEMENTS:
3526
- case FAST_SMI_ELEMENTS:
3527
- case FAST_DOUBLE_ELEMENTS:
3528
- case FAST_HOLEY_ELEMENTS:
3529
- case FAST_HOLEY_SMI_ELEMENTS:
3530
- case FAST_HOLEY_DOUBLE_ELEMENTS:
3531
- case DICTIONARY_ELEMENTS:
3532
- case NON_STRICT_ARGUMENTS_ELEMENTS:
3533
- UNREACHABLE();
3534
- break;
3535
- }
3536
-
3537
- // For integer array types:
3538
- // r2: value
3539
- // For float array type:
3540
- // s0: value (if VFP3 is supported)
3541
- // r2: value (if VFP3 is not supported)
3542
- // For double array type:
3543
- // d0: value (if VFP3 is supported)
3544
- // r2/r3: value (if VFP3 is not supported)
3545
-
3546
- if (elements_kind == EXTERNAL_INT_ELEMENTS) {
3547
- // For the Int and UnsignedInt array types, we need to see whether
3548
- // the value can be represented in a Smi. If not, we need to convert
3549
- // it to a HeapNumber.
3550
- Label box_int;
3551
- __ cmp(value, Operand(0xC0000000));
3552
- __ b(mi, &box_int);
3553
- // Tag integer as smi and return it.
3554
- __ mov(r0, Operand(value, LSL, kSmiTagSize));
3555
- __ Ret();
3556
-
3557
- __ bind(&box_int);
3558
- // Allocate a HeapNumber for the result and perform int-to-double
3559
- // conversion. Don't touch r0 or r1 as they are needed if allocation
3560
- // fails.
3561
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3562
- __ AllocateHeapNumber(r5, r3, r4, r6, &slow);
3563
- // Now we can use r0 for the result as key is not needed any more.
3564
- __ mov(r0, r5);
3565
-
3566
- if (CpuFeatures::IsSupported(VFP3)) {
3567
- CpuFeatures::Scope scope(VFP3);
3568
- __ vmov(s0, value);
3569
- __ vcvt_f64_s32(d0, s0);
3570
- __ sub(r3, r0, Operand(kHeapObjectTag));
3571
- __ vstr(d0, r3, HeapNumber::kValueOffset);
3572
- __ Ret();
3573
- } else {
3574
- Register dst1 = r1;
3575
- Register dst2 = r3;
3576
- FloatingPointHelper::Destination dest =
3577
- FloatingPointHelper::kCoreRegisters;
3578
- FloatingPointHelper::ConvertIntToDouble(masm,
3579
- value,
3580
- dest,
3581
- d0,
3582
- dst1,
3583
- dst2,
3584
- r9,
3585
- s0);
3586
- __ str(dst1, FieldMemOperand(r0, HeapNumber::kMantissaOffset));
3587
- __ str(dst2, FieldMemOperand(r0, HeapNumber::kExponentOffset));
3588
- __ Ret();
3589
- }
3590
- } else if (elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) {
3591
- // The test is different for unsigned int values. Since we need
3592
- // the value to be in the range of a positive smi, we can't
3593
- // handle either of the top two bits being set in the value.
3594
- if (CpuFeatures::IsSupported(VFP3)) {
3595
- CpuFeatures::Scope scope(VFP3);
3596
- Label box_int, done;
3597
- __ tst(value, Operand(0xC0000000));
3598
- __ b(ne, &box_int);
3599
- // Tag integer as smi and return it.
3600
- __ mov(r0, Operand(value, LSL, kSmiTagSize));
3601
- __ Ret();
3602
-
3603
- __ bind(&box_int);
3604
- __ vmov(s0, value);
3605
- // Allocate a HeapNumber for the result and perform int-to-double
3606
- // conversion. Don't use r0 and r1 as AllocateHeapNumber clobbers all
3607
- // registers - also when jumping due to exhausted young space.
3608
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3609
- __ AllocateHeapNumber(r2, r3, r4, r6, &slow);
3610
-
3611
- __ vcvt_f64_u32(d0, s0);
3612
- __ sub(r1, r2, Operand(kHeapObjectTag));
3613
- __ vstr(d0, r1, HeapNumber::kValueOffset);
3614
-
3615
- __ mov(r0, r2);
3616
- __ Ret();
3617
- } else {
3618
- // Check whether unsigned integer fits into smi.
3619
- Label box_int_0, box_int_1, done;
3620
- __ tst(value, Operand(0x80000000));
3621
- __ b(ne, &box_int_0);
3622
- __ tst(value, Operand(0x40000000));
3623
- __ b(ne, &box_int_1);
3624
- // Tag integer as smi and return it.
3625
- __ mov(r0, Operand(value, LSL, kSmiTagSize));
3626
- __ Ret();
3627
-
3628
- Register hiword = value; // r2.
3629
- Register loword = r3;
3630
-
3631
- __ bind(&box_int_0);
3632
- // Integer does not have leading zeros.
3633
- GenerateUInt2Double(masm, hiword, loword, r4, 0);
3634
- __ b(&done);
3635
-
3636
- __ bind(&box_int_1);
3637
- // Integer has one leading zero.
3638
- GenerateUInt2Double(masm, hiword, loword, r4, 1);
3639
-
3640
-
3641
- __ bind(&done);
3642
- // Integer was converted to double in registers hiword:loword.
3643
- // Wrap it into a HeapNumber. Don't use r0 and r1 as AllocateHeapNumber
3644
- // clobbers all registers - also when jumping due to exhausted young
3645
- // space.
3646
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3647
- __ AllocateHeapNumber(r4, r5, r7, r6, &slow);
3648
-
3649
- __ str(hiword, FieldMemOperand(r4, HeapNumber::kExponentOffset));
3650
- __ str(loword, FieldMemOperand(r4, HeapNumber::kMantissaOffset));
3651
-
3652
- __ mov(r0, r4);
3653
- __ Ret();
3654
- }
3655
- } else if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
3656
- // For the floating-point array type, we need to always allocate a
3657
- // HeapNumber.
3658
- if (CpuFeatures::IsSupported(VFP3)) {
3659
- CpuFeatures::Scope scope(VFP3);
3660
- // Allocate a HeapNumber for the result. Don't use r0 and r1 as
3661
- // AllocateHeapNumber clobbers all registers - also when jumping due to
3662
- // exhausted young space.
3663
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3664
- __ AllocateHeapNumber(r2, r3, r4, r6, &slow);
3665
- __ vcvt_f64_f32(d0, s0);
3666
- __ sub(r1, r2, Operand(kHeapObjectTag));
3667
- __ vstr(d0, r1, HeapNumber::kValueOffset);
3668
-
3669
- __ mov(r0, r2);
3670
- __ Ret();
3671
- } else {
3672
- // Allocate a HeapNumber for the result. Don't use r0 and r1 as
3673
- // AllocateHeapNumber clobbers all registers - also when jumping due to
3674
- // exhausted young space.
3675
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3676
- __ AllocateHeapNumber(r3, r4, r5, r6, &slow);
3677
- // VFP is not available, do manual single to double conversion.
3678
-
3679
- // r2: floating point value (binary32)
3680
- // r3: heap number for result
3681
-
3682
- // Extract mantissa to r0. OK to clobber r0 now as there are no jumps to
3683
- // the slow case from here.
3684
- __ and_(r0, value, Operand(kBinary32MantissaMask));
3685
-
3686
- // Extract exponent to r1. OK to clobber r1 now as there are no jumps to
3687
- // the slow case from here.
3688
- __ mov(r1, Operand(value, LSR, kBinary32MantissaBits));
3689
- __ and_(r1, r1, Operand(kBinary32ExponentMask >> kBinary32MantissaBits));
3690
-
3691
- Label exponent_rebiased;
3692
- __ teq(r1, Operand(0x00));
3693
- __ b(eq, &exponent_rebiased);
3694
-
3695
- __ teq(r1, Operand(0xff));
3696
- __ mov(r1, Operand(0x7ff), LeaveCC, eq);
3697
- __ b(eq, &exponent_rebiased);
3698
-
3699
- // Rebias exponent.
3700
- __ add(r1,
3701
- r1,
3702
- Operand(-kBinary32ExponentBias + HeapNumber::kExponentBias));
3703
-
3704
- __ bind(&exponent_rebiased);
3705
- __ and_(r2, value, Operand(kBinary32SignMask));
3706
- value = no_reg;
3707
- __ orr(r2, r2, Operand(r1, LSL, HeapNumber::kMantissaBitsInTopWord));
3708
-
3709
- // Shift mantissa.
3710
- static const int kMantissaShiftForHiWord =
3711
- kBinary32MantissaBits - HeapNumber::kMantissaBitsInTopWord;
3712
-
3713
- static const int kMantissaShiftForLoWord =
3714
- kBitsPerInt - kMantissaShiftForHiWord;
3715
-
3716
- __ orr(r2, r2, Operand(r0, LSR, kMantissaShiftForHiWord));
3717
- __ mov(r0, Operand(r0, LSL, kMantissaShiftForLoWord));
3718
-
3719
- __ str(r2, FieldMemOperand(r3, HeapNumber::kExponentOffset));
3720
- __ str(r0, FieldMemOperand(r3, HeapNumber::kMantissaOffset));
3721
-
3722
- __ mov(r0, r3);
3723
- __ Ret();
3724
- }
3725
- } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
3726
- if (CpuFeatures::IsSupported(VFP3)) {
3727
- CpuFeatures::Scope scope(VFP3);
3728
- // Allocate a HeapNumber for the result. Don't use r0 and r1 as
3729
- // AllocateHeapNumber clobbers all registers - also when jumping due to
3730
- // exhausted young space.
3731
- __ LoadRoot(r6, Heap::kHeapNumberMapRootIndex);
3732
- __ AllocateHeapNumber(r2, r3, r4, r6, &slow);
3733
- __ sub(r1, r2, Operand(kHeapObjectTag));
3734
- __ vstr(d0, r1, HeapNumber::kValueOffset);
3735
-
3736
- __ mov(r0, r2);
3737
- __ Ret();
3738
- } else {
3739
- // Allocate a HeapNumber for the result. Don't use r0 and r1 as
3740
- // AllocateHeapNumber clobbers all registers - also when jumping due to
3741
- // exhausted young space.
3742
- __ LoadRoot(r7, Heap::kHeapNumberMapRootIndex);
3743
- __ AllocateHeapNumber(r4, r5, r6, r7, &slow);
3744
-
3745
- __ str(r2, FieldMemOperand(r4, HeapNumber::kMantissaOffset));
3746
- __ str(r3, FieldMemOperand(r4, HeapNumber::kExponentOffset));
3747
- __ mov(r0, r4);
3748
- __ Ret();
3749
- }
3750
-
3751
- } else {
3752
- // Tag integer as smi and return it.
3753
- __ mov(r0, Operand(value, LSL, kSmiTagSize));
3754
- __ Ret();
3755
- }
3756
-
3757
- // Slow case, key and receiver still in r0 and r1.
3758
- __ bind(&slow);
3759
- __ IncrementCounter(
3760
- masm->isolate()->counters()->keyed_load_external_array_slow(),
3761
- 1, r2, r3);
3762
-
3763
- // ---------- S t a t e --------------
3764
- // -- lr : return address
3765
- // -- r0 : key
3766
- // -- r1 : receiver
3767
- // -----------------------------------
3768
-
3769
- __ Push(r1, r0);
3770
-
3771
- __ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1);
3772
-
3773
- __ bind(&miss_force_generic);
3774
- Handle<Code> stub =
3775
- masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
3776
- __ Jump(stub, RelocInfo::CODE_TARGET);
3777
- }
3778
-
3779
-
3780
3497
  void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3781
3498
  MacroAssembler* masm,
3782
3499
  ElementsKind elements_kind) {
@@ -3798,7 +3515,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3798
3515
  // have been verified by the caller to not be a smi.
3799
3516
 
3800
3517
  // Check that the key is a smi or a heap number convertible to a smi.
3801
- GenerateSmiKeyCheck(masm, key, r4, r5, d1, &miss_force_generic);
3518
+ GenerateSmiKeyCheck(masm, key, r4, r5, d1, d2, &miss_force_generic);
3802
3519
 
3803
3520
  __ ldr(r3, FieldMemOperand(receiver, JSObject::kElementsOffset));
3804
3521
 
@@ -3849,17 +3566,17 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3849
3566
  __ add(r3, r3, Operand(key, LSL, 2));
3850
3567
  // r3: effective address of the double element
3851
3568
  FloatingPointHelper::Destination destination;
3852
- if (CpuFeatures::IsSupported(VFP3)) {
3569
+ if (CpuFeatures::IsSupported(VFP2)) {
3853
3570
  destination = FloatingPointHelper::kVFPRegisters;
3854
3571
  } else {
3855
3572
  destination = FloatingPointHelper::kCoreRegisters;
3856
3573
  }
3857
3574
  FloatingPointHelper::ConvertIntToDouble(
3858
3575
  masm, r5, destination,
3859
- d0, r6, r7, // These are: double_dst, dst1, dst2.
3576
+ d0, r6, r7, // These are: double_dst, dst_mantissa, dst_exponent.
3860
3577
  r4, s2); // These are: scratch2, single_scratch.
3861
3578
  if (destination == FloatingPointHelper::kVFPRegisters) {
3862
- CpuFeatures::Scope scope(VFP3);
3579
+ CpuFeatures::Scope scope(VFP2);
3863
3580
  __ vstr(d0, r3, 0);
3864
3581
  } else {
3865
3582
  __ str(r6, MemOperand(r3, 0));
@@ -3894,8 +3611,8 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3894
3611
  // The WebGL specification leaves the behavior of storing NaN and
3895
3612
  // +/-Infinity into integer arrays basically undefined. For more
3896
3613
  // reproducible behavior, convert these to zero.
3897
- if (CpuFeatures::IsSupported(VFP3)) {
3898
- CpuFeatures::Scope scope(VFP3);
3614
+ if (CpuFeatures::IsSupported(VFP2)) {
3615
+ CpuFeatures::Scope scope(VFP2);
3899
3616
 
3900
3617
  if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
3901
3618
  // vldr requires offset to be a multiple of 4 so we can not
@@ -3915,7 +3632,7 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
3915
3632
  // not include -kHeapObjectTag into it.
3916
3633
  __ sub(r5, value, Operand(kHeapObjectTag));
3917
3634
  __ vldr(d0, r5, HeapNumber::kValueOffset);
3918
- __ EmitECMATruncate(r5, d0, s2, r6, r7, r9);
3635
+ __ EmitECMATruncate(r5, d0, d1, r6, r7, r9);
3919
3636
 
3920
3637
  switch (elements_kind) {
3921
3638
  case EXTERNAL_BYTE_ELEMENTS:
@@ -4023,18 +3740,18 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4023
3740
  // and infinities. All these should be converted to 0.
4024
3741
  __ mov(r7, Operand(HeapNumber::kExponentMask));
4025
3742
  __ and_(r9, r5, Operand(r7), SetCC);
4026
- __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq);
3743
+ __ mov(r5, Operand::Zero(), LeaveCC, eq);
4027
3744
  __ b(eq, &done);
4028
3745
 
4029
3746
  __ teq(r9, Operand(r7));
4030
- __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, eq);
3747
+ __ mov(r5, Operand::Zero(), LeaveCC, eq);
4031
3748
  __ b(eq, &done);
4032
3749
 
4033
3750
  // Unbias exponent.
4034
3751
  __ mov(r9, Operand(r9, LSR, HeapNumber::kExponentShift));
4035
3752
  __ sub(r9, r9, Operand(HeapNumber::kExponentBias), SetCC);
4036
3753
  // If exponent is negative then result is 0.
4037
- __ mov(r5, Operand(0, RelocInfo::NONE), LeaveCC, mi);
3754
+ __ mov(r5, Operand::Zero(), LeaveCC, mi);
4038
3755
  __ b(mi, &done);
4039
3756
 
4040
3757
  // If exponent is too big then result is minimal value.
@@ -4050,14 +3767,14 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4050
3767
  __ mov(r5, Operand(r5, LSR, r9), LeaveCC, pl);
4051
3768
  __ b(pl, &sign);
4052
3769
 
4053
- __ rsb(r9, r9, Operand(0, RelocInfo::NONE));
3770
+ __ rsb(r9, r9, Operand::Zero());
4054
3771
  __ mov(r5, Operand(r5, LSL, r9));
4055
3772
  __ rsb(r9, r9, Operand(meaningfull_bits));
4056
3773
  __ orr(r5, r5, Operand(r6, LSR, r9));
4057
3774
 
4058
3775
  __ bind(&sign);
4059
- __ teq(r7, Operand(0, RelocInfo::NONE));
4060
- __ rsb(r5, r5, Operand(0, RelocInfo::NONE), LeaveCC, ne);
3776
+ __ teq(r7, Operand::Zero());
3777
+ __ rsb(r5, r5, Operand::Zero(), LeaveCC, ne);
4061
3778
 
4062
3779
  __ bind(&done);
4063
3780
  switch (elements_kind) {
@@ -4121,118 +3838,6 @@ void KeyedStoreStubCompiler::GenerateStoreExternalArray(
4121
3838
  }
4122
3839
 
4123
3840
 
4124
- void KeyedLoadStubCompiler::GenerateLoadFastElement(MacroAssembler* masm) {
4125
- // ----------- S t a t e -------------
4126
- // -- lr : return address
4127
- // -- r0 : key
4128
- // -- r1 : receiver
4129
- // -----------------------------------
4130
- Label miss_force_generic;
4131
-
4132
- // This stub is meant to be tail-jumped to, the receiver must already
4133
- // have been verified by the caller to not be a smi.
4134
-
4135
- // Check that the key is a smi or a heap number convertible to a smi.
4136
- GenerateSmiKeyCheck(masm, r0, r4, r5, d1, &miss_force_generic);
4137
-
4138
- // Get the elements array.
4139
- __ ldr(r2, FieldMemOperand(r1, JSObject::kElementsOffset));
4140
- __ AssertFastElements(r2);
4141
-
4142
- // Check that the key is within bounds.
4143
- __ ldr(r3, FieldMemOperand(r2, FixedArray::kLengthOffset));
4144
- __ cmp(r0, Operand(r3));
4145
- __ b(hs, &miss_force_generic);
4146
-
4147
- // Load the result and make sure it's not the hole.
4148
- __ add(r3, r2, Operand(FixedArray::kHeaderSize - kHeapObjectTag));
4149
- STATIC_ASSERT(kSmiTag == 0 && kSmiTagSize < kPointerSizeLog2);
4150
- __ ldr(r4,
4151
- MemOperand(r3, r0, LSL, kPointerSizeLog2 - kSmiTagSize));
4152
- __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
4153
- __ cmp(r4, ip);
4154
- __ b(eq, &miss_force_generic);
4155
- __ mov(r0, r4);
4156
- __ Ret();
4157
-
4158
- __ bind(&miss_force_generic);
4159
- Handle<Code> stub =
4160
- masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
4161
- __ Jump(stub, RelocInfo::CODE_TARGET);
4162
- }
4163
-
4164
-
4165
- void KeyedLoadStubCompiler::GenerateLoadFastDoubleElement(
4166
- MacroAssembler* masm) {
4167
- // ----------- S t a t e -------------
4168
- // -- lr : return address
4169
- // -- r0 : key
4170
- // -- r1 : receiver
4171
- // -----------------------------------
4172
- Label miss_force_generic, slow_allocate_heapnumber;
4173
-
4174
- Register key_reg = r0;
4175
- Register receiver_reg = r1;
4176
- Register elements_reg = r2;
4177
- Register heap_number_reg = r2;
4178
- Register indexed_double_offset = r3;
4179
- Register scratch = r4;
4180
- Register scratch2 = r5;
4181
- Register scratch3 = r6;
4182
- Register heap_number_map = r7;
4183
-
4184
- // This stub is meant to be tail-jumped to, the receiver must already
4185
- // have been verified by the caller to not be a smi.
4186
-
4187
- // Check that the key is a smi or a heap number convertible to a smi.
4188
- GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, &miss_force_generic);
4189
-
4190
- // Get the elements array.
4191
- __ ldr(elements_reg,
4192
- FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
4193
-
4194
- // Check that the key is within bounds.
4195
- __ ldr(scratch, FieldMemOperand(elements_reg, FixedArray::kLengthOffset));
4196
- __ cmp(key_reg, Operand(scratch));
4197
- __ b(hs, &miss_force_generic);
4198
-
4199
- // Load the upper word of the double in the fixed array and test for NaN.
4200
- __ add(indexed_double_offset, elements_reg,
4201
- Operand(key_reg, LSL, kDoubleSizeLog2 - kSmiTagSize));
4202
- uint32_t upper_32_offset = FixedArray::kHeaderSize + sizeof(kHoleNanLower32);
4203
- __ ldr(scratch, FieldMemOperand(indexed_double_offset, upper_32_offset));
4204
- __ cmp(scratch, Operand(kHoleNanUpper32));
4205
- __ b(&miss_force_generic, eq);
4206
-
4207
- // Non-NaN. Allocate a new heap number and copy the double value into it.
4208
- __ LoadRoot(heap_number_map, Heap::kHeapNumberMapRootIndex);
4209
- __ AllocateHeapNumber(heap_number_reg, scratch2, scratch3,
4210
- heap_number_map, &slow_allocate_heapnumber);
4211
-
4212
- // Don't need to reload the upper 32 bits of the double, it's already in
4213
- // scratch.
4214
- __ str(scratch, FieldMemOperand(heap_number_reg,
4215
- HeapNumber::kExponentOffset));
4216
- __ ldr(scratch, FieldMemOperand(indexed_double_offset,
4217
- FixedArray::kHeaderSize));
4218
- __ str(scratch, FieldMemOperand(heap_number_reg,
4219
- HeapNumber::kMantissaOffset));
4220
-
4221
- __ mov(r0, heap_number_reg);
4222
- __ Ret();
4223
-
4224
- __ bind(&slow_allocate_heapnumber);
4225
- Handle<Code> slow_ic =
4226
- masm->isolate()->builtins()->KeyedLoadIC_Slow();
4227
- __ Jump(slow_ic, RelocInfo::CODE_TARGET);
4228
-
4229
- __ bind(&miss_force_generic);
4230
- Handle<Code> miss_ic =
4231
- masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric();
4232
- __ Jump(miss_ic, RelocInfo::CODE_TARGET);
4233
- }
4234
-
4235
-
4236
3841
  void KeyedStoreStubCompiler::GenerateStoreFastElement(
4237
3842
  MacroAssembler* masm,
4238
3843
  bool is_js_array,
@@ -4261,7 +3866,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastElement(
4261
3866
  // have been verified by the caller to not be a smi.
4262
3867
 
4263
3868
  // Check that the key is a smi or a heap number convertible to a smi.
4264
- GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, &miss_force_generic);
3869
+ GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, d2, &miss_force_generic);
4265
3870
 
4266
3871
  if (IsFastSmiElementsKind(elements_kind)) {
4267
3872
  __ JumpIfNotSmi(value_reg, &transition_elements_kind);
@@ -4408,9 +4013,12 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4408
4013
  // -- r1 : key
4409
4014
  // -- r2 : receiver
4410
4015
  // -- lr : return address
4411
- // -- r3 : scratch
4016
+ // -- r3 : scratch (elements backing store)
4412
4017
  // -- r4 : scratch
4413
4018
  // -- r5 : scratch
4019
+ // -- r6 : scratch
4020
+ // -- r7 : scratch
4021
+ // -- r9 : scratch
4414
4022
  // -----------------------------------
4415
4023
  Label miss_force_generic, transition_elements_kind, grow, slow;
4416
4024
  Label finish_store, check_capacity;
@@ -4423,13 +4031,14 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4423
4031
  Register scratch2 = r5;
4424
4032
  Register scratch3 = r6;
4425
4033
  Register scratch4 = r7;
4034
+ Register scratch5 = r9;
4426
4035
  Register length_reg = r7;
4427
4036
 
4428
4037
  // This stub is meant to be tail-jumped to, the receiver must already
4429
4038
  // have been verified by the caller to not be a smi.
4430
4039
 
4431
4040
  // Check that the key is a smi or a heap number convertible to a smi.
4432
- GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, &miss_force_generic);
4041
+ GenerateSmiKeyCheck(masm, key_reg, r4, r5, d1, d2, &miss_force_generic);
4433
4042
 
4434
4043
  __ ldr(elements_reg,
4435
4044
  FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
@@ -4453,7 +4062,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4453
4062
  __ bind(&finish_store);
4454
4063
  __ StoreNumberToDoubleElements(value_reg,
4455
4064
  key_reg,
4456
- receiver_reg,
4065
+ // All registers after this are overwritten.
4457
4066
  elements_reg,
4458
4067
  scratch1,
4459
4068
  scratch2,
@@ -4501,8 +4110,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4501
4110
  __ AllocateInNewSpace(size, elements_reg, scratch1, scratch2, &slow,
4502
4111
  TAG_OBJECT);
4503
4112
 
4504
- // Initialize the new FixedDoubleArray. Leave elements unitialized for
4505
- // efficiency, they are guaranteed to be initialized before use.
4113
+ // Initialize the new FixedDoubleArray.
4506
4114
  __ LoadRoot(scratch1, Heap::kFixedDoubleArrayMapRootIndex);
4507
4115
  __ str(scratch1, FieldMemOperand(elements_reg, JSObject::kMapOffset));
4508
4116
  __ mov(scratch1,
@@ -4510,6 +4118,25 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4510
4118
  __ str(scratch1,
4511
4119
  FieldMemOperand(elements_reg, FixedDoubleArray::kLengthOffset));
4512
4120
 
4121
+ __ mov(scratch1, elements_reg);
4122
+ __ StoreNumberToDoubleElements(value_reg,
4123
+ key_reg,
4124
+ // All registers after this are overwritten.
4125
+ scratch1,
4126
+ scratch2,
4127
+ scratch3,
4128
+ scratch4,
4129
+ scratch5,
4130
+ &transition_elements_kind);
4131
+
4132
+ __ mov(scratch1, Operand(kHoleNanLower32));
4133
+ __ mov(scratch2, Operand(kHoleNanUpper32));
4134
+ for (int i = 1; i < JSArray::kPreallocatedArrayElements; i++) {
4135
+ int offset = FixedDoubleArray::OffsetOfElementAt(i);
4136
+ __ str(scratch1, FieldMemOperand(elements_reg, offset));
4137
+ __ str(scratch2, FieldMemOperand(elements_reg, offset + kPointerSize));
4138
+ }
4139
+
4513
4140
  // Install the new backing store in the JSArray.
4514
4141
  __ str(elements_reg,
4515
4142
  FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
@@ -4522,7 +4149,7 @@ void KeyedStoreStubCompiler::GenerateStoreFastDoubleElement(
4522
4149
  __ str(length_reg, FieldMemOperand(receiver_reg, JSArray::kLengthOffset));
4523
4150
  __ ldr(elements_reg,
4524
4151
  FieldMemOperand(receiver_reg, JSObject::kElementsOffset));
4525
- __ jmp(&finish_store);
4152
+ __ Ret();
4526
4153
 
4527
4154
  __ bind(&check_capacity);
4528
4155
  // Make sure that the backing store can hold additional elements.