mustang 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (560) hide show
  1. data/.rspec +1 -0
  2. data/Isolate +9 -0
  3. data/README.md +6 -12
  4. data/Rakefile +30 -4
  5. data/TODO.md +9 -0
  6. data/ext/v8/extconf.rb +56 -0
  7. data/ext/v8/v8.cpp +37 -0
  8. data/ext/v8/v8_array.cpp +161 -0
  9. data/ext/v8/v8_array.h +17 -0
  10. data/ext/v8/v8_base.cpp +147 -0
  11. data/ext/v8/v8_base.h +23 -0
  12. data/ext/v8/v8_cast.cpp +151 -0
  13. data/ext/v8/v8_cast.h +64 -0
  14. data/ext/v8/v8_context.cpp +174 -0
  15. data/ext/v8/v8_context.h +12 -0
  16. data/ext/v8/v8_date.cpp +61 -0
  17. data/ext/v8/v8_date.h +16 -0
  18. data/ext/v8/v8_errors.cpp +147 -0
  19. data/ext/v8/v8_errors.h +19 -0
  20. data/ext/v8/v8_external.cpp +66 -0
  21. data/ext/v8/v8_external.h +16 -0
  22. data/ext/v8/v8_function.cpp +182 -0
  23. data/ext/v8/v8_function.h +14 -0
  24. data/ext/v8/v8_integer.cpp +70 -0
  25. data/ext/v8/v8_integer.h +16 -0
  26. data/ext/v8/v8_macros.h +30 -0
  27. data/ext/v8/v8_main.cpp +53 -0
  28. data/ext/v8/v8_main.h +13 -0
  29. data/ext/v8/v8_number.cpp +62 -0
  30. data/ext/v8/v8_number.h +16 -0
  31. data/ext/v8/v8_object.cpp +172 -0
  32. data/ext/v8/v8_object.h +17 -0
  33. data/ext/v8/v8_ref.cpp +72 -0
  34. data/ext/v8/v8_ref.h +43 -0
  35. data/ext/v8/v8_regexp.cpp +148 -0
  36. data/ext/v8/v8_regexp.h +16 -0
  37. data/ext/v8/v8_string.cpp +78 -0
  38. data/ext/v8/v8_string.h +16 -0
  39. data/ext/v8/v8_value.cpp +370 -0
  40. data/ext/v8/v8_value.h +19 -0
  41. data/gemspec.yml +2 -1
  42. data/lib/core_ext/class.rb +14 -0
  43. data/lib/core_ext/object.rb +12 -0
  44. data/lib/core_ext/symbol.rb +23 -0
  45. data/lib/mustang.rb +44 -0
  46. data/lib/mustang/context.rb +69 -0
  47. data/lib/mustang/errors.rb +36 -0
  48. data/lib/support/delegated.rb +25 -0
  49. data/lib/v8/array.rb +21 -0
  50. data/lib/v8/context.rb +13 -0
  51. data/lib/v8/date.rb +20 -0
  52. data/lib/v8/error.rb +15 -0
  53. data/lib/v8/external.rb +16 -0
  54. data/lib/v8/function.rb +11 -0
  55. data/lib/v8/integer.rb +16 -0
  56. data/lib/v8/number.rb +16 -0
  57. data/lib/v8/object.rb +66 -0
  58. data/lib/v8/regexp.rb +23 -0
  59. data/lib/v8/string.rb +27 -0
  60. data/mustang.gemspec +3 -0
  61. data/spec/core_ext/class_spec.rb +19 -0
  62. data/spec/core_ext/object_spec.rb +19 -0
  63. data/spec/core_ext/symbol_spec.rb +27 -0
  64. data/spec/fixtures/test1.js +2 -0
  65. data/spec/fixtures/test2.js +2 -0
  66. data/spec/spec_helper.rb +20 -0
  67. data/spec/v8/array_spec.rb +88 -0
  68. data/spec/v8/cast_spec.rb +151 -0
  69. data/spec/v8/context_spec.rb +78 -0
  70. data/spec/v8/data_spec.rb +39 -0
  71. data/spec/v8/date_spec.rb +45 -0
  72. data/spec/v8/empty_spec.rb +27 -0
  73. data/spec/v8/errors_spec.rb +142 -0
  74. data/spec/v8/external_spec.rb +44 -0
  75. data/spec/v8/function_spec.rb +170 -0
  76. data/spec/v8/integer_spec.rb +41 -0
  77. data/spec/v8/main_spec.rb +18 -0
  78. data/spec/v8/null_spec.rb +27 -0
  79. data/spec/v8/number_spec.rb +40 -0
  80. data/spec/v8/object_spec.rb +79 -0
  81. data/spec/v8/primitive_spec.rb +9 -0
  82. data/spec/v8/regexp_spec.rb +65 -0
  83. data/spec/v8/string_spec.rb +48 -0
  84. data/spec/v8/undefined_spec.rb +27 -0
  85. data/spec/v8/value_spec.rb +215 -0
  86. data/vendor/v8/.gitignore +2 -0
  87. data/vendor/v8/AUTHORS +3 -1
  88. data/vendor/v8/ChangeLog +117 -0
  89. data/vendor/v8/SConstruct +334 -53
  90. data/vendor/v8/include/v8-debug.h +21 -11
  91. data/vendor/v8/include/v8-preparser.h +1 -1
  92. data/vendor/v8/include/v8-profiler.h +122 -43
  93. data/vendor/v8/include/v8-testing.h +5 -0
  94. data/vendor/v8/include/v8.h +171 -17
  95. data/vendor/v8/preparser/SConscript +38 -0
  96. data/vendor/v8/preparser/preparser-process.cc +77 -114
  97. data/vendor/v8/samples/shell.cc +232 -46
  98. data/vendor/v8/src/SConscript +29 -5
  99. data/vendor/v8/src/accessors.cc +70 -211
  100. data/vendor/v8/{test/cctest/test-mips.cc → src/allocation-inl.h} +15 -18
  101. data/vendor/v8/src/allocation.cc +0 -82
  102. data/vendor/v8/src/allocation.h +9 -42
  103. data/vendor/v8/src/api.cc +1645 -1156
  104. data/vendor/v8/src/api.h +76 -12
  105. data/vendor/v8/src/apiutils.h +0 -7
  106. data/vendor/v8/src/arguments.h +15 -4
  107. data/vendor/v8/src/arm/assembler-arm-inl.h +10 -9
  108. data/vendor/v8/src/arm/assembler-arm.cc +62 -23
  109. data/vendor/v8/src/arm/assembler-arm.h +76 -11
  110. data/vendor/v8/src/arm/builtins-arm.cc +39 -33
  111. data/vendor/v8/src/arm/code-stubs-arm.cc +1182 -402
  112. data/vendor/v8/src/arm/code-stubs-arm.h +20 -54
  113. data/vendor/v8/src/arm/codegen-arm.cc +159 -106
  114. data/vendor/v8/src/arm/codegen-arm.h +6 -6
  115. data/vendor/v8/src/arm/constants-arm.h +16 -1
  116. data/vendor/v8/src/arm/cpu-arm.cc +7 -5
  117. data/vendor/v8/src/arm/debug-arm.cc +6 -4
  118. data/vendor/v8/src/arm/deoptimizer-arm.cc +51 -14
  119. data/vendor/v8/src/arm/disasm-arm.cc +47 -15
  120. data/vendor/v8/src/arm/frames-arm.h +1 -1
  121. data/vendor/v8/src/arm/full-codegen-arm.cc +724 -408
  122. data/vendor/v8/src/arm/ic-arm.cc +90 -85
  123. data/vendor/v8/src/arm/lithium-arm.cc +140 -69
  124. data/vendor/v8/src/arm/lithium-arm.h +161 -46
  125. data/vendor/v8/src/arm/lithium-codegen-arm.cc +567 -297
  126. data/vendor/v8/src/arm/lithium-codegen-arm.h +21 -9
  127. data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +2 -0
  128. data/vendor/v8/src/arm/macro-assembler-arm.cc +457 -96
  129. data/vendor/v8/src/arm/macro-assembler-arm.h +115 -18
  130. data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +20 -13
  131. data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +1 -0
  132. data/vendor/v8/src/arm/simulator-arm.cc +184 -101
  133. data/vendor/v8/src/arm/simulator-arm.h +26 -21
  134. data/vendor/v8/src/arm/stub-cache-arm.cc +450 -467
  135. data/vendor/v8/src/arm/virtual-frame-arm.cc +14 -12
  136. data/vendor/v8/src/arm/virtual-frame-arm.h +11 -8
  137. data/vendor/v8/src/array.js +35 -18
  138. data/vendor/v8/src/assembler.cc +186 -92
  139. data/vendor/v8/src/assembler.h +106 -69
  140. data/vendor/v8/src/ast-inl.h +5 -0
  141. data/vendor/v8/src/ast.cc +46 -35
  142. data/vendor/v8/src/ast.h +107 -50
  143. data/vendor/v8/src/atomicops.h +2 -0
  144. data/vendor/v8/src/atomicops_internals_mips_gcc.h +169 -0
  145. data/vendor/v8/src/bootstrapper.cc +649 -399
  146. data/vendor/v8/src/bootstrapper.h +94 -27
  147. data/vendor/v8/src/builtins.cc +359 -227
  148. data/vendor/v8/src/builtins.h +157 -123
  149. data/vendor/v8/src/checks.cc +2 -2
  150. data/vendor/v8/src/checks.h +4 -0
  151. data/vendor/v8/src/code-stubs.cc +27 -17
  152. data/vendor/v8/src/code-stubs.h +38 -17
  153. data/vendor/v8/src/codegen-inl.h +5 -1
  154. data/vendor/v8/src/codegen.cc +27 -17
  155. data/vendor/v8/src/codegen.h +9 -9
  156. data/vendor/v8/src/compilation-cache.cc +92 -206
  157. data/vendor/v8/src/compilation-cache.h +205 -30
  158. data/vendor/v8/src/compiler.cc +107 -120
  159. data/vendor/v8/src/compiler.h +17 -2
  160. data/vendor/v8/src/contexts.cc +22 -15
  161. data/vendor/v8/src/contexts.h +14 -8
  162. data/vendor/v8/src/conversions.cc +86 -30
  163. data/vendor/v8/src/counters.cc +19 -4
  164. data/vendor/v8/src/counters.h +28 -16
  165. data/vendor/v8/src/cpu-profiler-inl.h +4 -3
  166. data/vendor/v8/src/cpu-profiler.cc +123 -72
  167. data/vendor/v8/src/cpu-profiler.h +33 -19
  168. data/vendor/v8/src/cpu.h +2 -0
  169. data/vendor/v8/src/d8-debug.cc +3 -3
  170. data/vendor/v8/src/d8-debug.h +7 -6
  171. data/vendor/v8/src/d8-posix.cc +2 -0
  172. data/vendor/v8/src/d8.cc +22 -12
  173. data/vendor/v8/src/d8.gyp +3 -0
  174. data/vendor/v8/src/d8.js +618 -0
  175. data/vendor/v8/src/data-flow.h +3 -3
  176. data/vendor/v8/src/dateparser.h +4 -2
  177. data/vendor/v8/src/debug-agent.cc +10 -9
  178. data/vendor/v8/src/debug-agent.h +9 -11
  179. data/vendor/v8/src/debug-debugger.js +121 -0
  180. data/vendor/v8/src/debug.cc +331 -227
  181. data/vendor/v8/src/debug.h +248 -219
  182. data/vendor/v8/src/deoptimizer.cc +173 -62
  183. data/vendor/v8/src/deoptimizer.h +119 -19
  184. data/vendor/v8/src/disasm.h +3 -0
  185. data/vendor/v8/src/disassembler.cc +10 -9
  186. data/vendor/v8/src/execution.cc +185 -129
  187. data/vendor/v8/src/execution.h +47 -78
  188. data/vendor/v8/src/extensions/experimental/break-iterator.cc +250 -0
  189. data/vendor/v8/src/extensions/experimental/break-iterator.h +89 -0
  190. data/vendor/v8/src/extensions/experimental/experimental.gyp +2 -0
  191. data/vendor/v8/src/extensions/experimental/i18n-extension.cc +22 -2
  192. data/vendor/v8/src/extensions/externalize-string-extension.cc +2 -2
  193. data/vendor/v8/src/extensions/gc-extension.cc +1 -1
  194. data/vendor/v8/src/factory.cc +261 -154
  195. data/vendor/v8/src/factory.h +162 -158
  196. data/vendor/v8/src/flag-definitions.h +17 -11
  197. data/vendor/v8/src/frame-element.cc +0 -5
  198. data/vendor/v8/src/frame-element.h +9 -13
  199. data/vendor/v8/src/frames-inl.h +7 -0
  200. data/vendor/v8/src/frames.cc +56 -46
  201. data/vendor/v8/src/frames.h +36 -25
  202. data/vendor/v8/src/full-codegen.cc +15 -24
  203. data/vendor/v8/src/full-codegen.h +13 -41
  204. data/vendor/v8/src/func-name-inferrer.cc +7 -6
  205. data/vendor/v8/src/func-name-inferrer.h +1 -1
  206. data/vendor/v8/src/gdb-jit.cc +1 -0
  207. data/vendor/v8/src/global-handles.cc +118 -56
  208. data/vendor/v8/src/global-handles.h +98 -40
  209. data/vendor/v8/src/globals.h +2 -2
  210. data/vendor/v8/src/handles-inl.h +106 -9
  211. data/vendor/v8/src/handles.cc +220 -157
  212. data/vendor/v8/src/handles.h +38 -59
  213. data/vendor/v8/src/hashmap.h +3 -3
  214. data/vendor/v8/src/heap-inl.h +141 -25
  215. data/vendor/v8/src/heap-profiler.cc +117 -63
  216. data/vendor/v8/src/heap-profiler.h +38 -21
  217. data/vendor/v8/src/heap.cc +805 -564
  218. data/vendor/v8/src/heap.h +640 -594
  219. data/vendor/v8/src/hydrogen-instructions.cc +216 -73
  220. data/vendor/v8/src/hydrogen-instructions.h +259 -124
  221. data/vendor/v8/src/hydrogen.cc +996 -1171
  222. data/vendor/v8/src/hydrogen.h +163 -144
  223. data/vendor/v8/src/ia32/assembler-ia32-inl.h +12 -11
  224. data/vendor/v8/src/ia32/assembler-ia32.cc +85 -39
  225. data/vendor/v8/src/ia32/assembler-ia32.h +82 -16
  226. data/vendor/v8/src/ia32/builtins-ia32.cc +64 -58
  227. data/vendor/v8/src/ia32/code-stubs-ia32.cc +248 -324
  228. data/vendor/v8/src/ia32/code-stubs-ia32.h +3 -44
  229. data/vendor/v8/src/ia32/codegen-ia32.cc +217 -165
  230. data/vendor/v8/src/ia32/codegen-ia32.h +3 -0
  231. data/vendor/v8/src/ia32/cpu-ia32.cc +6 -5
  232. data/vendor/v8/src/ia32/debug-ia32.cc +8 -5
  233. data/vendor/v8/src/ia32/deoptimizer-ia32.cc +124 -14
  234. data/vendor/v8/src/ia32/disasm-ia32.cc +85 -62
  235. data/vendor/v8/src/ia32/frames-ia32.h +1 -1
  236. data/vendor/v8/src/ia32/full-codegen-ia32.cc +348 -435
  237. data/vendor/v8/src/ia32/ic-ia32.cc +91 -91
  238. data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +500 -255
  239. data/vendor/v8/src/ia32/lithium-codegen-ia32.h +13 -4
  240. data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +6 -0
  241. data/vendor/v8/src/ia32/lithium-ia32.cc +122 -45
  242. data/vendor/v8/src/ia32/lithium-ia32.h +128 -41
  243. data/vendor/v8/src/ia32/macro-assembler-ia32.cc +109 -84
  244. data/vendor/v8/src/ia32/macro-assembler-ia32.h +18 -9
  245. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +26 -15
  246. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +1 -0
  247. data/vendor/v8/src/ia32/register-allocator-ia32.cc +30 -30
  248. data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
  249. data/vendor/v8/src/ia32/stub-cache-ia32.cc +383 -400
  250. data/vendor/v8/src/ia32/virtual-frame-ia32.cc +36 -13
  251. data/vendor/v8/src/ia32/virtual-frame-ia32.h +11 -5
  252. data/vendor/v8/src/ic-inl.h +12 -2
  253. data/vendor/v8/src/ic.cc +304 -221
  254. data/vendor/v8/src/ic.h +115 -58
  255. data/vendor/v8/src/interpreter-irregexp.cc +25 -21
  256. data/vendor/v8/src/interpreter-irregexp.h +2 -1
  257. data/vendor/v8/src/isolate.cc +883 -0
  258. data/vendor/v8/src/isolate.h +1304 -0
  259. data/vendor/v8/src/json.js +10 -10
  260. data/vendor/v8/src/jsregexp.cc +111 -80
  261. data/vendor/v8/src/jsregexp.h +6 -7
  262. data/vendor/v8/src/jump-target-heavy.cc +5 -8
  263. data/vendor/v8/src/jump-target-heavy.h +0 -6
  264. data/vendor/v8/src/jump-target-inl.h +1 -1
  265. data/vendor/v8/src/jump-target-light.cc +3 -3
  266. data/vendor/v8/src/lithium-allocator-inl.h +2 -0
  267. data/vendor/v8/src/lithium-allocator.cc +42 -30
  268. data/vendor/v8/src/lithium-allocator.h +8 -22
  269. data/vendor/v8/src/lithium.cc +1 -0
  270. data/vendor/v8/src/liveedit.cc +141 -99
  271. data/vendor/v8/src/liveedit.h +7 -2
  272. data/vendor/v8/src/liveobjectlist-inl.h +90 -0
  273. data/vendor/v8/src/liveobjectlist.cc +2537 -1
  274. data/vendor/v8/src/liveobjectlist.h +245 -35
  275. data/vendor/v8/src/log-utils.cc +122 -35
  276. data/vendor/v8/src/log-utils.h +33 -36
  277. data/vendor/v8/src/log.cc +299 -241
  278. data/vendor/v8/src/log.h +177 -110
  279. data/vendor/v8/src/mark-compact.cc +612 -470
  280. data/vendor/v8/src/mark-compact.h +153 -80
  281. data/vendor/v8/src/messages.cc +16 -14
  282. data/vendor/v8/src/messages.js +30 -7
  283. data/vendor/v8/src/mips/assembler-mips-inl.h +155 -35
  284. data/vendor/v8/src/mips/assembler-mips.cc +1093 -219
  285. data/vendor/v8/src/mips/assembler-mips.h +552 -153
  286. data/vendor/v8/src/mips/builtins-mips.cc +43 -100
  287. data/vendor/v8/src/mips/code-stubs-mips.cc +752 -0
  288. data/vendor/v8/src/mips/code-stubs-mips.h +511 -0
  289. data/vendor/v8/src/mips/codegen-mips-inl.h +8 -14
  290. data/vendor/v8/src/mips/codegen-mips.cc +672 -896
  291. data/vendor/v8/src/mips/codegen-mips.h +271 -69
  292. data/vendor/v8/src/mips/constants-mips.cc +44 -20
  293. data/vendor/v8/src/mips/constants-mips.h +238 -40
  294. data/vendor/v8/src/mips/cpu-mips.cc +20 -3
  295. data/vendor/v8/src/mips/debug-mips.cc +35 -7
  296. data/vendor/v8/src/mips/deoptimizer-mips.cc +91 -0
  297. data/vendor/v8/src/mips/disasm-mips.cc +329 -93
  298. data/vendor/v8/src/mips/frames-mips.cc +2 -50
  299. data/vendor/v8/src/mips/frames-mips.h +24 -9
  300. data/vendor/v8/src/mips/full-codegen-mips.cc +473 -23
  301. data/vendor/v8/src/mips/ic-mips.cc +81 -45
  302. data/vendor/v8/src/mips/jump-target-mips.cc +11 -106
  303. data/vendor/v8/src/mips/lithium-codegen-mips.h +65 -0
  304. data/vendor/v8/src/mips/lithium-mips.h +304 -0
  305. data/vendor/v8/src/mips/macro-assembler-mips.cc +2391 -390
  306. data/vendor/v8/src/mips/macro-assembler-mips.h +718 -121
  307. data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
  308. data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
  309. data/vendor/v8/src/mips/register-allocator-mips-inl.h +0 -3
  310. data/vendor/v8/src/mips/register-allocator-mips.h +3 -2
  311. data/vendor/v8/src/mips/simulator-mips.cc +1009 -221
  312. data/vendor/v8/src/mips/simulator-mips.h +119 -36
  313. data/vendor/v8/src/mips/stub-cache-mips.cc +331 -148
  314. data/vendor/v8/src/mips/{fast-codegen-mips.cc → virtual-frame-mips-inl.h} +11 -30
  315. data/vendor/v8/src/mips/virtual-frame-mips.cc +137 -149
  316. data/vendor/v8/src/mips/virtual-frame-mips.h +294 -312
  317. data/vendor/v8/src/mirror-debugger.js +9 -8
  318. data/vendor/v8/src/mksnapshot.cc +2 -2
  319. data/vendor/v8/src/objects-debug.cc +16 -16
  320. data/vendor/v8/src/objects-inl.h +421 -195
  321. data/vendor/v8/src/objects-printer.cc +7 -7
  322. data/vendor/v8/src/objects-visiting.cc +1 -1
  323. data/vendor/v8/src/objects-visiting.h +33 -12
  324. data/vendor/v8/src/objects.cc +935 -658
  325. data/vendor/v8/src/objects.h +234 -139
  326. data/vendor/v8/src/parser.cc +484 -439
  327. data/vendor/v8/src/parser.h +35 -14
  328. data/vendor/v8/src/platform-cygwin.cc +173 -107
  329. data/vendor/v8/src/platform-freebsd.cc +224 -72
  330. data/vendor/v8/src/platform-linux.cc +234 -95
  331. data/vendor/v8/src/platform-macos.cc +215 -82
  332. data/vendor/v8/src/platform-nullos.cc +9 -3
  333. data/vendor/v8/src/platform-openbsd.cc +22 -7
  334. data/vendor/v8/src/platform-posix.cc +30 -5
  335. data/vendor/v8/src/platform-solaris.cc +120 -38
  336. data/vendor/v8/src/platform-tls-mac.h +62 -0
  337. data/vendor/v8/src/platform-tls-win32.h +62 -0
  338. data/vendor/v8/src/platform-tls.h +50 -0
  339. data/vendor/v8/src/platform-win32.cc +195 -97
  340. data/vendor/v8/src/platform.h +72 -15
  341. data/vendor/v8/src/preparse-data.cc +2 -0
  342. data/vendor/v8/src/preparser-api.cc +8 -2
  343. data/vendor/v8/src/preparser.cc +1 -1
  344. data/vendor/v8/src/prettyprinter.cc +43 -52
  345. data/vendor/v8/src/prettyprinter.h +1 -1
  346. data/vendor/v8/src/profile-generator-inl.h +0 -28
  347. data/vendor/v8/src/profile-generator.cc +942 -685
  348. data/vendor/v8/src/profile-generator.h +210 -176
  349. data/vendor/v8/src/property.cc +6 -0
  350. data/vendor/v8/src/property.h +14 -3
  351. data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +1 -1
  352. data/vendor/v8/src/regexp-macro-assembler.cc +28 -19
  353. data/vendor/v8/src/regexp-macro-assembler.h +11 -6
  354. data/vendor/v8/src/regexp-stack.cc +18 -10
  355. data/vendor/v8/src/regexp-stack.h +45 -21
  356. data/vendor/v8/src/regexp.js +3 -3
  357. data/vendor/v8/src/register-allocator-inl.h +3 -3
  358. data/vendor/v8/src/register-allocator.cc +1 -7
  359. data/vendor/v8/src/register-allocator.h +5 -15
  360. data/vendor/v8/src/rewriter.cc +2 -1
  361. data/vendor/v8/src/runtime-profiler.cc +158 -128
  362. data/vendor/v8/src/runtime-profiler.h +131 -15
  363. data/vendor/v8/src/runtime.cc +2409 -1692
  364. data/vendor/v8/src/runtime.h +93 -17
  365. data/vendor/v8/src/safepoint-table.cc +3 -0
  366. data/vendor/v8/src/safepoint-table.h +9 -3
  367. data/vendor/v8/src/scanner-base.cc +21 -28
  368. data/vendor/v8/src/scanner-base.h +22 -11
  369. data/vendor/v8/src/scanner.cc +3 -5
  370. data/vendor/v8/src/scanner.h +4 -2
  371. data/vendor/v8/src/scopeinfo.cc +11 -16
  372. data/vendor/v8/src/scopeinfo.h +26 -15
  373. data/vendor/v8/src/scopes.cc +67 -37
  374. data/vendor/v8/src/scopes.h +26 -12
  375. data/vendor/v8/src/serialize.cc +193 -154
  376. data/vendor/v8/src/serialize.h +41 -36
  377. data/vendor/v8/src/small-pointer-list.h +163 -0
  378. data/vendor/v8/src/snapshot-common.cc +1 -1
  379. data/vendor/v8/src/snapshot.h +3 -1
  380. data/vendor/v8/src/spaces-inl.h +30 -25
  381. data/vendor/v8/src/spaces.cc +263 -370
  382. data/vendor/v8/src/spaces.h +178 -166
  383. data/vendor/v8/src/string-search.cc +4 -3
  384. data/vendor/v8/src/string-search.h +21 -20
  385. data/vendor/v8/src/string-stream.cc +32 -24
  386. data/vendor/v8/src/string.js +7 -7
  387. data/vendor/v8/src/stub-cache.cc +324 -248
  388. data/vendor/v8/src/stub-cache.h +181 -155
  389. data/vendor/v8/src/token.cc +3 -3
  390. data/vendor/v8/src/token.h +3 -3
  391. data/vendor/v8/src/top.cc +218 -390
  392. data/vendor/v8/src/type-info.cc +98 -32
  393. data/vendor/v8/src/type-info.h +10 -3
  394. data/vendor/v8/src/unicode.cc +1 -1
  395. data/vendor/v8/src/unicode.h +1 -1
  396. data/vendor/v8/src/utils.h +3 -0
  397. data/vendor/v8/src/v8-counters.cc +18 -11
  398. data/vendor/v8/src/v8-counters.h +34 -13
  399. data/vendor/v8/src/v8.cc +66 -121
  400. data/vendor/v8/src/v8.h +7 -4
  401. data/vendor/v8/src/v8globals.h +18 -12
  402. data/vendor/v8/src/{memory.h → v8memory.h} +0 -0
  403. data/vendor/v8/src/v8natives.js +59 -18
  404. data/vendor/v8/src/v8threads.cc +127 -114
  405. data/vendor/v8/src/v8threads.h +42 -35
  406. data/vendor/v8/src/v8utils.h +2 -39
  407. data/vendor/v8/src/variables.h +1 -1
  408. data/vendor/v8/src/version.cc +26 -5
  409. data/vendor/v8/src/version.h +4 -0
  410. data/vendor/v8/src/virtual-frame-heavy-inl.h +2 -4
  411. data/vendor/v8/src/virtual-frame-light-inl.h +5 -4
  412. data/vendor/v8/src/vm-state-inl.h +21 -17
  413. data/vendor/v8/src/vm-state.h +7 -5
  414. data/vendor/v8/src/win32-headers.h +1 -0
  415. data/vendor/v8/src/x64/assembler-x64-inl.h +12 -11
  416. data/vendor/v8/src/x64/assembler-x64.cc +80 -40
  417. data/vendor/v8/src/x64/assembler-x64.h +67 -17
  418. data/vendor/v8/src/x64/builtins-x64.cc +34 -33
  419. data/vendor/v8/src/x64/code-stubs-x64.cc +636 -377
  420. data/vendor/v8/src/x64/code-stubs-x64.h +14 -48
  421. data/vendor/v8/src/x64/codegen-x64-inl.h +1 -1
  422. data/vendor/v8/src/x64/codegen-x64.cc +158 -136
  423. data/vendor/v8/src/x64/codegen-x64.h +4 -1
  424. data/vendor/v8/src/x64/cpu-x64.cc +7 -5
  425. data/vendor/v8/src/x64/debug-x64.cc +8 -6
  426. data/vendor/v8/src/x64/deoptimizer-x64.cc +195 -20
  427. data/vendor/v8/src/x64/disasm-x64.cc +42 -23
  428. data/vendor/v8/src/x64/frames-x64.cc +1 -1
  429. data/vendor/v8/src/x64/frames-x64.h +2 -2
  430. data/vendor/v8/src/x64/full-codegen-x64.cc +780 -218
  431. data/vendor/v8/src/x64/ic-x64.cc +77 -79
  432. data/vendor/v8/src/x64/jump-target-x64.cc +1 -1
  433. data/vendor/v8/src/x64/lithium-codegen-x64.cc +698 -181
  434. data/vendor/v8/src/x64/lithium-codegen-x64.h +31 -6
  435. data/vendor/v8/src/x64/lithium-x64.cc +136 -54
  436. data/vendor/v8/src/x64/lithium-x64.h +142 -51
  437. data/vendor/v8/src/x64/macro-assembler-x64.cc +456 -187
  438. data/vendor/v8/src/x64/macro-assembler-x64.h +166 -34
  439. data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +44 -28
  440. data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +8 -4
  441. data/vendor/v8/src/x64/register-allocator-x64-inl.h +3 -3
  442. data/vendor/v8/src/x64/register-allocator-x64.cc +12 -8
  443. data/vendor/v8/src/x64/simulator-x64.h +5 -5
  444. data/vendor/v8/src/x64/stub-cache-x64.cc +299 -344
  445. data/vendor/v8/src/x64/virtual-frame-x64.cc +37 -13
  446. data/vendor/v8/src/x64/virtual-frame-x64.h +13 -7
  447. data/vendor/v8/src/zone-inl.h +49 -3
  448. data/vendor/v8/src/zone.cc +42 -41
  449. data/vendor/v8/src/zone.h +37 -34
  450. data/vendor/v8/test/benchmarks/testcfg.py +100 -0
  451. data/vendor/v8/test/cctest/SConscript +5 -4
  452. data/vendor/v8/test/cctest/cctest.h +3 -2
  453. data/vendor/v8/test/cctest/cctest.status +6 -11
  454. data/vendor/v8/test/cctest/test-accessors.cc +3 -3
  455. data/vendor/v8/test/cctest/test-alloc.cc +39 -33
  456. data/vendor/v8/test/cctest/test-api.cc +1092 -205
  457. data/vendor/v8/test/cctest/test-assembler-arm.cc +39 -25
  458. data/vendor/v8/test/cctest/test-assembler-ia32.cc +36 -37
  459. data/vendor/v8/test/cctest/test-assembler-mips.cc +1098 -40
  460. data/vendor/v8/test/cctest/test-assembler-x64.cc +32 -25
  461. data/vendor/v8/test/cctest/test-ast.cc +1 -0
  462. data/vendor/v8/test/cctest/test-circular-queue.cc +8 -5
  463. data/vendor/v8/test/cctest/test-compiler.cc +24 -24
  464. data/vendor/v8/test/cctest/test-cpu-profiler.cc +140 -5
  465. data/vendor/v8/test/cctest/test-dataflow.cc +1 -0
  466. data/vendor/v8/test/cctest/test-debug.cc +136 -77
  467. data/vendor/v8/test/cctest/test-decls.cc +1 -1
  468. data/vendor/v8/test/cctest/test-deoptimization.cc +25 -24
  469. data/vendor/v8/test/cctest/test-disasm-arm.cc +9 -4
  470. data/vendor/v8/test/cctest/test-disasm-ia32.cc +10 -8
  471. data/vendor/v8/test/cctest/test-func-name-inference.cc +10 -4
  472. data/vendor/v8/test/cctest/test-heap-profiler.cc +226 -164
  473. data/vendor/v8/test/cctest/test-heap.cc +240 -217
  474. data/vendor/v8/test/cctest/test-liveedit.cc +1 -0
  475. data/vendor/v8/test/cctest/test-log-stack-tracer.cc +18 -20
  476. data/vendor/v8/test/cctest/test-log.cc +114 -108
  477. data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +247 -177
  478. data/vendor/v8/test/cctest/test-mark-compact.cc +129 -90
  479. data/vendor/v8/test/cctest/test-parsing.cc +15 -14
  480. data/vendor/v8/test/cctest/test-platform-linux.cc +1 -0
  481. data/vendor/v8/test/cctest/test-platform-tls.cc +66 -0
  482. data/vendor/v8/test/cctest/test-platform-win32.cc +1 -0
  483. data/vendor/v8/test/cctest/test-profile-generator.cc +1 -1
  484. data/vendor/v8/test/cctest/test-regexp.cc +53 -41
  485. data/vendor/v8/test/cctest/test-reloc-info.cc +18 -11
  486. data/vendor/v8/test/cctest/test-serialize.cc +44 -43
  487. data/vendor/v8/test/cctest/test-sockets.cc +8 -3
  488. data/vendor/v8/test/cctest/test-spaces.cc +47 -29
  489. data/vendor/v8/test/cctest/test-strings.cc +20 -20
  490. data/vendor/v8/test/cctest/test-thread-termination.cc +8 -3
  491. data/vendor/v8/test/cctest/test-threads.cc +5 -3
  492. data/vendor/v8/test/cctest/test-utils.cc +5 -4
  493. data/vendor/v8/test/cctest/testcfg.py +7 -3
  494. data/vendor/v8/test/es5conform/es5conform.status +2 -77
  495. data/vendor/v8/test/es5conform/testcfg.py +1 -1
  496. data/vendor/v8/test/message/testcfg.py +1 -1
  497. data/vendor/v8/test/mjsunit/accessors-on-global-object.js +3 -3
  498. data/vendor/v8/test/mjsunit/array-concat.js +43 -1
  499. data/vendor/v8/test/mjsunit/array-join.js +25 -0
  500. data/vendor/v8/test/mjsunit/bitops-info.js +7 -1
  501. data/vendor/v8/test/mjsunit/compiler/array-length.js +2 -2
  502. data/vendor/v8/test/mjsunit/compiler/global-accessors.js +47 -0
  503. data/vendor/v8/test/mjsunit/compiler/pic.js +1 -1
  504. data/vendor/v8/test/mjsunit/compiler/regress-loadfield.js +65 -0
  505. data/vendor/v8/test/mjsunit/math-sqrt.js +5 -1
  506. data/vendor/v8/test/mjsunit/mjsunit.js +59 -8
  507. data/vendor/v8/test/mjsunit/mjsunit.status +0 -12
  508. data/vendor/v8/test/mjsunit/mul-exhaustive.js +129 -11
  509. data/vendor/v8/test/mjsunit/negate-zero.js +1 -1
  510. data/vendor/v8/test/mjsunit/object-freeze.js +5 -13
  511. data/vendor/v8/test/mjsunit/object-prevent-extensions.js +9 -50
  512. data/vendor/v8/test/mjsunit/object-seal.js +4 -13
  513. data/vendor/v8/test/mjsunit/override-eval-with-non-function.js +36 -0
  514. data/vendor/v8/test/mjsunit/regress/regress-1145.js +54 -0
  515. data/vendor/v8/test/mjsunit/regress/regress-1172-bis.js +37 -0
  516. data/vendor/v8/test/mjsunit/regress/regress-1181.js +54 -0
  517. data/vendor/v8/test/mjsunit/regress/regress-1207.js +35 -0
  518. data/vendor/v8/test/mjsunit/regress/regress-1209.js +34 -0
  519. data/vendor/v8/test/mjsunit/regress/regress-1210.js +48 -0
  520. data/vendor/v8/test/mjsunit/regress/regress-1213.js +43 -0
  521. data/vendor/v8/test/mjsunit/regress/regress-1218.js +29 -0
  522. data/vendor/v8/test/mjsunit/regress/regress-1229.js +79 -0
  523. data/vendor/v8/test/mjsunit/regress/regress-1233.js +47 -0
  524. data/vendor/v8/test/mjsunit/regress/regress-1236.js +34 -0
  525. data/vendor/v8/test/mjsunit/regress/regress-1237.js +36 -0
  526. data/vendor/v8/test/mjsunit/regress/regress-1240.js +39 -0
  527. data/vendor/v8/test/mjsunit/regress/regress-1257.js +58 -0
  528. data/vendor/v8/test/mjsunit/regress/regress-1278.js +69 -0
  529. data/vendor/v8/test/mjsunit/regress/regress-create-exception.js +1 -0
  530. data/vendor/v8/test/mjsunit/regress/regress-lazy-deopt-reloc.js +52 -0
  531. data/vendor/v8/test/mjsunit/sin-cos.js +15 -10
  532. data/vendor/v8/test/mjsunit/smi-negative-zero.js +2 -2
  533. data/vendor/v8/test/mjsunit/str-to-num.js +1 -1
  534. data/vendor/v8/test/mjsunit/strict-mode.js +435 -0
  535. data/vendor/v8/test/mjsunit/testcfg.py +23 -6
  536. data/vendor/v8/test/mozilla/mozilla.status +0 -2
  537. data/vendor/v8/test/mozilla/testcfg.py +1 -1
  538. data/vendor/v8/test/preparser/empty.js +28 -0
  539. data/vendor/v8/test/preparser/functions-only.js +38 -0
  540. data/vendor/v8/test/preparser/non-alphanum.js +34 -0
  541. data/vendor/v8/test/preparser/symbols-only.js +49 -0
  542. data/vendor/v8/test/preparser/testcfg.py +90 -0
  543. data/vendor/v8/test/sputnik/testcfg.py +1 -1
  544. data/vendor/v8/test/test262/README +16 -0
  545. data/vendor/v8/test/test262/harness-adapt.js +80 -0
  546. data/vendor/v8/test/test262/test262.status +1506 -0
  547. data/vendor/v8/test/test262/testcfg.py +123 -0
  548. data/vendor/v8/tools/freebsd-tick-processor +10 -0
  549. data/vendor/v8/tools/gyp/v8.gyp +8 -33
  550. data/vendor/v8/tools/linux-tick-processor +5 -3
  551. data/vendor/v8/tools/test.py +37 -14
  552. data/vendor/v8/tools/tickprocessor.js +22 -8
  553. data/vendor/v8/tools/visual_studio/v8_base.vcproj +13 -1
  554. data/vendor/v8/tools/visual_studio/v8_base_arm.vcproj +5 -1
  555. data/vendor/v8/tools/visual_studio/v8_base_x64.vcproj +5 -1
  556. data/vendor/v8/tools/visual_studio/x64.vsprops +1 -0
  557. metadata +1495 -1341
  558. data/ext/extconf.rb +0 -22
  559. data/ext/mustang.cpp +0 -58
  560. data/vendor/v8/src/top.h +0 -608
