mustang 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
@@ -56,7 +56,7 @@ class LCodeGen BASE_EMBEDDED {
56
56
  deoptimizations_(4),
57
57
  deoptimization_literals_(8),
58
58
  inlined_function_count_(0),
59
- scope_(chunk->graph()->info()->scope()),
59
+ scope_(info->scope()),
60
60
  status_(UNUSED),
61
61
  deferred_(8),
62
62
  osr_pc_offset_(-1),
@@ -67,6 +67,10 @@ class LCodeGen BASE_EMBEDDED {
67
67
 
68
68
  // Simple accessors.
69
69
  MacroAssembler* masm() const { return masm_; }
70
+ CompilationInfo* info() const { return info_; }
71
+ Isolate* isolate() const { return info_->isolate(); }
72
+ Factory* factory() const { return isolate()->factory(); }
73
+ Heap* heap() const { return isolate()->heap(); }
70
74
 
71
75
  // Support for converting LOperands to assembler types.
72
76
  Operand ToOperand(LOperand* op) const;
@@ -94,6 +98,7 @@ class LCodeGen BASE_EMBEDDED {
94
98
  void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr);
95
99
  void DoDeferredStackCheck(LGoto* instr);
96
100
  void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
101
+ void DoDeferredStringCharFromCode(LStringCharFromCode* instr);
97
102
  void DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
98
103
  Label* map_check);
99
104
 
@@ -124,7 +129,7 @@ class LCodeGen BASE_EMBEDDED {
124
129
  bool is_aborted() const { return status_ == ABORTED; }
125
130
 
126
131
  int strict_mode_flag() const {
127
- return info_->is_strict() ? kStrictMode : kNonStrictMode;
132
+ return info()->is_strict() ? kStrictMode : kNonStrictMode;
128
133
  }
129
134
 
130
135
  LChunk* chunk() const { return chunk_; }
@@ -161,11 +166,11 @@ class LCodeGen BASE_EMBEDDED {
161
166
 
162
167
  void CallCode(Handle<Code> code, RelocInfo::Mode mode, LInstruction* instr,
163
168
  bool adjusted = true);
164
- void CallRuntime(Runtime::Function* fun, int argc, LInstruction* instr,
169
+ void CallRuntime(const Runtime::Function* fun, int argc, LInstruction* instr,
165
170
  bool adjusted = true);
166
171
  void CallRuntime(Runtime::FunctionId id, int argc, LInstruction* instr,
167
172
  bool adjusted = true) {
168
- Runtime::Function* function = Runtime::FunctionForId(id);
173
+ const Runtime::Function* function = Runtime::FunctionForId(id);
169
174
  CallRuntime(function, argc, instr, adjusted);
170
175
  }
171
176
 
@@ -241,6 +246,10 @@ class LCodeGen BASE_EMBEDDED {
241
246
  // Caller should branch on equal condition.
242
247
  void EmitIsConstructCall(Register temp);
243
248
 
249
+ void EmitLoadField(Register result,
250
+ Register object,
251
+ Handle<Map> type,
252
+ Handle<String> name);
244
253
 
245
254
  LChunk* const chunk_;
246
255
  MacroAssembler* const masm_;
@@ -25,6 +25,10 @@
25
25
  // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
26
  // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
27
 
28
+ #include "v8.h"
29
+
30
+ #if defined(V8_TARGET_ARCH_IA32)
31
+
28
32
  #include "ia32/lithium-gap-resolver-ia32.h"
29
33
  #include "ia32/lithium-codegen-ia32.h"
30
34
 
@@ -458,3 +462,5 @@ void LGapResolver::EmitSwap(int index) {
458
462
  #undef __
459
463
 
460
464
  } } // namespace v8::internal
465
+
466
+ #endif // V8_TARGET_ARCH_IA32
@@ -469,7 +469,7 @@ int LChunk::GetParameterStackSlot(int index) const {
469
469
  // shift all parameter indexes down by the number of parameters, and
470
470
  // make sure they end up negative so they are distinguishable from
471
471
  // spill slots.
472
- int result = index - graph()->info()->scope()->num_parameters() - 1;
472
+ int result = index - info()->scope()->num_parameters() - 1;
473
473
  ASSERT(result < 0);
474
474
  return result;
475
475
  }
@@ -477,7 +477,7 @@ int LChunk::GetParameterStackSlot(int index) const {
477
477
  // A parameter relative to ebp in the arguments stub.
478
478
  int LChunk::ParameterAt(int index) {
479
479
  ASSERT(-1 <= index); // -1 is the receiver.
480
- return (1 + graph()->info()->scope()->num_parameters() - index) *
480
+ return (1 + info()->scope()->num_parameters() - index) *
481
481
  kPointerSize;
482
482
  }
483
483
 
@@ -516,7 +516,7 @@ Representation LChunk::LookupLiteralRepresentation(
516
516
 
517
517
  LChunk* LChunkBuilder::Build() {
518
518
  ASSERT(is_unused());
519
- chunk_ = new LChunk(graph());
519
+ chunk_ = new LChunk(info(), graph());
520
520
  HPhase phase("Building chunk", chunk_);
521
521
  status_ = BUILDING;
522
522
  const ZoneList<HBasicBlock*>* blocks = graph()->blocks();
@@ -533,8 +533,8 @@ LChunk* LChunkBuilder::Build() {
533
533
 
534
534
  void LChunkBuilder::Abort(const char* format, ...) {
535
535
  if (FLAG_trace_bailout) {
536
- SmartPointer<char> debug_name = graph()->debug_name()->ToCString();
537
- PrintF("Aborting LChunk building in @\"%s\": ", *debug_name);
536
+ SmartPointer<char> name(info()->shared_info()->DebugName()->ToCString());
537
+ PrintF("Aborting LChunk building in @\"%s\": ", *name);
538
538
  va_list arguments;
539
539
  va_start(arguments, format);
540
540
  OS::VPrint(format, arguments);
@@ -870,6 +870,7 @@ LInstruction* LChunkBuilder::DoArithmeticD(Token::Value op,
870
870
  ASSERT(instr->representation().IsDouble());
871
871
  ASSERT(instr->left()->representation().IsDouble());
872
872
  ASSERT(instr->right()->representation().IsDouble());
873
+ ASSERT(op != Token::MOD);
873
874
  LOperand* left = UseRegisterAtStart(instr->left());
874
875
  LOperand* right = UseRegisterAtStart(instr->right());
875
876
  LArithmeticD* result = new LArithmeticD(op, left, right);
@@ -1165,8 +1166,7 @@ LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal(
1165
1166
  new LInstanceOfKnownGlobal(
1166
1167
  UseFixed(instr->value(), InstanceofStub::left()),
1167
1168
  FixedTemp(edi));
1168
- MarkAsSaveDoubles(result);
1169
- return AssignEnvironment(AssignPointerMap(DefineFixed(result, eax)));
1169
+ return MarkAsCall(DefineFixed(result, eax), instr);
1170
1170
  }
1171
1171
 
1172
1172
 
@@ -1187,7 +1187,7 @@ LInstruction* LChunkBuilder::DoApplyArguments(HApplyArguments* instr) {
1187
1187
 
1188
1188
  LInstruction* LChunkBuilder::DoPushArgument(HPushArgument* instr) {
1189
1189
  ++argument_count_;
1190
- LOperand* argument = UseOrConstant(instr->argument());
1190
+ LOperand* argument = UseAny(instr->argument());
1191
1191
  return new LPushArgument(argument);
1192
1192
  }
1193
1193
 
@@ -1366,13 +1366,23 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) {
1366
1366
  if (instr->representation().IsInteger32()) {
1367
1367
  ASSERT(instr->left()->representation().IsInteger32());
1368
1368
  ASSERT(instr->right()->representation().IsInteger32());
1369
- // The temporary operand is necessary to ensure that right is not allocated
1370
- // into edx.
1371
- LOperand* temp = FixedTemp(edx);
1372
- LOperand* value = UseFixed(instr->left(), eax);
1373
- LOperand* divisor = UseRegister(instr->right());
1374
- LModI* mod = new LModI(value, divisor, temp);
1375
- LInstruction* result = DefineFixed(mod, edx);
1369
+
1370
+ LInstruction* result;
1371
+ if (instr->HasPowerOf2Divisor()) {
1372
+ ASSERT(!instr->CheckFlag(HValue::kCanBeDivByZero));
1373
+ LOperand* value = UseRegisterAtStart(instr->left());
1374
+ LModI* mod = new LModI(value, UseOrConstant(instr->right()), NULL);
1375
+ result = DefineSameAsFirst(mod);
1376
+ } else {
1377
+ // The temporary operand is necessary to ensure that right is
1378
+ // not allocated into edx.
1379
+ LOperand* temp = FixedTemp(edx);
1380
+ LOperand* value = UseFixed(instr->left(), eax);
1381
+ LOperand* divisor = UseRegister(instr->right());
1382
+ LModI* mod = new LModI(value, divisor, temp);
1383
+ result = DefineFixed(mod, edx);
1384
+ }
1385
+
1376
1386
  return (instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
1377
1387
  instr->CheckFlag(HValue::kCanBeDivByZero))
1378
1388
  ? AssignEnvironment(result)
@@ -1384,8 +1394,8 @@ LInstruction* LChunkBuilder::DoMod(HMod* instr) {
1384
1394
  // We call a C function for double modulo. It can't trigger a GC.
1385
1395
  // We need to use fixed result register for the call.
1386
1396
  // TODO(fschneider): Allow any register as input registers.
1387
- LOperand* left = UseFixedDouble(instr->left(), xmm1);
1388
- LOperand* right = UseFixedDouble(instr->right(), xmm2);
1397
+ LOperand* left = UseFixedDouble(instr->left(), xmm2);
1398
+ LOperand* right = UseFixedDouble(instr->right(), xmm1);
1389
1399
  LArithmeticD* result = new LArithmeticD(Token::MOD, left, right);
1390
1400
  return MarkAsCall(DefineFixedDouble(result, xmm1), instr);
1391
1401
  }
@@ -1541,8 +1551,10 @@ LInstruction* LChunkBuilder::DoHasInstanceType(HHasInstanceType* instr) {
1541
1551
 
1542
1552
  LInstruction* LChunkBuilder::DoGetCachedArrayIndex(
1543
1553
  HGetCachedArrayIndex* instr) {
1544
- Abort("Unimplemented: %s", "DoGetCachedArrayIndex");
1545
- return NULL;
1554
+ ASSERT(instr->value()->representation().IsTagged());
1555
+ LOperand* value = UseRegisterAtStart(instr->value());
1556
+
1557
+ return DefineAsRegister(new LGetCachedArrayIndex(value));
1546
1558
  }
1547
1559
 
1548
1560
 
@@ -1575,9 +1587,10 @@ LInstruction* LChunkBuilder::DoFixedArrayLength(HFixedArrayLength* instr) {
1575
1587
  }
1576
1588
 
1577
1589
 
1578
- LInstruction* LChunkBuilder::DoPixelArrayLength(HPixelArrayLength* instr) {
1590
+ LInstruction* LChunkBuilder::DoExternalArrayLength(
1591
+ HExternalArrayLength* instr) {
1579
1592
  LOperand* array = UseRegisterAtStart(instr->value());
1580
- return DefineAsRegister(new LPixelArrayLength(array));
1593
+ return DefineAsRegister(new LExternalArrayLength(array));
1581
1594
  }
1582
1595
 
1583
1596
 
@@ -1670,7 +1683,7 @@ LInstruction* LChunkBuilder::DoChange(HChange* instr) {
1670
1683
 
1671
1684
  LInstruction* LChunkBuilder::DoCheckNonSmi(HCheckNonSmi* instr) {
1672
1685
  LOperand* value = UseRegisterAtStart(instr->value());
1673
- return AssignEnvironment(new LCheckSmi(value, zero));
1686
+ return AssignEnvironment(new LCheckNonSmi(value));
1674
1687
  }
1675
1688
 
1676
1689
 
@@ -1691,7 +1704,7 @@ LInstruction* LChunkBuilder::DoCheckPrototypeMaps(HCheckPrototypeMaps* instr) {
1691
1704
 
1692
1705
  LInstruction* LChunkBuilder::DoCheckSmi(HCheckSmi* instr) {
1693
1706
  LOperand* value = UseRegisterAtStart(instr->value());
1694
- return AssignEnvironment(new LCheckSmi(value, not_zero));
1707
+ return AssignEnvironment(new LCheckSmi(value));
1695
1708
  }
1696
1709
 
1697
1710
 
@@ -1732,14 +1745,22 @@ LInstruction* LChunkBuilder::DoConstant(HConstant* instr) {
1732
1745
  }
1733
1746
 
1734
1747
 
1735
- LInstruction* LChunkBuilder::DoLoadGlobal(HLoadGlobal* instr) {
1736
- LLoadGlobal* result = new LLoadGlobal;
1748
+ LInstruction* LChunkBuilder::DoLoadGlobalCell(HLoadGlobalCell* instr) {
1749
+ LLoadGlobalCell* result = new LLoadGlobalCell;
1737
1750
  return instr->check_hole_value()
1738
1751
  ? AssignEnvironment(DefineAsRegister(result))
1739
1752
  : DefineAsRegister(result);
1740
1753
  }
1741
1754
 
1742
1755
 
1756
+ LInstruction* LChunkBuilder::DoLoadGlobalGeneric(HLoadGlobalGeneric* instr) {
1757
+ LOperand* context = UseFixed(instr->context(), esi);
1758
+ LOperand* global_object = UseFixed(instr->global_object(), eax);
1759
+ LLoadGlobalGeneric* result = new LLoadGlobalGeneric(context, global_object);
1760
+ return MarkAsCall(DefineFixed(result, eax), instr);
1761
+ }
1762
+
1763
+
1743
1764
  LInstruction* LChunkBuilder::DoStoreGlobal(HStoreGlobal* instr) {
1744
1765
  LStoreGlobal* result = new LStoreGlobal(UseRegisterAtStart(instr->value()));
1745
1766
  return instr->check_hole_value() ? AssignEnvironment(result) : result;
@@ -1776,6 +1797,21 @@ LInstruction* LChunkBuilder::DoLoadNamedField(HLoadNamedField* instr) {
1776
1797
  }
1777
1798
 
1778
1799
 
1800
+ LInstruction* LChunkBuilder::DoLoadNamedFieldPolymorphic(
1801
+ HLoadNamedFieldPolymorphic* instr) {
1802
+ ASSERT(instr->representation().IsTagged());
1803
+ if (instr->need_generic()) {
1804
+ LOperand* obj = UseFixed(instr->object(), eax);
1805
+ LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj);
1806
+ return MarkAsCall(DefineFixed(result, eax), instr);
1807
+ } else {
1808
+ LOperand* obj = UseRegisterAtStart(instr->object());
1809
+ LLoadNamedFieldPolymorphic* result = new LLoadNamedFieldPolymorphic(obj);
1810
+ return AssignEnvironment(DefineAsRegister(result));
1811
+ }
1812
+ }
1813
+
1814
+
1779
1815
  LInstruction* LChunkBuilder::DoLoadNamedGeneric(HLoadNamedGeneric* instr) {
1780
1816
  LOperand* context = UseFixed(instr->context(), esi);
1781
1817
  LOperand* object = UseFixed(instr->object(), eax);
@@ -1798,10 +1834,10 @@ LInstruction* LChunkBuilder::DoLoadElements(HLoadElements* instr) {
1798
1834
  }
1799
1835
 
1800
1836
 
1801
- LInstruction* LChunkBuilder::DoLoadPixelArrayExternalPointer(
1802
- HLoadPixelArrayExternalPointer* instr) {
1837
+ LInstruction* LChunkBuilder::DoLoadExternalArrayPointer(
1838
+ HLoadExternalArrayPointer* instr) {
1803
1839
  LOperand* input = UseRegisterAtStart(instr->value());
1804
- return DefineAsRegister(new LLoadPixelArrayExternalPointer(input));
1840
+ return DefineAsRegister(new LLoadExternalArrayPointer(input));
1805
1841
  }
1806
1842
 
1807
1843
 
@@ -1816,16 +1852,24 @@ LInstruction* LChunkBuilder::DoLoadKeyedFastElement(
1816
1852
  }
1817
1853
 
1818
1854
 
1819
- LInstruction* LChunkBuilder::DoLoadPixelArrayElement(
1820
- HLoadPixelArrayElement* instr) {
1821
- ASSERT(instr->representation().IsInteger32());
1855
+ LInstruction* LChunkBuilder::DoLoadKeyedSpecializedArrayElement(
1856
+ HLoadKeyedSpecializedArrayElement* instr) {
1857
+ ExternalArrayType array_type = instr->array_type();
1858
+ Representation representation(instr->representation());
1859
+ ASSERT((representation.IsInteger32() && array_type != kExternalFloatArray) ||
1860
+ (representation.IsDouble() && array_type == kExternalFloatArray));
1822
1861
  ASSERT(instr->key()->representation().IsInteger32());
1823
- LOperand* external_pointer =
1824
- UseRegisterAtStart(instr->external_pointer());
1825
- LOperand* key = UseRegisterAtStart(instr->key());
1826
- LLoadPixelArrayElement* result =
1827
- new LLoadPixelArrayElement(external_pointer, key);
1828
- return DefineSameAsFirst(result);
1862
+ LOperand* external_pointer = UseRegister(instr->external_pointer());
1863
+ LOperand* key = UseRegister(instr->key());
1864
+ LLoadKeyedSpecializedArrayElement* result =
1865
+ new LLoadKeyedSpecializedArrayElement(external_pointer,
1866
+ key);
1867
+ LInstruction* load_instr = DefineAsRegister(result);
1868
+ // An unsigned int array load might overflow and cause a deopt, make sure it
1869
+ // has an environment.
1870
+ return (array_type == kExternalUnsignedIntArray)
1871
+ ? AssignEnvironment(load_instr)
1872
+ : load_instr;
1829
1873
  }
1830
1874
 
1831
1875
 
@@ -1858,20 +1902,39 @@ LInstruction* LChunkBuilder::DoStoreKeyedFastElement(
1858
1902
  }
1859
1903
 
1860
1904
 
1861
- LInstruction* LChunkBuilder::DoStorePixelArrayElement(
1862
- HStorePixelArrayElement* instr) {
1863
- ASSERT(instr->value()->representation().IsInteger32());
1905
+ LInstruction* LChunkBuilder::DoStoreKeyedSpecializedArrayElement(
1906
+ HStoreKeyedSpecializedArrayElement* instr) {
1907
+ Representation representation(instr->value()->representation());
1908
+ ExternalArrayType array_type = instr->array_type();
1909
+ ASSERT((representation.IsInteger32() && array_type != kExternalFloatArray) ||
1910
+ (representation.IsDouble() && array_type == kExternalFloatArray));
1864
1911
  ASSERT(instr->external_pointer()->representation().IsExternal());
1865
1912
  ASSERT(instr->key()->representation().IsInteger32());
1866
1913
 
1867
1914
  LOperand* external_pointer = UseRegister(instr->external_pointer());
1868
- LOperand* val = UseRegister(instr->value());
1869
1915
  LOperand* key = UseRegister(instr->key());
1870
- // The generated code requires that the clamped value is in a byte
1871
- // register. eax is an arbitrary choice to satisfy this requirement.
1872
- LOperand* clamped = FixedTemp(eax);
1916
+ LOperand* temp = NULL;
1917
+
1918
+ if (array_type == kExternalPixelArray) {
1919
+ // The generated code for pixel array stores requires that the clamped value
1920
+ // is in a byte register. eax is an arbitrary choice to satisfy this
1921
+ // requirement.
1922
+ temp = FixedTemp(eax);
1923
+ }
1873
1924
 
1874
- return new LStorePixelArrayElement(external_pointer, key, val, clamped);
1925
+ LOperand* val = NULL;
1926
+ if (array_type == kExternalByteArray ||
1927
+ array_type == kExternalUnsignedByteArray) {
1928
+ // We need a byte register in this case for the value.
1929
+ val = UseFixed(instr->value(), eax);
1930
+ } else {
1931
+ val = UseRegister(instr->value());
1932
+ }
1933
+
1934
+ return new LStoreKeyedSpecializedArrayElement(external_pointer,
1935
+ key,
1936
+ val,
1937
+ temp);
1875
1938
  }
1876
1939
 
1877
1940
 
@@ -1930,6 +1993,13 @@ LInstruction* LChunkBuilder::DoStringCharCodeAt(HStringCharCodeAt* instr) {
1930
1993
  }
1931
1994
 
1932
1995
 
1996
+ LInstruction* LChunkBuilder::DoStringCharFromCode(HStringCharFromCode* instr) {
1997
+ LOperand* char_code = UseRegister(instr->value());
1998
+ LStringCharFromCode* result = new LStringCharFromCode(char_code);
1999
+ return AssignPointerMap(DefineAsRegister(result));
2000
+ }
2001
+
2002
+
1933
2003
  LInstruction* LChunkBuilder::DoStringLength(HStringLength* instr) {
1934
2004
  LOperand* string = UseRegisterAtStart(instr->value());
1935
2005
  return DefineAsRegister(new LStringLength(string));
@@ -2009,6 +2079,13 @@ LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
2009
2079
  }
2010
2080
 
2011
2081
 
2082
+ LInstruction* LChunkBuilder::DoToFastProperties(HToFastProperties* instr) {
2083
+ LOperand* object = UseFixed(instr->value(), eax);
2084
+ LToFastProperties* result = new LToFastProperties(object);
2085
+ return MarkAsCall(DefineFixed(result, eax), instr);
2086
+ }
2087
+
2088
+
2012
2089
  LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) {
2013
2090
  LTypeof* result = new LTypeof(UseAtStart(instr->value()));
2014
2091
  return MarkAsCall(DefineFixed(result, eax), instr);
@@ -70,6 +70,7 @@ class LCodeGen;
70
70
  V(CheckFunction) \
71
71
  V(CheckInstanceType) \
72
72
  V(CheckMap) \
73
+ V(CheckNonSmi) \
73
74
  V(CheckPrototypeMaps) \
74
75
  V(CheckSmi) \
75
76
  V(ClassOfTest) \
@@ -89,9 +90,11 @@ class LCodeGen;
89
90
  V(Deoptimize) \
90
91
  V(DivI) \
91
92
  V(DoubleToI) \
93
+ V(ExternalArrayLength) \
92
94
  V(FixedArrayLength) \
93
95
  V(FunctionLiteral) \
94
96
  V(Gap) \
97
+ V(GetCachedArrayIndex) \
95
98
  V(GlobalObject) \
96
99
  V(GlobalReceiver) \
97
100
  V(Goto) \
@@ -116,14 +119,16 @@ class LCodeGen;
116
119
  V(LazyBailout) \
117
120
  V(LoadContextSlot) \
118
121
  V(LoadElements) \
122
+ V(LoadExternalArrayPointer) \
119
123
  V(LoadFunctionPrototype) \
120
- V(LoadGlobal) \
124
+ V(LoadGlobalCell) \
125
+ V(LoadGlobalGeneric) \
121
126
  V(LoadKeyedFastElement) \
122
127
  V(LoadKeyedGeneric) \
128
+ V(LoadKeyedSpecializedArrayElement) \
123
129
  V(LoadNamedField) \
130
+ V(LoadNamedFieldPolymorphic) \
124
131
  V(LoadNamedGeneric) \
125
- V(LoadPixelArrayElement) \
126
- V(LoadPixelArrayExternalPointer) \
127
132
  V(ModI) \
128
133
  V(MulI) \
129
134
  V(NumberTagD) \
@@ -133,7 +138,6 @@ class LCodeGen;
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,14 +150,16 @@ class LCodeGen;
146
150
  V(StoreGlobal) \
147
151
  V(StoreKeyedFastElement) \
148
152
  V(StoreKeyedGeneric) \
153
+ V(StoreKeyedSpecializedArrayElement) \
149
154
  V(StoreNamedField) \
150
155
  V(StoreNamedGeneric) \
151
- V(StorePixelArrayElement) \
152
156
  V(StringCharCodeAt) \
157
+ V(StringCharFromCode) \
153
158
  V(StringLength) \
154
159
  V(SubI) \
155
160
  V(TaggedToI) \
156
161
  V(Throw) \
162
+ V(ToFastProperties) \
157
163
  V(Typeof) \
158
164
  V(TypeofIs) \
159
165
  V(TypeofIsAndBranch) \
@@ -743,6 +749,17 @@ class LHasInstanceTypeAndBranch: public LControlInstruction<1, 1> {
743
749
  };
744
750
 
745
751
 
752
+ class LGetCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
753
+ public:
754
+ explicit LGetCachedArrayIndex(LOperand* value) {
755
+ inputs_[0] = value;
756
+ }
757
+
758
+ DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex, "get-cached-array-index")
759
+ DECLARE_HYDROGEN_ACCESSOR(GetCachedArrayIndex)
760
+ };
761
+
762
+
746
763
  class LHasCachedArrayIndex: public LTemplateInstruction<1, 1, 0> {
747
764
  public:
748
765
  explicit LHasCachedArrayIndex(LOperand* value) {
@@ -1024,14 +1041,14 @@ class LJSArrayLength: public LTemplateInstruction<1, 1, 0> {
1024
1041
  };
1025
1042
 
1026
1043
 
1027
- class LPixelArrayLength: public LTemplateInstruction<1, 1, 0> {
1044
+ class LExternalArrayLength: public LTemplateInstruction<1, 1, 0> {
1028
1045
  public:
1029
- explicit LPixelArrayLength(LOperand* value) {
1046
+ explicit LExternalArrayLength(LOperand* value) {
1030
1047
  inputs_[0] = value;
1031
1048
  }
1032
1049
 
1033
- DECLARE_CONCRETE_INSTRUCTION(PixelArrayLength, "pixel-array-length")
1034
- DECLARE_HYDROGEN_ACCESSOR(PixelArrayLength)
1050
+ DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength, "external-array-length")
1051
+ DECLARE_HYDROGEN_ACCESSOR(ExternalArrayLength)
1035
1052
  };
1036
1053
 
1037
1054
 
@@ -1156,6 +1173,21 @@ class LLoadNamedField: public LTemplateInstruction<1, 1, 0> {
1156
1173
 
1157
1174
  DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field")
1158
1175
  DECLARE_HYDROGEN_ACCESSOR(LoadNamedField)
1176
+
1177
+ LOperand* object() { return inputs_[0]; }
1178
+ };
1179
+
1180
+
1181
+ class LLoadNamedFieldPolymorphic: public LTemplateInstruction<1, 1, 0> {
1182
+ public:
1183
+ explicit LLoadNamedFieldPolymorphic(LOperand* object) {
1184
+ inputs_[0] = object;
1185
+ }
1186
+
1187
+ DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field-polymorphic")
1188
+ DECLARE_HYDROGEN_ACCESSOR(LoadNamedFieldPolymorphic)
1189
+
1190
+ LOperand* object() { return inputs_[0]; }
1159
1191
  };
1160
1192
 
1161
1193
 
@@ -1199,14 +1231,14 @@ class LLoadElements: public LTemplateInstruction<1, 1, 0> {
1199
1231
  };
1200
1232
 
1201
1233
 
1202
- class LLoadPixelArrayExternalPointer: public LTemplateInstruction<1, 1, 0> {
1234
+ class LLoadExternalArrayPointer: public LTemplateInstruction<1, 1, 0> {
1203
1235
  public:
1204
- explicit LLoadPixelArrayExternalPointer(LOperand* object) {
1236
+ explicit LLoadExternalArrayPointer(LOperand* object) {
1205
1237
  inputs_[0] = object;
1206
1238
  }
1207
1239
 
1208
- DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayExternalPointer,
1209
- "load-pixel-array-external-pointer")
1240
+ DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer,
1241
+ "load-external-array-pointer")
1210
1242
  };
1211
1243
 
1212
1244
 
@@ -1225,19 +1257,23 @@ class LLoadKeyedFastElement: public LTemplateInstruction<1, 2, 0> {
1225
1257
  };
1226
1258
 
1227
1259
 
1228
- class LLoadPixelArrayElement: public LTemplateInstruction<1, 2, 0> {
1260
+ class LLoadKeyedSpecializedArrayElement: public LTemplateInstruction<1, 2, 0> {
1229
1261
  public:
1230
- LLoadPixelArrayElement(LOperand* external_pointer, LOperand* key) {
1262
+ LLoadKeyedSpecializedArrayElement(LOperand* external_pointer,
1263
+ LOperand* key) {
1231
1264
  inputs_[0] = external_pointer;
1232
1265
  inputs_[1] = key;
1233
1266
  }
1234
1267
 
1235
- DECLARE_CONCRETE_INSTRUCTION(LoadPixelArrayElement,
1236
- "load-pixel-array-element")
1237
- DECLARE_HYDROGEN_ACCESSOR(LoadPixelArrayElement)
1268
+ DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,
1269
+ "load-keyed-specialized-array-element")
1270
+ DECLARE_HYDROGEN_ACCESSOR(LoadKeyedSpecializedArrayElement)
1238
1271
 
1239
1272
  LOperand* external_pointer() { return inputs_[0]; }
1240
1273
  LOperand* key() { return inputs_[1]; }
1274
+ ExternalArrayType array_type() const {
1275
+ return hydrogen()->array_type();
1276
+ }
1241
1277
  };
1242
1278
 
1243
1279
 
@@ -1257,10 +1293,27 @@ class LLoadKeyedGeneric: public LTemplateInstruction<1, 3, 0> {
1257
1293
  };
1258
1294
 
1259
1295
 
1260
- class LLoadGlobal: public LTemplateInstruction<1, 0, 0> {
1296
+ class LLoadGlobalCell: public LTemplateInstruction<1, 0, 0> {
1261
1297
  public:
1262
- DECLARE_CONCRETE_INSTRUCTION(LoadGlobal, "load-global")
1263
- DECLARE_HYDROGEN_ACCESSOR(LoadGlobal)
1298
+ DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell, "load-global-cell")
1299
+ DECLARE_HYDROGEN_ACCESSOR(LoadGlobalCell)
1300
+ };
1301
+
1302
+
1303
+ class LLoadGlobalGeneric: public LTemplateInstruction<1, 2, 0> {
1304
+ public:
1305
+ LLoadGlobalGeneric(LOperand* context, LOperand* global_object) {
1306
+ inputs_[0] = context;
1307
+ inputs_[1] = global_object;
1308
+ }
1309
+
1310
+ DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric, "load-global-generic")
1311
+ DECLARE_HYDROGEN_ACCESSOR(LoadGlobalGeneric)
1312
+
1313
+ LOperand* context() { return inputs_[0]; }
1314
+ LOperand* global_object() { return inputs_[1]; }
1315
+ Handle<Object> name() const { return hydrogen()->name(); }
1316
+ bool for_typeof() const { return hydrogen()->for_typeof(); }
1264
1317
  };
1265
1318
 
1266
1319
 
@@ -1477,7 +1530,7 @@ class LCallRuntime: public LTemplateInstruction<1, 0, 0> {
1477
1530
  DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime")
1478
1531
  DECLARE_HYDROGEN_ACCESSOR(CallRuntime)
1479
1532
 
1480
- Runtime::Function* function() const { return hydrogen()->function(); }
1533
+ const Runtime::Function* function() const { return hydrogen()->function(); }
1481
1534
  int arity() const { return hydrogen()->argument_count(); }
1482
1535
  };
1483
1536
 
@@ -1643,25 +1696,28 @@ class LStoreKeyedFastElement: public LTemplateInstruction<0, 3, 0> {
1643
1696
  };
1644
1697
 
1645
1698
 
1646
- class LStorePixelArrayElement: public LTemplateInstruction<0, 3, 1> {
1699
+ class LStoreKeyedSpecializedArrayElement: public LTemplateInstruction<0, 3, 1> {
1647
1700
  public:
1648
- LStorePixelArrayElement(LOperand* external_pointer,
1649
- LOperand* key,
1650
- LOperand* val,
1651
- LOperand* clamped) {
1701
+ LStoreKeyedSpecializedArrayElement(LOperand* external_pointer,
1702
+ LOperand* key,
1703
+ LOperand* val,
1704
+ LOperand* temp) {
1652
1705
  inputs_[0] = external_pointer;
1653
1706
  inputs_[1] = key;
1654
1707
  inputs_[2] = val;
1655
- temps_[0] = clamped;
1708
+ temps_[0] = temp;
1656
1709
  }
1657
1710
 
1658
- DECLARE_CONCRETE_INSTRUCTION(StorePixelArrayElement,
1659
- "store-pixel-array-element")
1660
- DECLARE_HYDROGEN_ACCESSOR(StorePixelArrayElement)
1711
+ DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,
1712
+ "store-keyed-specialized-array-element")
1713
+ DECLARE_HYDROGEN_ACCESSOR(StoreKeyedSpecializedArrayElement)
1661
1714
 
1662
1715
  LOperand* external_pointer() { return inputs_[0]; }
1663
1716
  LOperand* key() { return inputs_[1]; }
1664
1717
  LOperand* value() { return inputs_[2]; }
1718
+ ExternalArrayType array_type() const {
1719
+ return hydrogen()->array_type();
1720
+ }
1665
1721
  };
1666
1722
 
1667
1723
 
@@ -1703,6 +1759,19 @@ class LStringCharCodeAt: public LTemplateInstruction<1, 2, 0> {
1703
1759
  };
1704
1760
 
1705
1761
 
1762
+ class LStringCharFromCode: public LTemplateInstruction<1, 1, 0> {
1763
+ public:
1764
+ explicit LStringCharFromCode(LOperand* char_code) {
1765
+ inputs_[0] = char_code;
1766
+ }
1767
+
1768
+ DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code")
1769
+ DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode)
1770
+
1771
+ LOperand* char_code() { return inputs_[0]; }
1772
+ };
1773
+
1774
+
1706
1775
  class LStringLength: public LTemplateInstruction<1, 1, 0> {
1707
1776
  public:
1708
1777
  explicit LStringLength(LOperand* string) {
@@ -1766,20 +1835,21 @@ class LCheckPrototypeMaps: public LTemplateInstruction<0, 0, 1> {
1766
1835
 
1767
1836
  class LCheckSmi: public LTemplateInstruction<0, 1, 0> {
1768
1837
  public:
1769
- LCheckSmi(LOperand* value, Condition condition)
1770
- : condition_(condition) {
1838
+ explicit LCheckSmi(LOperand* value) {
1771
1839
  inputs_[0] = value;
1772
1840
  }
1773
1841
 
1774
- Condition condition() const { return condition_; }
1842
+ DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi")
1843
+ };
1775
1844
 
1776
- virtual void CompileToNative(LCodeGen* generator);
1777
- virtual const char* Mnemonic() const {
1778
- return (condition_ == zero) ? "check-non-smi" : "check-smi";
1845
+
1846
+ class LCheckNonSmi: public LTemplateInstruction<0, 1, 0> {
1847
+ public:
1848
+ explicit LCheckNonSmi(LOperand* value) {
1849
+ inputs_[0] = value;
1779
1850
  }
1780
1851
 
1781
- private:
1782
- Condition condition_;
1852
+ DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi")
1783
1853
  };
1784
1854
 
1785
1855
 
@@ -1819,6 +1889,17 @@ class LFunctionLiteral: public LTemplateInstruction<1, 0, 0> {
1819
1889
  };
1820
1890
 
1821
1891
 
1892
+ class LToFastProperties: public LTemplateInstruction<1, 1, 0> {
1893
+ public:
1894
+ explicit LToFastProperties(LOperand* value) {
1895
+ inputs_[0] = value;
1896
+ }
1897
+
1898
+ DECLARE_CONCRETE_INSTRUCTION(ToFastProperties, "to-fast-properties")
1899
+ DECLARE_HYDROGEN_ACCESSOR(ToFastProperties)
1900
+ };
1901
+
1902
+
1822
1903
  class LTypeof: public LTemplateInstruction<1, 1, 0> {
1823
1904
  public:
1824
1905
  explicit LTypeof(LOperand* value) {
@@ -1905,8 +1986,9 @@ class LStackCheck: public LTemplateInstruction<0, 0, 0> {
1905
1986
  class LChunkBuilder;
1906
1987
  class LChunk: public ZoneObject {
1907
1988
  public:
1908
- explicit LChunk(HGraph* graph)
1989
+ explicit LChunk(CompilationInfo* info, HGraph* graph)
1909
1990
  : spill_slot_count_(0),
1991
+ info_(info),
1910
1992
  graph_(graph),
1911
1993
  instructions_(32),
1912
1994
  pointer_maps_(8),
@@ -1923,6 +2005,7 @@ class LChunk: public ZoneObject {
1923
2005
  int ParameterAt(int index);
1924
2006
  int GetParameterStackSlot(int index) const;
1925
2007
  int spill_slot_count() const { return spill_slot_count_; }
2008
+ CompilationInfo* info() const { return info_; }
1926
2009
  HGraph* graph() const { return graph_; }
1927
2010
  const ZoneList<LInstruction*>* instructions() const { return &instructions_; }
1928
2011
  void AddGapMove(int index, LOperand* from, LOperand* to);
@@ -1959,6 +2042,7 @@ class LChunk: public ZoneObject {
1959
2042
 
1960
2043
  private:
1961
2044
  int spill_slot_count_;
2045
+ CompilationInfo* info_;
1962
2046
  HGraph* const graph_;
1963
2047
  ZoneList<LInstruction*> instructions_;
1964
2048
  ZoneList<LPointerMap*> pointer_maps_;
@@ -1968,8 +2052,9 @@ class LChunk: public ZoneObject {
1968
2052
 
1969
2053
  class LChunkBuilder BASE_EMBEDDED {
1970
2054
  public:
1971
- LChunkBuilder(HGraph* graph, LAllocator* allocator)
2055
+ LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator)
1972
2056
  : chunk_(NULL),
2057
+ info_(info),
1973
2058
  graph_(graph),
1974
2059
  status_(UNUSED),
1975
2060
  current_instruction_(NULL),
@@ -1998,6 +2083,7 @@ class LChunkBuilder BASE_EMBEDDED {
1998
2083
  };
1999
2084
 
2000
2085
  LChunk* chunk() const { return chunk_; }
2086
+ CompilationInfo* info() const { return info_; }
2001
2087
  HGraph* graph() const { return graph_; }
2002
2088
 
2003
2089
  bool is_unused() const { return status_ == UNUSED; }
@@ -2104,6 +2190,7 @@ class LChunkBuilder BASE_EMBEDDED {
2104
2190
  HArithmeticBinaryOperation* instr);
2105
2191
 
2106
2192
  LChunk* chunk_;
2193
+ CompilationInfo* info_;
2107
2194
  HGraph* const graph_;
2108
2195
  Status status_;
2109
2196
  HInstruction* current_instruction_;