@@ -29,7 +29,9 @@
29
29
  #define V8_HYDROGEN_INSTRUCTIONS_H_
30
30
 
31
31
  #include "v8.h"
32
+
32
33
  #include "code-stubs.h"
34
+ #include "small-pointer-list.h"
33
35
  #include "string-stream.h"
34
36
  #include "zone.h"
35
37
 
@@ -91,6 +93,7 @@ class LChunkBuilder;
91
93
  V(CheckNonSmi) \
92
94
  V(CheckPrototypeMaps) \
93
95
  V(CheckSmi) \
96
+ V(ClassOfTest) \
94
97
  V(Compare) \
95
98
  V(CompareJSObjectEq) \
96
99
  V(CompareMap) \
@@ -100,40 +103,41 @@ class LChunkBuilder;
100
103
  V(Deoptimize) \
101
104
  V(Div) \
102
105
  V(EnterInlined) \
106
+ V(ExternalArrayLength) \
103
107
  V(FixedArrayLength) \
104
108
  V(FunctionLiteral) \
105
109
  V(GetCachedArrayIndex) \
106
110
  V(GlobalObject) \
107
111
  V(GlobalReceiver) \
108
112
  V(Goto) \
113
+ V(HasInstanceType) \
114
+ V(HasCachedArrayIndex) \
109
115
  V(InstanceOf) \
110
116
  V(InstanceOfKnownGlobal) \
111
117
  V(IsNull) \
112
118
  V(IsObject) \
113
119
  V(IsSmi) \
114
120
  V(IsConstructCall) \
115
- V(HasInstanceType) \
116
- V(HasCachedArrayIndex) \
117
121
  V(JSArrayLength) \
118
- V(ClassOfTest) \
119
122
  V(LeaveInlined) \
120
123
  V(LoadContextSlot) \
121
124
  V(LoadElements) \
125
+ V(LoadExternalArrayPointer) \
122
126
  V(LoadFunctionPrototype) \
123
- V(LoadGlobal) \
127
+ V(LoadGlobalCell) \
128
+ V(LoadGlobalGeneric) \
124
129
  V(LoadKeyedFastElement) \
125
130
  V(LoadKeyedGeneric) \
131
+ V(LoadKeyedSpecializedArrayElement) \
126
132
  V(LoadNamedField) \
133
+ V(LoadNamedFieldPolymorphic) \
127
134
  V(LoadNamedGeneric) \
128
- V(LoadPixelArrayElement) \
129
- V(LoadPixelArrayExternalPointer) \
130
135
  V(Mod) \
131
136
  V(Mul) \
132
137
  V(ObjectLiteral) \
133
138
  V(OsrEntry) \
134
139
  V(OuterContext) \
135
140
  V(Parameter) \
136
- V(PixelArrayLength) \
137
141
  V(Power) \
138
142
  V(PushArgument) \
139
143
  V(RegExpLiteral) \
@@ -146,15 +150,17 @@ class LChunkBuilder;
146
150
  V(StoreContextSlot) \
147
151
  V(StoreGlobal) \
148
152
  V(StoreKeyedFastElement) \
149
- V(StorePixelArrayElement) \
153
+ V(StoreKeyedSpecializedArrayElement) \
150
154
  V(StoreKeyedGeneric) \
151
155
  V(StoreNamedField) \
152
156
  V(StoreNamedGeneric) \
153
157
  V(StringCharCodeAt) \
158
+ V(StringCharFromCode) \
154
159
  V(StringLength) \
155
160
  V(Sub) \
156
161
  V(Test) \
157
162
  V(Throw) \
163
+ V(ToFastProperties) \
158
164
  V(Typeof) \
159
165
  V(TypeofIs) \
160
166
  V(UnaryMathOperation) \
@@ -166,7 +172,7 @@ class LChunkBuilder;
166
172
  V(InobjectFields) \
167
173
  V(BackingStoreFields) \
168
174
  V(ArrayElements) \
169
- V(PixelArrayElements) \
175
+ V(SpecializedArrayElements) \
170
176
  V(GlobalVars) \
171
177
  V(Maps) \
172
178
  V(ArrayLengths) \
@@ -190,81 +196,48 @@ class LChunkBuilder;
190
196
 
191
197
  class Range: public ZoneObject {
192
198
  public:
193
- Range() : lower_(kMinInt),
194
- upper_(kMaxInt),
195
- next_(NULL),
196
- can_be_minus_zero_(false) { }
199
+ Range()
200
+ : lower_(kMinInt),
201
+ upper_(kMaxInt),
202
+ next_(NULL),
203
+ can_be_minus_zero_(false) { }
197
204
 
198
205
  Range(int32_t lower, int32_t upper)
199
- : lower_(lower), upper_(upper), next_(NULL), can_be_minus_zero_(false) { }
206
+ : lower_(lower),
207
+ upper_(upper),
208
+ next_(NULL),
209
+ can_be_minus_zero_(false) { }
200
210
 
201
- bool IsInSmiRange() const {
202
- return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
203
- }
204
- void KeepOrder();
205
- void Verify() const;
206
211
  int32_t upper() const { return upper_; }
207
212
  int32_t lower() const { return lower_; }
208
213
  Range* next() const { return next_; }
209
214
  Range* CopyClearLower() const { return new Range(kMinInt, upper_); }
210
215
  Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); }
211
- void ClearLower() { lower_ = kMinInt; }
212
- void ClearUpper() { upper_ = kMaxInt; }
213
216
  Range* Copy() const { return new Range(lower_, upper_); }
214
- bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; }
215
217
  int32_t Mask() const;
216
218
  void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; }
217
219
  bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; }
218
220
  bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; }
219
221
  bool CanBeNegative() const { return lower_ < 0; }
220
- bool Includes(int value) const {
221
- return lower_ <= value && upper_ >= value;
222
- }
223
-
224
- void Sar(int32_t value) {
225
- int32_t bits = value & 0x1F;
226
- lower_ = lower_ >> bits;
227
- upper_ = upper_ >> bits;
228
- set_can_be_minus_zero(false);
229
- }
230
-
231
- void Shl(int32_t value) {
232
- int32_t bits = value & 0x1F;
233
- int old_lower = lower_;
234
- int old_upper = upper_;
235
- lower_ = lower_ << bits;
236
- upper_ = upper_ << bits;
237
- if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) {
238
- upper_ = kMaxInt;
239
- lower_ = kMinInt;
240
- }
241
- set_can_be_minus_zero(false);
222
+ bool Includes(int value) const { return lower_ <= value && upper_ >= value; }
223
+ bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; }
224
+ bool IsInSmiRange() const {
225
+ return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue;
242
226
  }
243
-
244
- // Adds a constant to the lower and upper bound of the range.
245
- void AddConstant(int32_t value);
227
+ void KeepOrder();
228
+ void Verify() const;
246
229
 
247
230
  void StackUpon(Range* other) {
248
231
  Intersect(other);
249
232
  next_ = other;
250
233
  }
251
234
 
252
- void Intersect(Range* other) {
253
- upper_ = Min(upper_, other->upper_);
254
- lower_ = Max(lower_, other->lower_);
255
- bool b = CanBeMinusZero() && other->CanBeMinusZero();
256
- set_can_be_minus_zero(b);
257
- }
258
-
259
- void Union(Range* other) {
260
- upper_ = Max(upper_, other->upper_);
261
- lower_ = Min(lower_, other->lower_);
262
- bool b = CanBeMinusZero() || other->CanBeMinusZero();
263
- set_can_be_minus_zero(b);
264
- }
235
+ void Intersect(Range* other);
236
+ void Union(Range* other);
265
237
 
266
- // Compute a new result range and return true, if the operation
267
- // can overflow.
238
+ void AddConstant(int32_t value);
239
+ void Sar(int32_t value);
240
+ void Shl(int32_t value);
268
241
  bool AddAndCheckOverflow(Range* other);
269
242
  bool SubAndCheckOverflow(Range* other);
270
243
  bool MulAndCheckOverflow(Range* other);
@@ -482,7 +455,6 @@ class HValue: public ZoneObject {
482
455
 
483
456
  HValue() : block_(NULL),
484
457
  id_(kNoNumber),
485
- uses_(2),
486
458
  type_(HType::Tagged()),
487
459
  range_(NULL),
488
460
  flags_(0) {}
@@ -494,9 +466,9 @@ class HValue: public ZoneObject {
494
466
  int id() const { return id_; }
495
467
  void set_id(int id) { id_ = id; }
496
468
 
497
- const ZoneList<HValue*>* uses() const { return &uses_; }
469
+ SmallPointerList<HValue>* uses() { return &uses_; }
498
470
 
499
- virtual bool EmitAtUses() const { return false; }
471
+ virtual bool EmitAtUses() { return false; }
500
472
  Representation representation() const { return representation_; }
501
473
  void ChangeRepresentation(Representation r) {
502
474
  // Representation was already set and is allowed to be changed.
@@ -638,7 +610,7 @@ class HValue: public ZoneObject {
638
610
  int id_;
639
611
 
640
612
  Representation representation_;
641
- ZoneList<HValue*> uses_;
613
+ SmallPointerList<HValue> uses_;
642
614
  HType type_;
643
615
  Range* range_;
644
616
  int flags_;
@@ -789,15 +761,33 @@ class HBlockEntry: public HTemplateInstruction<0> {
789
761
  };
790
762
 
791
763
 
792
- class HDeoptimize: public HTemplateControlInstruction<0> {
764
+ class HDeoptimize: public HControlInstruction {
793
765
  public:
794
- HDeoptimize() : HTemplateControlInstruction<0>(NULL, NULL) { }
766
+ explicit HDeoptimize(int environment_length)
767
+ : HControlInstruction(NULL, NULL),
768
+ values_(environment_length) { }
795
769
 
796
770
  virtual Representation RequiredInputRepresentation(int index) const {
797
771
  return Representation::None();
798
772
  }
799
773
 
774
+ virtual int OperandCount() { return values_.length(); }
775
+ virtual HValue* OperandAt(int index) { return values_[index]; }
776
+
777
+ void AddEnvironmentValue(HValue* value) {
778
+ values_.Add(NULL);
779
+ SetOperandAt(values_.length() - 1, value);
780
+ }
781
+
800
782
  DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize")
783
+
784
+ protected:
785
+ virtual void InternalSetOperandAt(int index, HValue* value) {
786
+ values_[index] = value;
787
+ }
788
+
789
+ private:
790
+ ZoneList<HValue*> values_;
801
791
  };
802
792
 
803
793
 
@@ -940,13 +930,14 @@ class HChange: public HUnaryOperation {
940
930
  public:
941
931
  HChange(HValue* value,
942
932
  Representation from,
943
- Representation to)
933
+ Representation to,
934
+ bool is_truncating)
944
935
  : HUnaryOperation(value), from_(from), to_(to) {
945
936
  ASSERT(!from.IsNone() && !to.IsNone());
946
937
  ASSERT(!from.Equals(to));
947
938
  set_representation(to);
948
939
  SetFlag(kUseGVN);
949
-
940
+ if (is_truncating) SetFlag(kTruncatingToInt32);
950
941
  if (from.IsInteger32() && to.IsTagged() && value->range() != NULL &&
951
942
  value->range()->IsInSmiRange()) {
952
943
  set_type(HType::Smi());
@@ -961,12 +952,7 @@ class HChange: public HUnaryOperation {
961
952
  return from_;
962
953
  }
963
954
 
964
- bool CanTruncateToInt32() const {
965
- for (int i = 0; i < uses()->length(); ++i) {
966
- if (!uses()->at(i)->CheckFlag(HValue::kTruncatingToInt32)) return false;
967
- }
968
- return true;
969
- }
955
+ bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); }
970
956
 
971
957
  virtual void PrintDataTo(StringStream* stream);
972
958
 
@@ -978,8 +964,7 @@ class HChange: public HUnaryOperation {
978
964
  if (!other->IsChange()) return false;
979
965
  HChange* change = HChange::cast(other);
980
966
  return value() == change->value()
981
- && to().Equals(change->to())
982
- && CanTruncateToInt32() == change->CanTruncateToInt32();
967
+ && to().Equals(change->to());
983
968
  }
984
969
 
985
970
  private:
@@ -1263,7 +1248,8 @@ class HCallConstantFunction: public HCall<0> {
1263
1248
  Handle<JSFunction> function() const { return function_; }
1264
1249
 
1265
1250
  bool IsApplyFunction() const {
1266
- return function_->code() == Builtins::builtin(Builtins::FunctionApply);
1251
+ return function_->code() ==
1252
+ Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply);
1267
1253
  }
1268
1254
 
1269
1255
  virtual void PrintDataTo(StringStream* stream);
@@ -1396,12 +1382,12 @@ class HCallNew: public HBinaryCall {
1396
1382
  class HCallRuntime: public HCall<0> {
1397
1383
  public:
1398
1384
  HCallRuntime(Handle<String> name,
1399
- Runtime::Function* c_function,
1385
+ const Runtime::Function* c_function,
1400
1386
  int argument_count)
1401
1387
  : HCall<0>(argument_count), c_function_(c_function), name_(name) { }
1402
1388
  virtual void PrintDataTo(StringStream* stream);
1403
1389
 
1404
- Runtime::Function* function() const { return c_function_; }
1390
+ const Runtime::Function* function() const { return c_function_; }
1405
1391
  Handle<String> name() const { return name_; }
1406
1392
 
1407
1393
  virtual Representation RequiredInputRepresentation(int index) const {
@@ -1411,7 +1397,7 @@ class HCallRuntime: public HCall<0> {
1411
1397
  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call_runtime")
1412
1398
 
1413
1399
  private:
1414
- Runtime::Function* c_function_;
1400
+ const Runtime::Function* c_function_;
1415
1401
  Handle<String> name_;
1416
1402
  };
1417
1403
 
@@ -1423,8 +1409,9 @@ class HJSArrayLength: public HUnaryOperation {
1423
1409
  // object. It is guaranteed to be 32 bit integer, but it can be
1424
1410
  // represented as either a smi or heap number.
1425
1411
  set_representation(Representation::Tagged());
1426
- SetFlag(kDependsOnArrayLengths);
1427
1412
  SetFlag(kUseGVN);
1413
+ SetFlag(kDependsOnArrayLengths);
1414
+ SetFlag(kDependsOnMaps);
1428
1415
  }
1429
1416
 
1430
1417
  virtual Representation RequiredInputRepresentation(int index) const {
@@ -1442,8 +1429,8 @@ class HFixedArrayLength: public HUnaryOperation {
1442
1429
  public:
1443
1430
  explicit HFixedArrayLength(HValue* value) : HUnaryOperation(value) {
1444
1431
  set_representation(Representation::Tagged());
1445
- SetFlag(kDependsOnArrayLengths);
1446
1432
  SetFlag(kUseGVN);
1433
+ SetFlag(kDependsOnArrayLengths);
1447
1434
  }
1448
1435
 
1449
1436
  virtual Representation RequiredInputRepresentation(int index) const {
@@ -1457,9 +1444,9 @@ class HFixedArrayLength: public HUnaryOperation {
1457
1444
  };
1458
1445
 
1459
1446
 
1460
- class HPixelArrayLength: public HUnaryOperation {
1447
+ class HExternalArrayLength: public HUnaryOperation {
1461
1448
  public:
1462
- explicit HPixelArrayLength(HValue* value) : HUnaryOperation(value) {
1449
+ explicit HExternalArrayLength(HValue* value) : HUnaryOperation(value) {
1463
1450
  set_representation(Representation::Integer32());
1464
1451
  // The result of this instruction is idempotent as long as its inputs don't
1465
1452
  // change. The length of a pixel array cannot change once set, so it's not
@@ -1471,7 +1458,7 @@ class HPixelArrayLength: public HUnaryOperation {
1471
1458
  return Representation::Tagged();
1472
1459
  }
1473
1460
 
1474
- DECLARE_CONCRETE_INSTRUCTION(PixelArrayLength, "pixel_array_length")
1461
+ DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength, "external_array_length")
1475
1462
 
1476
1463
  protected:
1477
1464
  virtual bool DataEquals(HValue* other) { return true; }
@@ -1595,13 +1582,13 @@ class HLoadElements: public HUnaryOperation {
1595
1582
  };
1596
1583
 
1597
1584
 
1598
- class HLoadPixelArrayExternalPointer: public HUnaryOperation {
1585
+ class HLoadExternalArrayPointer: public HUnaryOperation {
1599
1586
  public:
1600
- explicit HLoadPixelArrayExternalPointer(HValue* value)
1587
+ explicit HLoadExternalArrayPointer(HValue* value)
1601
1588
  : HUnaryOperation(value) {
1602
1589
  set_representation(Representation::External());
1603
1590
  // The result of this instruction is idempotent as long as its inputs don't
1604
- // change. The external array of a pixel array elements object cannot
1591
+ // change. The external array of a specialized array elements object cannot
1605
1592
  // change once set, so it's no necessary to introduce any additional
1606
1593
  // dependencies on top of the inputs.
1607
1594
  SetFlag(kUseGVN);
@@ -1611,8 +1598,8 @@ class HLoadPixelArrayExternalPointer: public HUnaryOperation {
1611
1598
  return Representation::Tagged();
1612
1599
  }
1613
1600
 
1614
- DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayExternalPointer,
1615
- "load-pixel-array-external-pointer")
1601
+ DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
1602
+ "load-external-array-pointer")
1616
1603
 
1617
1604
  protected:
1618
1605
  virtual bool DataEquals(HValue* other) { return true; }
@@ -1789,7 +1776,7 @@ class HCheckPrototypeMaps: public HTemplateInstruction<0> {
1789
1776
  }
1790
1777
 
1791
1778
  virtual intptr_t Hashcode() {
1792
- ASSERT(!Heap::IsAllocationAllowed());
1779
+ ASSERT(!HEAP->IsAllocationAllowed());
1793
1780
  intptr_t hash = reinterpret_cast<intptr_t>(*prototype());
1794
1781
  hash = 17 * hash + reinterpret_cast<intptr_t>(*holder());
1795
1782
  return hash;
@@ -1838,7 +1825,8 @@ class HPhi: public HValue {
1838
1825
  explicit HPhi(int merged_index)
1839
1826
  : inputs_(2),
1840
1827
  merged_index_(merged_index),
1841
- phi_id_(-1) {
1828
+ phi_id_(-1),
1829
+ is_live_(false) {
1842
1830
  for (int i = 0; i < Representation::kNumRepresentations; i++) {
1843
1831
  non_phi_uses_[i] = 0;
1844
1832
  indirect_uses_[i] = 0;
@@ -1872,6 +1860,7 @@ class HPhi: public HValue {
1872
1860
  virtual HValue* OperandAt(int index) { return inputs_[index]; }
1873
1861
  HValue* GetRedundantReplacement();
1874
1862
  void AddInput(HValue* value);
1863
+ bool HasRealUses();
1875
1864
 
1876
1865
  bool IsReceiver() { return merged_index_ == 0; }
1877
1866
 
@@ -1910,6 +1899,8 @@ class HPhi: public HValue {
1910
1899
  return indirect_uses_[Representation::kDouble];
1911
1900
  }
1912
1901
  int phi_id() { return phi_id_; }
1902
+ bool is_live() { return is_live_; }
1903
+ void set_is_live(bool b) { is_live_ = b; }
1913
1904
 
1914
1905
  protected:
1915
1906
  virtual void DeleteFromGraph();
@@ -1924,6 +1915,7 @@ class HPhi: public HValue {
1924
1915
  int non_phi_uses_[Representation::kNumRepresentations];
1925
1916
  int indirect_uses_[Representation::kNumRepresentations];
1926
1917
  int phi_id_;
1918
+ bool is_live_;
1927
1919
  };
1928
1920
 
1929
1921
 
@@ -1948,13 +1940,13 @@ class HConstant: public HTemplateInstruction<0> {
1948
1940
 
1949
1941
  Handle<Object> handle() const { return handle_; }
1950
1942
 
1951
- bool InOldSpace() const { return !Heap::InNewSpace(*handle_); }
1943
+ bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); }
1952
1944
 
1953
1945
  virtual Representation RequiredInputRepresentation(int index) const {
1954
1946
  return Representation::None();
1955
1947
  }
1956
1948
 
1957
- virtual bool EmitAtUses() const { return !representation().IsDouble(); }
1949
+ virtual bool EmitAtUses() { return !representation().IsDouble(); }
1958
1950
  virtual void PrintDataTo(StringStream* stream);
1959
1951
  virtual HType CalculateInferredType();
1960
1952
  bool IsInteger() const { return handle_->IsSmi(); }
@@ -1973,7 +1965,7 @@ class HConstant: public HTemplateInstruction<0> {
1973
1965
  bool HasStringValue() const { return handle_->IsString(); }
1974
1966
 
1975
1967
  virtual intptr_t Hashcode() {
1976
- ASSERT(!Heap::allow_allocation(false));
1968
+ ASSERT(!HEAP->allow_allocation(false));
1977
1969
  return reinterpret_cast<intptr_t>(*handle());
1978
1970
  }
1979
1971
 
@@ -2229,7 +2221,7 @@ class HCompare: public HBinaryOperation {
2229
2221
 
2230
2222
  void SetInputRepresentation(Representation r);
2231
2223
 
2232
- virtual bool EmitAtUses() const {
2224
+ virtual bool EmitAtUses() {
2233
2225
  return !HasSideEffects() && (uses()->length() <= 1);
2234
2226
  }
2235
2227
 
@@ -2268,9 +2260,10 @@ class HCompareJSObjectEq: public HBinaryOperation {
2268
2260
  : HBinaryOperation(left, right) {
2269
2261
  set_representation(Representation::Tagged());
2270
2262
  SetFlag(kUseGVN);
2263
+ SetFlag(kDependsOnMaps);
2271
2264
  }
2272
2265
 
2273
- virtual bool EmitAtUses() const {
2266
+ virtual bool EmitAtUses() {
2274
2267
  return !HasSideEffects() && (uses()->length() <= 1);
2275
2268
  }
2276
2269
 
@@ -2293,7 +2286,7 @@ class HUnaryPredicate: public HUnaryOperation {
2293
2286
  SetFlag(kUseGVN);
2294
2287
  }
2295
2288
 
2296
- virtual bool EmitAtUses() const {
2289
+ virtual bool EmitAtUses() {
2297
2290
  return !HasSideEffects() && (uses()->length() <= 1);
2298
2291
  }
2299
2292
 
@@ -2353,7 +2346,7 @@ class HIsConstructCall: public HTemplateInstruction<0> {
2353
2346
  SetFlag(kUseGVN);
2354
2347
  }
2355
2348
 
2356
- virtual bool EmitAtUses() const {
2349
+ virtual bool EmitAtUses() {
2357
2350
  return !HasSideEffects() && (uses()->length() <= 1);
2358
2351
  }
2359
2352
 
@@ -2475,7 +2468,7 @@ class HInstanceOf: public HTemplateInstruction<3> {
2475
2468
  HValue* left() { return OperandAt(1); }
2476
2469
  HValue* right() { return OperandAt(2); }
2477
2470
 
2478
- virtual bool EmitAtUses() const {
2471
+ virtual bool EmitAtUses() {
2479
2472
  return !HasSideEffects() && (uses()->length() <= 1);
2480
2473
  }
2481
2474
 
@@ -2600,6 +2593,16 @@ class HMod: public HArithmeticBinaryOperation {
2600
2593
  SetFlag(kCanBeDivByZero);
2601
2594
  }
2602
2595
 
2596
+ bool HasPowerOf2Divisor() {
2597
+ if (right()->IsConstant() &&
2598
+ HConstant::cast(right())->HasInteger32Value()) {
2599
+ int32_t value = HConstant::cast(right())->Integer32Value();
2600
+ return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value));
2601
+ }
2602
+
2603
+ return false;
2604
+ }
2605
+
2603
2606
  virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
2604
2607
 
2605
2608
  DECLARE_CONCRETE_INSTRUCTION(Mod, "mod")
@@ -2807,9 +2810,9 @@ class HUnknownOSRValue: public HTemplateInstruction<0> {
2807
2810
  };
2808
2811
 
2809
2812
 
2810
- class HLoadGlobal: public HTemplateInstruction<0> {
2813
+ class HLoadGlobalCell: public HTemplateInstruction<0> {
2811
2814
  public:
2812
- HLoadGlobal(Handle<JSGlobalPropertyCell> cell, bool check_hole_value)
2815
+ HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, bool check_hole_value)
2813
2816
  : cell_(cell), check_hole_value_(check_hole_value) {
2814
2817
  set_representation(Representation::Tagged());
2815
2818
  SetFlag(kUseGVN);
@@ -2822,7 +2825,7 @@ class HLoadGlobal: public HTemplateInstruction<0> {
2822
2825
  virtual void PrintDataTo(StringStream* stream);
2823
2826
 
2824
2827
  virtual intptr_t Hashcode() {
2825
- ASSERT(!Heap::allow_allocation(false));
2828
+ ASSERT(!HEAP->allow_allocation(false));
2826
2829
  return reinterpret_cast<intptr_t>(*cell_);
2827
2830
  }
2828
2831
 
@@ -2830,11 +2833,11 @@ class HLoadGlobal: public HTemplateInstruction<0> {
2830
2833
  return Representation::None();
2831
2834
  }
2832
2835
 
2833
- DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load_global")
2836
+ DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load_global_cell")
2834
2837
 
2835
2838
  protected:
2836
2839
  virtual bool DataEquals(HValue* other) {
2837
- HLoadGlobal* b = HLoadGlobal::cast(other);
2840
+ HLoadGlobalCell* b = HLoadGlobalCell::cast(other);
2838
2841
  return cell_.is_identical_to(b->cell());
2839
2842
  }
2840
2843
 
@@ -2844,6 +2847,38 @@ class HLoadGlobal: public HTemplateInstruction<0> {
2844
2847
  };
2845
2848
 
2846
2849
 
2850
+ class HLoadGlobalGeneric: public HBinaryOperation {
2851
+ public:
2852
+ HLoadGlobalGeneric(HValue* context,
2853
+ HValue* global_object,
2854
+ Handle<Object> name,
2855
+ bool for_typeof)
2856
+ : HBinaryOperation(context, global_object),
2857
+ name_(name),
2858
+ for_typeof_(for_typeof) {
2859
+ set_representation(Representation::Tagged());
2860
+ SetAllSideEffects();
2861
+ }
2862
+
2863
+ HValue* context() { return OperandAt(0); }
2864
+ HValue* global_object() { return OperandAt(1); }
2865
+ Handle<Object> name() const { return name_; }
2866
+ bool for_typeof() const { return for_typeof_; }
2867
+
2868
+ virtual void PrintDataTo(StringStream* stream);
2869
+
2870
+ virtual Representation RequiredInputRepresentation(int index) const {
2871
+ return Representation::Tagged();
2872
+ }
2873
+
2874
+ DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load_global_generic")
2875
+
2876
+ private:
2877
+ Handle<Object> name_;
2878
+ bool for_typeof_;
2879
+ };
2880
+
2881
+
2847
2882
  class HStoreGlobal: public HUnaryOperation {
2848
2883
  public:
2849
2884
  HStoreGlobal(HValue* value,
@@ -2943,6 +2978,7 @@ class HLoadNamedField: public HUnaryOperation {
2943
2978
  offset_(offset) {
2944
2979
  set_representation(Representation::Tagged());
2945
2980
  SetFlag(kUseGVN);
2981
+ SetFlag(kDependsOnMaps);
2946
2982
  if (is_in_object) {
2947
2983
  SetFlag(kDependsOnInobjectFields);
2948
2984
  } else {
@@ -2973,6 +3009,37 @@ class HLoadNamedField: public HUnaryOperation {
2973
3009
  };
2974
3010
 
2975
3011
 
3012
+ class HLoadNamedFieldPolymorphic: public HUnaryOperation {
3013
+ public:
3014
+ HLoadNamedFieldPolymorphic(HValue* object,
3015
+ ZoneMapList* types,
3016
+ Handle<String> name);
3017
+
3018
+ HValue* object() { return OperandAt(0); }
3019
+ ZoneMapList* types() { return &types_; }
3020
+ Handle<String> name() { return name_; }
3021
+ bool need_generic() { return need_generic_; }
3022
+
3023
+ virtual Representation RequiredInputRepresentation(int index) const {
3024
+ return Representation::Tagged();
3025
+ }
3026
+
3027
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic,
3028
+ "load_named_field_polymorphic")
3029
+
3030
+ static const int kMaxLoadPolymorphism = 4;
3031
+
3032
+ protected:
3033
+ virtual bool DataEquals(HValue* value);
3034
+
3035
+ private:
3036
+ ZoneMapList types_;
3037
+ Handle<String> name_;
3038
+ bool need_generic_;
3039
+ };
3040
+
3041
+
3042
+
2976
3043
  class HLoadNamedGeneric: public HBinaryOperation {
2977
3044
  public:
2978
3045
  HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name)
@@ -3045,13 +3112,20 @@ class HLoadKeyedFastElement: public HBinaryOperation {
3045
3112
  };
3046
3113
 
3047
3114
 
3048
- class HLoadPixelArrayElement: public HBinaryOperation {
3115
+ class HLoadKeyedSpecializedArrayElement: public HBinaryOperation {
3049
3116
  public:
3050
- HLoadPixelArrayElement(HValue* external_elements, HValue* key)
3051
- : HBinaryOperation(external_elements, key) {
3052
- set_representation(Representation::Integer32());
3053
- SetFlag(kDependsOnPixelArrayElements);
3054
- // Native code could change the pixel array.
3117
+ HLoadKeyedSpecializedArrayElement(HValue* external_elements,
3118
+ HValue* key,
3119
+ ExternalArrayType array_type)
3120
+ : HBinaryOperation(external_elements, key),
3121
+ array_type_(array_type) {
3122
+ if (array_type == kExternalFloatArray) {
3123
+ set_representation(Representation::Double());
3124
+ } else {
3125
+ set_representation(Representation::Integer32());
3126
+ }
3127
+ SetFlag(kDependsOnSpecializedArrayElements);
3128
+ // Native code could change the specialized array.
3055
3129
  SetFlag(kDependsOnCalls);
3056
3130
  SetFlag(kUseGVN);
3057
3131
  }
@@ -3067,12 +3141,21 @@ class HLoadPixelArrayElement: public HBinaryOperation {
3067
3141
 
3068
3142
  HValue* external_pointer() { return OperandAt(0); }
3069
3143
  HValue* key() { return OperandAt(1); }
3144
+ ExternalArrayType array_type() const { return array_type_; }
3070
3145
 
3071
- DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement,
3072
- "load_pixel_array_element")
3146
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,
3147
+ "load_keyed_specialized_array_element")
3073
3148
 
3074
3149
  protected:
3075
- virtual bool DataEquals(HValue* other) { return true; }
3150
+ virtual bool DataEquals(HValue* other) {
3151
+ if (!other->IsLoadKeyedSpecializedArrayElement()) return false;
3152
+ HLoadKeyedSpecializedArrayElement* cast_other =
3153
+ HLoadKeyedSpecializedArrayElement::cast(other);
3154
+ return array_type_ == cast_other->array_type();
3155
+ }
3156
+
3157
+ private:
3158
+ ExternalArrayType array_type_;
3076
3159
  };
3077
3160
 
3078
3161
 
@@ -3207,10 +3290,14 @@ class HStoreKeyedFastElement: public HTemplateInstruction<3> {
3207
3290
  };
3208
3291
 
3209
3292
 
3210
- class HStorePixelArrayElement: public HTemplateInstruction<3> {
3293
+ class HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> {
3211
3294
  public:
3212
- HStorePixelArrayElement(HValue* external_elements, HValue* key, HValue* val) {
3213
- SetFlag(kChangesPixelArrayElements);
3295
+ HStoreKeyedSpecializedArrayElement(HValue* external_elements,
3296
+ HValue* key,
3297
+ HValue* val,
3298
+ ExternalArrayType array_type)
3299
+ : array_type_(array_type) {
3300
+ SetFlag(kChangesSpecializedArrayElements);
3214
3301
  SetOperandAt(0, external_elements);
3215
3302
  SetOperandAt(1, key);
3216
3303
  SetOperandAt(2, val);
@@ -3222,16 +3309,23 @@ class HStorePixelArrayElement: public HTemplateInstruction<3> {
3222
3309
  if (index == 0) {
3223
3310
  return Representation::External();
3224
3311
  } else {
3225
- return Representation::Integer32();
3312
+ if (index == 2 && array_type() == kExternalFloatArray) {
3313
+ return Representation::Double();
3314
+ } else {
3315
+ return Representation::Integer32();
3316
+ }
3226
3317
  }
3227
3318
  }
3228
3319
 
3229
3320
  HValue* external_pointer() { return OperandAt(0); }
3230
3321
  HValue* key() { return OperandAt(1); }
3231
3322
  HValue* value() { return OperandAt(2); }
3323
+ ExternalArrayType array_type() const { return array_type_; }
3232
3324
 
3233
- DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement,
3234
- "store_pixel_array_element")
3325
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,
3326
+ "store_keyed_specialized_array_element")
3327
+ private:
3328
+ ExternalArrayType array_type_;
3235
3329
  };
3236
3330
 
3237
3331
 
@@ -3269,6 +3363,7 @@ class HStringCharCodeAt: public HBinaryOperation {
3269
3363
  : HBinaryOperation(string, index) {
3270
3364
  set_representation(Representation::Integer32());
3271
3365
  SetFlag(kUseGVN);
3366
+ SetFlag(kDependsOnMaps);
3272
3367
  }
3273
3368
 
3274
3369
  virtual Representation RequiredInputRepresentation(int index) const {
@@ -3291,11 +3386,29 @@ class HStringCharCodeAt: public HBinaryOperation {
3291
3386
  };
3292
3387
 
3293
3388
 
3389
+ class HStringCharFromCode: public HUnaryOperation {
3390
+ public:
3391
+ explicit HStringCharFromCode(HValue* char_code) : HUnaryOperation(char_code) {
3392
+ set_representation(Representation::Tagged());
3393
+ SetFlag(kUseGVN);
3394
+ }
3395
+
3396
+ virtual Representation RequiredInputRepresentation(int index) const {
3397
+ return Representation::Integer32();
3398
+ }
3399
+
3400
+ virtual bool DataEquals(HValue* other) { return true; }
3401
+
3402
+ DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string_char_from_code")
3403
+ };
3404
+
3405
+
3294
3406
  class HStringLength: public HUnaryOperation {
3295
3407
  public:
3296
3408
  explicit HStringLength(HValue* string) : HUnaryOperation(string) {
3297
3409
  set_representation(Representation::Tagged());
3298
3410
  SetFlag(kUseGVN);
3411
+ SetFlag(kDependsOnMaps);
3299
3412
  }
3300
3413
 
3301
3414
  virtual Representation RequiredInputRepresentation(int index) const {
@@ -3368,10 +3481,12 @@ class HObjectLiteral: public HMaterializedLiteral<1> {
3368
3481
  Handle<FixedArray> constant_properties,
3369
3482
  bool fast_elements,
3370
3483
  int literal_index,
3371
- int depth)
3484
+ int depth,
3485
+ bool has_function)
3372
3486
  : HMaterializedLiteral<1>(literal_index, depth),
3373
3487
  constant_properties_(constant_properties),
3374
- fast_elements_(fast_elements) {
3488
+ fast_elements_(fast_elements),
3489
+ has_function_(has_function) {
3375
3490
  SetOperandAt(0, context);
3376
3491
  }
3377
3492
 
@@ -3380,6 +3495,7 @@ class HObjectLiteral: public HMaterializedLiteral<1> {
3380
3495
  return constant_properties_;
3381
3496
  }
3382
3497
  bool fast_elements() const { return fast_elements_; }
3498
+ bool has_function() const { return has_function_; }
3383
3499
 
3384
3500
  virtual Representation RequiredInputRepresentation(int index) const {
3385
3501
  return Representation::Tagged();
@@ -3390,6 +3506,7 @@ class HObjectLiteral: public HMaterializedLiteral<1> {
3390
3506
  private:
3391
3507
  Handle<FixedArray> constant_properties_;
3392
3508
  bool fast_elements_;
3509
+ bool has_function_;
3393
3510
  };
3394
3511
 
3395
3512
 
@@ -3453,6 +3570,24 @@ class HTypeof: public HUnaryOperation {
3453
3570
  };
3454
3571
 
3455
3572
 
3573
+ class HToFastProperties: public HUnaryOperation {
3574
+ public:
3575
+ explicit HToFastProperties(HValue* value) : HUnaryOperation(value) {
3576
+ // This instruction is not marked as having side effects, but
3577
+ // changes the map of the input operand. Use it only when creating
3578
+ // object literals.
3579
+ ASSERT(value->IsObjectLiteral());
3580
+ set_representation(Representation::Tagged());
3581
+ }
3582
+
3583
+ virtual Representation RequiredInputRepresentation(int index) const {
3584
+ return Representation::Tagged();
3585
+ }
3586
+
3587
+ DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to_fast_properties")
3588
+ };
3589
+
3590
+
3456
3591
  class HValueOf: public HUnaryOperation {
3457
3592
  public:
3458
3593
  explicit HValueOf(HValue* value) : HUnaryOperation(value) {