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
@@ -108,7 +108,7 @@ class JavaScriptFrameConstants : public AllStatic {
108
108
  public:
109
109
  // FP-relative.
110
110
  static const int kLocal0Offset = StandardFrameConstants::kExpressionsOffset;
111
- static const int kSavedRegistersOffset = +2 * kPointerSize;
111
+ static const int kLastParameterOffset = +2 * kPointerSize;
112
112
  static const int kFunctionOffset = StandardFrameConstants::kMarkerOffset;
113
113
 
114
114
  // Caller SP-relative.
@@ -129,9 +129,9 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
129
129
  { Comment cmnt(masm_, "[ Allocate locals");
130
130
  int locals_count = scope()->num_stack_slots();
131
131
  if (locals_count == 1) {
132
- __ push(Immediate(Factory::undefined_value()));
132
+ __ push(Immediate(isolate()->factory()->undefined_value()));
133
133
  } else if (locals_count > 1) {
134
- __ mov(eax, Immediate(Factory::undefined_value()));
134
+ __ mov(eax, Immediate(isolate()->factory()->undefined_value()));
135
135
  for (int i = 0; i < locals_count; i++) {
136
136
  __ push(eax);
137
137
  }
@@ -197,12 +197,17 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
197
197
  // function, receiver address, parameter count.
198
198
  // The stub will rewrite receiver and parameter count if the previous
199
199
  // stack frame was an arguments adapter frame.
200
- ArgumentsAccessStub stub(ArgumentsAccessStub::NEW_OBJECT);
200
+ ArgumentsAccessStub stub(
201
+ is_strict_mode() ? ArgumentsAccessStub::NEW_STRICT
202
+ : ArgumentsAccessStub::NEW_NON_STRICT);
201
203
  __ CallStub(&stub);
202
- __ mov(ecx, eax); // Duplicate result.
204
+
205
+ Variable* arguments_shadow = scope()->arguments_shadow();
206
+ if (arguments_shadow != NULL) {
207
+ __ mov(ecx, eax); // Duplicate result.
208
+ Move(arguments_shadow->AsSlot(), ecx, ebx, edx);
209
+ }
203
210
  Move(arguments->AsSlot(), eax, ebx, edx);
204
- Slot* dot_arguments_slot = scope()->arguments_shadow()->AsSlot();
205
- Move(dot_arguments_slot, ecx, ebx, edx);
206
211
  }
207
212
 
208
213
  if (FLAG_trace) {
@@ -229,7 +234,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
229
234
  PrepareForBailout(info->function(), NO_REGISTERS);
230
235
  NearLabel ok;
231
236
  ExternalReference stack_limit =
232
- ExternalReference::address_of_stack_limit();
237
+ ExternalReference::address_of_stack_limit(isolate());
233
238
  __ cmp(esp, Operand::StaticVariable(stack_limit));
234
239
  __ j(above_equal, &ok, taken);
235
240
  StackCheckStub stub;
@@ -247,7 +252,7 @@ void FullCodeGenerator::Generate(CompilationInfo* info) {
247
252
  // Always emit a 'return undefined' in case control fell off the end of
248
253
  // the body.
249
254
  { Comment cmnt(masm_, "[ return <undefined>;");
250
- __ mov(eax, Factory::undefined_value());
255
+ __ mov(eax, isolate()->factory()->undefined_value());
251
256
  EmitReturnSequence();
252
257
  }
253
258
  }
@@ -261,7 +266,8 @@ void FullCodeGenerator::ClearAccumulator() {
261
266
  void FullCodeGenerator::EmitStackCheck(IterationStatement* stmt) {
262
267
  Comment cmnt(masm_, "[ Stack check");
263
268
  NearLabel ok;
264
- ExternalReference stack_limit = ExternalReference::address_of_stack_limit();
269
+ ExternalReference stack_limit =
270
+ ExternalReference::address_of_stack_limit(isolate());
265
271
  __ cmp(esp, Operand::StaticVariable(stack_limit));
266
272
  __ j(above_equal, &ok, taken);
267
273
  StackCheckStub stub;
@@ -322,23 +328,6 @@ void FullCodeGenerator::EmitReturnSequence() {
322
328
  }
323
329
 
324
330
 
325
- FullCodeGenerator::ConstantOperand FullCodeGenerator::GetConstantOperand(
326
- Token::Value op, Expression* left, Expression* right) {
327
- ASSERT(ShouldInlineSmiCase(op));
328
- if (op == Token::DIV || op == Token::MOD || op == Token::MUL) {
329
- // We never generate inlined constant smi operations for these.
330
- return kNoConstants;
331
- } else if (right->IsSmiLiteral()) {
332
- return kRightConstant;
333
- } else if (left->IsSmiLiteral() && !Token::IsShiftOp(op)) {
334
- // Don't inline shifts with constant left hand side.
335
- return kLeftConstant;
336
- } else {
337
- return kNoConstants;
338
- }
339
- }
340
-
341
-
342
331
  void FullCodeGenerator::EffectContext::Plug(Slot* slot) const {
343
332
  }
344
333
 
@@ -479,10 +468,10 @@ void FullCodeGenerator::AccumulatorValueContext::Plug(
479
468
  Label* materialize_false) const {
480
469
  NearLabel done;
481
470
  __ bind(materialize_true);
482
- __ mov(result_register(), Factory::true_value());
471
+ __ mov(result_register(), isolate()->factory()->true_value());
483
472
  __ jmp(&done);
484
473
  __ bind(materialize_false);
485
- __ mov(result_register(), Factory::false_value());
474
+ __ mov(result_register(), isolate()->factory()->false_value());
486
475
  __ bind(&done);
487
476
  }
488
477
 
@@ -492,10 +481,10 @@ void FullCodeGenerator::StackValueContext::Plug(
492
481
  Label* materialize_false) const {
493
482
  NearLabel done;
494
483
  __ bind(materialize_true);
495
- __ push(Immediate(Factory::true_value()));
484
+ __ push(Immediate(isolate()->factory()->true_value()));
496
485
  __ jmp(&done);
497
486
  __ bind(materialize_false);
498
- __ push(Immediate(Factory::false_value()));
487
+ __ push(Immediate(isolate()->factory()->false_value()));
499
488
  __ bind(&done);
500
489
  }
501
490
 
@@ -512,15 +501,17 @@ void FullCodeGenerator::EffectContext::Plug(bool flag) const {
512
501
 
513
502
 
514
503
  void FullCodeGenerator::AccumulatorValueContext::Plug(bool flag) const {
515
- Handle<Object> value =
516
- flag ? Factory::true_value() : Factory::false_value();
504
+ Handle<Object> value = flag
505
+ ? isolate()->factory()->true_value()
506
+ : isolate()->factory()->false_value();
517
507
  __ mov(result_register(), value);
518
508
  }
519
509
 
520
510
 
521
511
  void FullCodeGenerator::StackValueContext::Plug(bool flag) const {
522
- Handle<Object> value =
523
- flag ? Factory::true_value() : Factory::false_value();
512
+ Handle<Object> value = flag
513
+ ? isolate()->factory()->true_value()
514
+ : isolate()->factory()->false_value();
524
515
  __ push(Immediate(value));
525
516
  }
526
517
 
@@ -542,13 +533,13 @@ void FullCodeGenerator::DoTest(Label* if_true,
542
533
  Label* if_false,
543
534
  Label* fall_through) {
544
535
  // Emit the inlined tests assumed by the stub.
545
- __ cmp(result_register(), Factory::undefined_value());
536
+ __ cmp(result_register(), isolate()->factory()->undefined_value());
546
537
  __ j(equal, if_false);
547
- __ cmp(result_register(), Factory::true_value());
538
+ __ cmp(result_register(), isolate()->factory()->true_value());
548
539
  __ j(equal, if_true);
549
- __ cmp(result_register(), Factory::false_value());
540
+ __ cmp(result_register(), isolate()->factory()->false_value());
550
541
  __ j(equal, if_false);
551
- ASSERT_EQ(0, kSmiTag);
542
+ STATIC_ASSERT(kSmiTag == 0);
552
543
  __ test(result_register(), Operand(result_register()));
553
544
  __ j(zero, if_false);
554
545
  __ test(result_register(), Immediate(kSmiTagMask));
@@ -641,7 +632,7 @@ void FullCodeGenerator::PrepareForBailoutBeforeSplit(State state,
641
632
  }
642
633
 
643
634
  if (should_normalize) {
644
- __ cmp(eax, Factory::true_value());
635
+ __ cmp(eax, isolate()->factory()->true_value());
645
636
  Split(equal, if_true, if_false, NULL);
646
637
  __ bind(&skip);
647
638
  }
@@ -655,13 +646,14 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
655
646
  ASSERT(variable != NULL); // Must have been resolved.
656
647
  Slot* slot = variable->AsSlot();
657
648
  Property* prop = variable->AsProperty();
649
+
658
650
  if (slot != NULL) {
659
651
  switch (slot->type()) {
660
652
  case Slot::PARAMETER:
661
653
  case Slot::LOCAL:
662
654
  if (mode == Variable::CONST) {
663
655
  __ mov(Operand(ebp, SlotOffset(slot)),
664
- Immediate(Factory::the_hole_value()));
656
+ Immediate(isolate()->factory()->the_hole_value()));
665
657
  } else if (function != NULL) {
666
658
  VisitForAccumulatorValue(function);
667
659
  __ mov(Operand(ebp, SlotOffset(slot)), result_register());
@@ -683,7 +675,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
683
675
  }
684
676
  if (mode == Variable::CONST) {
685
677
  __ mov(ContextOperand(esi, slot->index()),
686
- Immediate(Factory::the_hole_value()));
678
+ Immediate(isolate()->factory()->the_hole_value()));
687
679
  // No write barrier since the hole value is in old space.
688
680
  } else if (function != NULL) {
689
681
  VisitForAccumulatorValue(function);
@@ -706,7 +698,7 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
706
698
  // 'undefined') because we may have a (legal) redeclaration and we
707
699
  // must not destroy the current value.
708
700
  if (mode == Variable::CONST) {
709
- __ push(Immediate(Factory::the_hole_value()));
701
+ __ push(Immediate(isolate()->factory()->the_hole_value()));
710
702
  } else if (function != NULL) {
711
703
  VisitForStackValue(function);
712
704
  } else {
@@ -734,13 +726,15 @@ void FullCodeGenerator::EmitDeclaration(Variable* variable,
734
726
  __ pop(edx);
735
727
  } else {
736
728
  __ mov(edx, eax);
737
- __ mov(eax, Factory::the_hole_value());
729
+ __ mov(eax, isolate()->factory()->the_hole_value());
738
730
  }
739
731
  ASSERT(prop->key()->AsLiteral() != NULL &&
740
732
  prop->key()->AsLiteral()->handle()->IsSmi());
741
733
  __ Set(ecx, Immediate(prop->key()->AsLiteral()->handle()));
742
734
 
743
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
735
+ Handle<Code> ic = is_strict_mode()
736
+ ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
737
+ : isolate()->builtins()->KeyedStoreIC_Initialize();
744
738
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
745
739
  }
746
740
  }
@@ -757,7 +751,8 @@ void FullCodeGenerator::DeclareGlobals(Handle<FixedArray> pairs) {
757
751
  __ push(esi); // The context is the first argument.
758
752
  __ push(Immediate(pairs));
759
753
  __ push(Immediate(Smi::FromInt(is_eval() ? 1 : 0)));
760
- __ CallRuntime(Runtime::kDeclareGlobals, 3);
754
+ __ push(Immediate(Smi::FromInt(strict_mode_flag())));
755
+ __ CallRuntime(Runtime::kDeclareGlobals, 4);
761
756
  // Return value is ignored.
762
757
  }
763
758
 
@@ -814,7 +809,6 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
814
809
  SetSourcePosition(clause->position());
815
810
  Handle<Code> ic = CompareIC::GetUninitialized(Token::EQ_STRICT);
816
811
  EmitCallIC(ic, &patch_site);
817
-
818
812
  __ test(eax, Operand(eax));
819
813
  __ j(not_equal, &next_test);
820
814
  __ Drop(1); // Switch value is no longer needed.
@@ -836,6 +830,7 @@ void FullCodeGenerator::VisitSwitchStatement(SwitchStatement* stmt) {
836
830
  Comment cmnt(masm_, "[ Case body");
837
831
  CaseClause* clause = clauses->at(i);
838
832
  __ bind(clause->body_target()->entry_label());
833
+ PrepareForBailoutForId(clause->EntryId(), NO_REGISTERS);
839
834
  VisitStatements(clause->statements());
840
835
  }
841
836
 
@@ -856,9 +851,9 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
856
851
  // ignore null and undefined in contrast to the specification; see
857
852
  // ECMA-262 section 12.6.4.
858
853
  VisitForAccumulatorValue(stmt->enumerable());
859
- __ cmp(eax, Factory::undefined_value());
854
+ __ cmp(eax, isolate()->factory()->undefined_value());
860
855
  __ j(equal, &exit);
861
- __ cmp(eax, Factory::null_value());
856
+ __ cmp(eax, isolate()->factory()->null_value());
862
857
  __ j(equal, &exit);
863
858
 
864
859
  // Convert the object to a JS object.
@@ -884,7 +879,7 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
884
879
  // Check that there are no elements. Register ecx contains the
885
880
  // current JS object we've reached through the prototype chain.
886
881
  __ cmp(FieldOperand(ecx, JSObject::kElementsOffset),
887
- Factory::empty_fixed_array());
882
+ isolate()->factory()->empty_fixed_array());
888
883
  __ j(not_equal, &call_runtime);
889
884
 
890
885
  // Check that instance descriptors are not empty so that we can
@@ -892,10 +887,10 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
892
887
  // prototype load.
893
888
  __ mov(ebx, FieldOperand(ecx, HeapObject::kMapOffset));
894
889
  __ mov(edx, FieldOperand(ebx, Map::kInstanceDescriptorsOffset));
895
- __ cmp(edx, Factory::empty_descriptor_array());
890
+ __ cmp(edx, isolate()->factory()->empty_descriptor_array());
896
891
  __ j(equal, &call_runtime);
897
892
 
898
- // Check that there in an enum cache in the non-empty instance
893
+ // Check that there is an enum cache in the non-empty instance
899
894
  // descriptors (edx). This is the case if the next enumeration
900
895
  // index field does not contain a smi.
901
896
  __ mov(edx, FieldOperand(edx, DescriptorArray::kEnumerationIndexOffset));
@@ -907,13 +902,13 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
907
902
  __ cmp(ecx, Operand(eax));
908
903
  __ j(equal, &check_prototype);
909
904
  __ mov(edx, FieldOperand(edx, DescriptorArray::kEnumCacheBridgeCacheOffset));
910
- __ cmp(edx, Factory::empty_fixed_array());
905
+ __ cmp(edx, isolate()->factory()->empty_fixed_array());
911
906
  __ j(not_equal, &call_runtime);
912
907
 
913
908
  // Load the prototype from the map and loop if non-null.
914
909
  __ bind(&check_prototype);
915
910
  __ mov(ecx, FieldOperand(ebx, Map::kPrototypeOffset));
916
- __ cmp(ecx, Factory::null_value());
911
+ __ cmp(ecx, isolate()->factory()->null_value());
917
912
  __ j(not_equal, &next);
918
913
 
919
914
  // The enum cache is valid. Load the map of the object being
@@ -931,7 +926,8 @@ void FullCodeGenerator::VisitForInStatement(ForInStatement* stmt) {
931
926
  // modification check. Otherwise, we got a fixed array, and we have
932
927
  // to do a slow check.
933
928
  NearLabel fixed_array;
934
- __ cmp(FieldOperand(eax, HeapObject::kMapOffset), Factory::meta_map());
929
+ __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
930
+ isolate()->factory()->meta_map());
935
931
  __ j(not_equal, &fixed_array);
936
932
 
937
933
  // We got a map in register eax. Get the enumeration cache from it.
@@ -1027,18 +1023,18 @@ void FullCodeGenerator::EmitNewClosure(Handle<SharedFunctionInfo> info,
1027
1023
  // doesn't just get a copy of the existing unoptimized code.
1028
1024
  if (!FLAG_always_opt &&
1029
1025
  !FLAG_prepare_always_opt &&
1026
+ !pretenure &&
1030
1027
  scope()->is_function_scope() &&
1031
- info->num_literals() == 0 &&
1032
- !pretenure) {
1033
- FastNewClosureStub stub;
1028
+ info->num_literals() == 0) {
1029
+ FastNewClosureStub stub(info->strict_mode() ? kStrictMode : kNonStrictMode);
1034
1030
  __ push(Immediate(info));
1035
1031
  __ CallStub(&stub);
1036
1032
  } else {
1037
1033
  __ push(esi);
1038
1034
  __ push(Immediate(info));
1039
1035
  __ push(Immediate(pretenure
1040
- ? Factory::true_value()
1041
- : Factory::false_value()));
1036
+ ? isolate()->factory()->true_value()
1037
+ : isolate()->factory()->false_value()));
1042
1038
  __ CallRuntime(Runtime::kNewClosure, 3);
1043
1039
  }
1044
1040
  context()->Plug(eax);
@@ -1090,7 +1086,7 @@ void FullCodeGenerator::EmitLoadGlobalSlotCheckExtensions(
1090
1086
  __ bind(&next);
1091
1087
  // Terminate at global context.
1092
1088
  __ cmp(FieldOperand(temp, HeapObject::kMapOffset),
1093
- Immediate(Factory::global_context_map()));
1089
+ Immediate(isolate()->factory()->global_context_map()));
1094
1090
  __ j(equal, &fast);
1095
1091
  // Check that extension is NULL.
1096
1092
  __ cmp(ContextOperand(temp, Context::EXTENSION_INDEX), Immediate(0));
@@ -1106,7 +1102,7 @@ void FullCodeGenerator::EmitLoadGlobalSlotCheckExtensions(
1106
1102
  // load IC call.
1107
1103
  __ mov(eax, GlobalObjectOperand());
1108
1104
  __ mov(ecx, slot->var()->name());
1109
- Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
1105
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1110
1106
  RelocInfo::Mode mode = (typeof_state == INSIDE_TYPEOF)
1111
1107
  ? RelocInfo::CODE_TARGET
1112
1108
  : RelocInfo::CODE_TARGET_CONTEXT;
@@ -1167,9 +1163,9 @@ void FullCodeGenerator::EmitDynamicLoadFromSlotFastCase(
1167
1163
  __ mov(eax,
1168
1164
  ContextSlotOperandCheckExtensions(potential_slot, slow));
1169
1165
  if (potential_slot->var()->mode() == Variable::CONST) {
1170
- __ cmp(eax, Factory::the_hole_value());
1166
+ __ cmp(eax, isolate()->factory()->the_hole_value());
1171
1167
  __ j(not_equal, done);
1172
- __ mov(eax, Factory::undefined_value());
1168
+ __ mov(eax, isolate()->factory()->undefined_value());
1173
1169
  }
1174
1170
  __ jmp(done);
1175
1171
  } else if (rewrite != NULL) {
@@ -1189,7 +1185,8 @@ void FullCodeGenerator::EmitDynamicLoadFromSlotFastCase(
1189
1185
  ContextSlotOperandCheckExtensions(obj_proxy->var()->AsSlot(),
1190
1186
  slow));
1191
1187
  __ mov(eax, Immediate(key_literal->handle()));
1192
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
1188
+ Handle<Code> ic =
1189
+ isolate()->builtins()->KeyedLoadIC_Initialize();
1193
1190
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1194
1191
  __ jmp(done);
1195
1192
  }
@@ -1212,7 +1209,7 @@ void FullCodeGenerator::EmitVariableLoad(Variable* var) {
1212
1209
  // object on the stack.
1213
1210
  __ mov(eax, GlobalObjectOperand());
1214
1211
  __ mov(ecx, var->name());
1215
- Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
1212
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1216
1213
  EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT);
1217
1214
  context()->Plug(eax);
1218
1215
 
@@ -1242,9 +1239,9 @@ void FullCodeGenerator::EmitVariableLoad(Variable* var) {
1242
1239
  NearLabel done;
1243
1240
  MemOperand slot_operand = EmitSlotSearch(slot, eax);
1244
1241
  __ mov(eax, slot_operand);
1245
- __ cmp(eax, Factory::the_hole_value());
1242
+ __ cmp(eax, isolate()->factory()->the_hole_value());
1246
1243
  __ j(not_equal, &done);
1247
- __ mov(eax, Factory::undefined_value());
1244
+ __ mov(eax, isolate()->factory()->undefined_value());
1248
1245
  __ bind(&done);
1249
1246
  context()->Plug(eax);
1250
1247
  } else {
@@ -1275,7 +1272,7 @@ void FullCodeGenerator::EmitVariableLoad(Variable* var) {
1275
1272
  __ mov(eax, Immediate(key_literal->handle()));
1276
1273
 
1277
1274
  // Do a keyed property load.
1278
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
1275
+ Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
1279
1276
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1280
1277
 
1281
1278
  // Drop key and object left on the stack by IC.
@@ -1297,7 +1294,7 @@ void FullCodeGenerator::VisitRegExpLiteral(RegExpLiteral* expr) {
1297
1294
  int literal_offset =
1298
1295
  FixedArray::kHeaderSize + expr->literal_index() * kPointerSize;
1299
1296
  __ mov(ebx, FieldOperand(ecx, literal_offset));
1300
- __ cmp(ebx, Factory::undefined_value());
1297
+ __ cmp(ebx, isolate()->factory()->undefined_value());
1301
1298
  __ j(not_equal, &materialized);
1302
1299
 
1303
1300
  // Create regexp literal using runtime function
@@ -1344,7 +1341,13 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1344
1341
  __ push(FieldOperand(edi, JSFunction::kLiteralsOffset));
1345
1342
  __ push(Immediate(Smi::FromInt(expr->literal_index())));
1346
1343
  __ push(Immediate(expr->constant_properties()));
1347
- __ push(Immediate(Smi::FromInt(expr->fast_elements() ? 1 : 0)));
1344
+ int flags = expr->fast_elements()
1345
+ ? ObjectLiteral::kFastElements
1346
+ : ObjectLiteral::kNoFlags;
1347
+ flags |= expr->has_function()
1348
+ ? ObjectLiteral::kHasFunction
1349
+ : ObjectLiteral::kNoFlags;
1350
+ __ push(Immediate(Smi::FromInt(flags)));
1348
1351
  if (expr->depth() > 1) {
1349
1352
  __ CallRuntime(Runtime::kCreateObjectLiteral, 4);
1350
1353
  } else {
@@ -1380,7 +1383,9 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1380
1383
  VisitForAccumulatorValue(value);
1381
1384
  __ mov(ecx, Immediate(key->handle()));
1382
1385
  __ mov(edx, Operand(esp, 0));
1383
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
1386
+ Handle<Code> ic = is_strict_mode()
1387
+ ? isolate()->builtins()->StoreIC_Initialize_Strict()
1388
+ : isolate()->builtins()->StoreIC_Initialize();
1384
1389
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1385
1390
  PrepareForBailoutForId(key->id(), NO_REGISTERS);
1386
1391
  } else {
@@ -1394,7 +1399,8 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1394
1399
  VisitForStackValue(key);
1395
1400
  VisitForStackValue(value);
1396
1401
  if (property->emit_store()) {
1397
- __ CallRuntime(Runtime::kSetProperty, 3);
1402
+ __ push(Immediate(Smi::FromInt(NONE))); // PropertyAttributes
1403
+ __ CallRuntime(Runtime::kSetProperty, 4);
1398
1404
  } else {
1399
1405
  __ Drop(3);
1400
1406
  }
@@ -1413,6 +1419,12 @@ void FullCodeGenerator::VisitObjectLiteral(ObjectLiteral* expr) {
1413
1419
  }
1414
1420
  }
1415
1421
 
1422
+ if (expr->has_function()) {
1423
+ ASSERT(result_saved);
1424
+ __ push(Operand(esp, 0));
1425
+ __ CallRuntime(Runtime::kToFastProperties, 1);
1426
+ }
1427
+
1416
1428
  if (result_saved) {
1417
1429
  context()->PlugTOS();
1418
1430
  } else {
@@ -1431,12 +1443,13 @@ void FullCodeGenerator::VisitArrayLiteral(ArrayLiteral* expr) {
1431
1443
  __ push(FieldOperand(ebx, JSFunction::kLiteralsOffset));
1432
1444
  __ push(Immediate(Smi::FromInt(expr->literal_index())));
1433
1445
  __ push(Immediate(expr->constant_elements()));
1434
- if (expr->constant_elements()->map() == Heap::fixed_cow_array_map()) {
1446
+ if (expr->constant_elements()->map() ==
1447
+ isolate()->heap()->fixed_cow_array_map()) {
1435
1448
  ASSERT(expr->depth() == 1);
1436
1449
  FastCloneShallowArrayStub stub(
1437
1450
  FastCloneShallowArrayStub::COPY_ON_WRITE_ELEMENTS, length);
1438
1451
  __ CallStub(&stub);
1439
- __ IncrementCounter(&Counters::cow_arrays_created_stub, 1);
1452
+ __ IncrementCounter(isolate()->counters()->cow_arrays_created_stub(), 1);
1440
1453
  } else if (expr->depth() > 1) {
1441
1454
  __ CallRuntime(Runtime::kCreateArrayLiteral, 3);
1442
1455
  } else if (length > FastCloneShallowArrayStub::kMaximumClonedLength) {
@@ -1550,36 +1563,29 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1550
1563
  }
1551
1564
  }
1552
1565
 
1566
+ // For compound assignments we need another deoptimization point after the
1567
+ // variable/property load.
1553
1568
  if (expr->is_compound()) {
1554
1569
  { AccumulatorValueContext context(this);
1555
1570
  switch (assign_type) {
1556
1571
  case VARIABLE:
1557
1572
  EmitVariableLoad(expr->target()->AsVariableProxy()->var());
1573
+ PrepareForBailout(expr->target(), TOS_REG);
1558
1574
  break;
1559
1575
  case NAMED_PROPERTY:
1560
1576
  EmitNamedPropertyLoad(property);
1577
+ PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1561
1578
  break;
1562
1579
  case KEYED_PROPERTY:
1563
1580
  EmitKeyedPropertyLoad(property);
1581
+ PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1564
1582
  break;
1565
1583
  }
1566
1584
  }
1567
1585
 
1568
- // For property compound assignments we need another deoptimization
1569
- // point after the property load.
1570
- if (property != NULL) {
1571
- PrepareForBailoutForId(expr->CompoundLoadId(), TOS_REG);
1572
- }
1573
-
1574
1586
  Token::Value op = expr->binary_op();
1575
- ConstantOperand constant = ShouldInlineSmiCase(op)
1576
- ? GetConstantOperand(op, expr->target(), expr->value())
1577
- : kNoConstants;
1578
- ASSERT(constant == kRightConstant || constant == kNoConstants);
1579
- if (constant == kNoConstants) {
1580
- __ push(eax); // Left operand goes on the stack.
1581
- VisitForAccumulatorValue(expr->value());
1582
- }
1587
+ __ push(eax); // Left operand goes on the stack.
1588
+ VisitForAccumulatorValue(expr->value());
1583
1589
 
1584
1590
  OverwriteMode mode = expr->value()->ResultOverwriteAllowed()
1585
1591
  ? OVERWRITE_RIGHT
@@ -1591,8 +1597,7 @@ void FullCodeGenerator::VisitAssignment(Assignment* expr) {
1591
1597
  op,
1592
1598
  mode,
1593
1599
  expr->target(),
1594
- expr->value(),
1595
- constant);
1600
+ expr->value());
1596
1601
  } else {
1597
1602
  EmitBinaryOp(op, mode);
1598
1603
  }
@@ -1628,232 +1633,23 @@ void FullCodeGenerator::EmitNamedPropertyLoad(Property* prop) {
1628
1633
  SetSourcePosition(prop->position());
1629
1634
  Literal* key = prop->key()->AsLiteral();
1630
1635
  __ mov(ecx, Immediate(key->handle()));
1631
- Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
1636
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
1632
1637
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1633
1638
  }
1634
1639
 
1635
1640
 
1636
1641
  void FullCodeGenerator::EmitKeyedPropertyLoad(Property* prop) {
1637
1642
  SetSourcePosition(prop->position());
1638
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
1643
+ Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
1639
1644
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1640
1645
  }
1641
1646
 
1642
1647
 
1643
- void FullCodeGenerator::EmitConstantSmiAdd(Expression* expr,
1644
- OverwriteMode mode,
1645
- bool left_is_constant_smi,
1646
- Smi* value) {
1647
- NearLabel call_stub, done;
1648
- // Optimistically add smi value with unknown object. If result overflows or is
1649
- // not a smi then we had either a smi overflow or added a smi with a tagged
1650
- // pointer.
1651
- __ add(Operand(eax), Immediate(value));
1652
- __ j(overflow, &call_stub);
1653
- JumpPatchSite patch_site(masm_);
1654
- patch_site.EmitJumpIfSmi(eax, &done);
1655
-
1656
- // Undo the optimistic add operation and call the shared stub.
1657
- __ bind(&call_stub);
1658
- __ sub(Operand(eax), Immediate(value));
1659
- TypeRecordingBinaryOpStub stub(Token::ADD, mode);
1660
- if (left_is_constant_smi) {
1661
- __ mov(edx, Immediate(value));
1662
- } else {
1663
- __ mov(edx, eax);
1664
- __ mov(eax, Immediate(value));
1665
- }
1666
- EmitCallIC(stub.GetCode(), &patch_site);
1667
-
1668
- __ bind(&done);
1669
- context()->Plug(eax);
1670
- }
1671
-
1672
-
1673
- void FullCodeGenerator::EmitConstantSmiSub(Expression* expr,
1674
- OverwriteMode mode,
1675
- bool left_is_constant_smi,
1676
- Smi* value) {
1677
- NearLabel call_stub, done;
1678
- // Optimistically subtract smi value with unknown object. If result overflows
1679
- // or is not a smi then we had either a smi overflow or added a smi with a
1680
- // tagged pointer.
1681
- if (left_is_constant_smi) {
1682
- __ mov(ecx, eax);
1683
- __ mov(eax, Immediate(value));
1684
- __ sub(Operand(eax), ecx);
1685
- } else {
1686
- __ sub(Operand(eax), Immediate(value));
1687
- }
1688
- __ j(overflow, &call_stub);
1689
- JumpPatchSite patch_site(masm_);
1690
- patch_site.EmitJumpIfSmi(eax, &done);
1691
-
1692
- __ bind(&call_stub);
1693
- if (left_is_constant_smi) {
1694
- __ mov(edx, Immediate(value));
1695
- __ mov(eax, ecx);
1696
- } else {
1697
- __ add(Operand(eax), Immediate(value)); // Undo the subtraction.
1698
- __ mov(edx, eax);
1699
- __ mov(eax, Immediate(value));
1700
- }
1701
- TypeRecordingBinaryOpStub stub(Token::SUB, mode);
1702
- EmitCallIC(stub.GetCode(), &patch_site);
1703
-
1704
- __ bind(&done);
1705
- context()->Plug(eax);
1706
- }
1707
-
1708
-
1709
- void FullCodeGenerator::EmitConstantSmiShiftOp(Expression* expr,
1710
- Token::Value op,
1711
- OverwriteMode mode,
1712
- Smi* value) {
1713
- NearLabel call_stub, smi_case, done;
1714
- int shift_value = value->value() & 0x1f;
1715
-
1716
- JumpPatchSite patch_site(masm_);
1717
- patch_site.EmitJumpIfSmi(eax, &smi_case);
1718
-
1719
- // Call stub.
1720
- __ bind(&call_stub);
1721
- __ mov(edx, eax);
1722
- __ mov(eax, Immediate(value));
1723
- TypeRecordingBinaryOpStub stub(op, mode);
1724
- EmitCallIC(stub.GetCode(), &patch_site);
1725
- __ jmp(&done);
1726
-
1727
- // Smi case.
1728
- __ bind(&smi_case);
1729
- switch (op) {
1730
- case Token::SHL:
1731
- if (shift_value != 0) {
1732
- __ mov(edx, eax);
1733
- if (shift_value > 1) {
1734
- __ shl(edx, shift_value - 1);
1735
- }
1736
- // Convert int result to smi, checking that it is in int range.
1737
- STATIC_ASSERT(kSmiTagSize == 1); // Adjust code if not the case.
1738
- __ add(edx, Operand(edx));
1739
- __ j(overflow, &call_stub);
1740
- __ mov(eax, edx); // Put result back into eax.
1741
- }
1742
- break;
1743
- case Token::SAR:
1744
- if (shift_value != 0) {
1745
- __ sar(eax, shift_value);
1746
- __ and_(eax, ~kSmiTagMask);
1747
- }
1748
- break;
1749
- case Token::SHR:
1750
- // SHR must return a positive value. When shifting by 0 or 1 we need to
1751
- // check that smi tagging the result will not create a negative value.
1752
- if (shift_value < 2) {
1753
- __ mov(edx, eax);
1754
- __ SmiUntag(edx);
1755
- __ shr(edx, shift_value);
1756
- __ test(edx, Immediate(0xc0000000));
1757
- __ j(not_zero, &call_stub);
1758
- __ SmiTag(edx);
1759
- __ mov(eax, edx); // Put result back into eax.
1760
- } else {
1761
- __ SmiUntag(eax);
1762
- __ shr(eax, shift_value);
1763
- __ SmiTag(eax);
1764
- }
1765
- break;
1766
- default:
1767
- UNREACHABLE();
1768
- }
1769
-
1770
- __ bind(&done);
1771
- context()->Plug(eax);
1772
- }
1773
-
1774
-
1775
- void FullCodeGenerator::EmitConstantSmiBitOp(Expression* expr,
1776
- Token::Value op,
1777
- OverwriteMode mode,
1778
- Smi* value) {
1779
- NearLabel smi_case, done;
1780
-
1781
- JumpPatchSite patch_site(masm_);
1782
- patch_site.EmitJumpIfSmi(eax, &smi_case);
1783
-
1784
- // The order of the arguments does not matter for bit-ops with a
1785
- // constant operand.
1786
- __ mov(edx, Immediate(value));
1787
- TypeRecordingBinaryOpStub stub(op, mode);
1788
- EmitCallIC(stub.GetCode(), &patch_site);
1789
- __ jmp(&done);
1790
-
1791
- // Smi case.
1792
- __ bind(&smi_case);
1793
- switch (op) {
1794
- case Token::BIT_OR:
1795
- __ or_(Operand(eax), Immediate(value));
1796
- break;
1797
- case Token::BIT_XOR:
1798
- __ xor_(Operand(eax), Immediate(value));
1799
- break;
1800
- case Token::BIT_AND:
1801
- __ and_(Operand(eax), Immediate(value));
1802
- break;
1803
- default:
1804
- UNREACHABLE();
1805
- }
1806
-
1807
- __ bind(&done);
1808
- context()->Plug(eax);
1809
- }
1810
-
1811
-
1812
- void FullCodeGenerator::EmitConstantSmiBinaryOp(Expression* expr,
1813
- Token::Value op,
1814
- OverwriteMode mode,
1815
- bool left_is_constant_smi,
1816
- Smi* value) {
1817
- switch (op) {
1818
- case Token::BIT_OR:
1819
- case Token::BIT_XOR:
1820
- case Token::BIT_AND:
1821
- EmitConstantSmiBitOp(expr, op, mode, value);
1822
- break;
1823
- case Token::SHL:
1824
- case Token::SAR:
1825
- case Token::SHR:
1826
- ASSERT(!left_is_constant_smi);
1827
- EmitConstantSmiShiftOp(expr, op, mode, value);
1828
- break;
1829
- case Token::ADD:
1830
- EmitConstantSmiAdd(expr, mode, left_is_constant_smi, value);
1831
- break;
1832
- case Token::SUB:
1833
- EmitConstantSmiSub(expr, mode, left_is_constant_smi, value);
1834
- break;
1835
- default:
1836
- UNREACHABLE();
1837
- }
1838
- }
1839
-
1840
-
1841
1648
  void FullCodeGenerator::EmitInlineSmiBinaryOp(Expression* expr,
1842
1649
  Token::Value op,
1843
1650
  OverwriteMode mode,
1844
1651
  Expression* left,
1845
- Expression* right,
1846
- ConstantOperand constant) {
1847
- if (constant == kRightConstant) {
1848
- Smi* value = Smi::cast(*right->AsLiteral()->handle());
1849
- EmitConstantSmiBinaryOp(expr, op, mode, false, value);
1850
- return;
1851
- } else if (constant == kLeftConstant) {
1852
- Smi* value = Smi::cast(*left->AsLiteral()->handle());
1853
- EmitConstantSmiBinaryOp(expr, op, mode, true, value);
1854
- return;
1855
- }
1856
-
1652
+ Expression* right) {
1857
1653
  // Do combined smi check of the operands. Left operand is on the
1858
1654
  // stack. Right operand is in eax.
1859
1655
  NearLabel done, smi_case, stub_call;
@@ -1985,7 +1781,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
1985
1781
  __ mov(edx, eax);
1986
1782
  __ pop(eax); // Restore value.
1987
1783
  __ mov(ecx, prop->key()->AsLiteral()->handle());
1988
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
1784
+ Handle<Code> ic = is_strict_mode()
1785
+ ? isolate()->builtins()->StoreIC_Initialize_Strict()
1786
+ : isolate()->builtins()->StoreIC_Initialize();
1989
1787
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
1990
1788
  break;
1991
1789
  }
@@ -2006,7 +1804,9 @@ void FullCodeGenerator::EmitAssignment(Expression* expr, int bailout_ast_id) {
2006
1804
  __ pop(edx);
2007
1805
  }
2008
1806
  __ pop(eax); // Restore value.
2009
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
1807
+ Handle<Code> ic = is_strict_mode()
1808
+ ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
1809
+ : isolate()->builtins()->KeyedStoreIC_Initialize();
2010
1810
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
2011
1811
  break;
2012
1812
  }
@@ -2030,9 +1830,9 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
2030
1830
  // ecx, and the global object on the stack.
2031
1831
  __ mov(ecx, var->name());
2032
1832
  __ mov(edx, GlobalObjectOperand());
2033
- Handle<Code> ic(Builtins::builtin(
2034
- is_strict() ? Builtins::StoreIC_Initialize_Strict
2035
- : Builtins::StoreIC_Initialize));
1833
+ Handle<Code> ic = is_strict_mode()
1834
+ ? isolate()->builtins()->StoreIC_Initialize_Strict()
1835
+ : isolate()->builtins()->StoreIC_Initialize();
2036
1836
  EmitCallIC(ic, RelocInfo::CODE_TARGET_CONTEXT);
2037
1837
 
2038
1838
  } else if (op == Token::INIT_CONST) {
@@ -2049,14 +1849,14 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
2049
1849
  break;
2050
1850
  case Slot::LOCAL:
2051
1851
  __ mov(edx, Operand(ebp, SlotOffset(slot)));
2052
- __ cmp(edx, Factory::the_hole_value());
1852
+ __ cmp(edx, isolate()->factory()->the_hole_value());
2053
1853
  __ j(not_equal, &skip);
2054
1854
  __ mov(Operand(ebp, SlotOffset(slot)), eax);
2055
1855
  break;
2056
1856
  case Slot::CONTEXT: {
2057
1857
  __ mov(ecx, ContextOperand(esi, Context::FCONTEXT_INDEX));
2058
1858
  __ mov(edx, ContextOperand(ecx, slot->index()));
2059
- __ cmp(edx, Factory::the_hole_value());
1859
+ __ cmp(edx, isolate()->factory()->the_hole_value());
2060
1860
  __ j(not_equal, &skip);
2061
1861
  __ mov(ContextOperand(ecx, slot->index()), eax);
2062
1862
  int offset = Context::SlotOffset(slot->index());
@@ -2101,7 +1901,8 @@ void FullCodeGenerator::EmitVariableAssignment(Variable* var,
2101
1901
  __ push(eax); // Value.
2102
1902
  __ push(esi); // Context.
2103
1903
  __ push(Immediate(var->name()));
2104
- __ CallRuntime(Runtime::kStoreContextSlot, 3);
1904
+ __ push(Immediate(Smi::FromInt(strict_mode_flag())));
1905
+ __ CallRuntime(Runtime::kStoreContextSlot, 4);
2105
1906
  break;
2106
1907
  }
2107
1908
  }
@@ -2132,7 +1933,9 @@ void FullCodeGenerator::EmitNamedPropertyAssignment(Assignment* expr) {
2132
1933
  } else {
2133
1934
  __ pop(edx);
2134
1935
  }
2135
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
1936
+ Handle<Code> ic = is_strict_mode()
1937
+ ? isolate()->builtins()->StoreIC_Initialize_Strict()
1938
+ : isolate()->builtins()->StoreIC_Initialize();
2136
1939
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
2137
1940
 
2138
1941
  // If the assignment ends an initialization block, revert to fast case.
@@ -2170,7 +1973,9 @@ void FullCodeGenerator::EmitKeyedPropertyAssignment(Assignment* expr) {
2170
1973
  }
2171
1974
  // Record source code position before IC call.
2172
1975
  SetSourcePosition(expr->position());
2173
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
1976
+ Handle<Code> ic = is_strict_mode()
1977
+ ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
1978
+ : isolate()->builtins()->KeyedStoreIC_Initialize();
2174
1979
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
2175
1980
 
2176
1981
  // If the assignment ends an initialization block, revert to fast case.
@@ -2220,7 +2025,8 @@ void FullCodeGenerator::EmitCallWithIC(Call* expr,
2220
2025
  // Record source position of the IC call.
2221
2026
  SetSourcePosition(expr->position());
2222
2027
  InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP;
2223
- Handle<Code> ic = StubCache::ComputeCallInitialize(arg_count, in_loop);
2028
+ Handle<Code> ic = isolate()->stub_cache()->ComputeCallInitialize(
2029
+ arg_count, in_loop);
2224
2030
  EmitCallIC(ic, mode);
2225
2031
  RecordJSReturnSite(expr);
2226
2032
  // Restore context register.
@@ -2252,7 +2058,8 @@ void FullCodeGenerator::EmitKeyedCallWithIC(Call* expr,
2252
2058
  // Record source position of the IC call.
2253
2059
  SetSourcePosition(expr->position());
2254
2060
  InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP;
2255
- Handle<Code> ic = StubCache::ComputeKeyedCallInitialize(arg_count, in_loop);
2061
+ Handle<Code> ic = isolate()->stub_cache()->ComputeKeyedCallInitialize(
2062
+ arg_count, in_loop);
2256
2063
  __ mov(ecx, Operand(esp, (arg_count + 1) * kPointerSize)); // Key.
2257
2064
  EmitCallIC(ic, mode);
2258
2065
  RecordJSReturnSite(expr);
@@ -2283,6 +2090,27 @@ void FullCodeGenerator::EmitCallWithStub(Call* expr) {
2283
2090
  }
2284
2091
 
2285
2092
 
2093
+ void FullCodeGenerator::EmitResolvePossiblyDirectEval(ResolveEvalFlag flag,
2094
+ int arg_count) {
2095
+ // Push copy of the first argument or undefined if it doesn't exist.
2096
+ if (arg_count > 0) {
2097
+ __ push(Operand(esp, arg_count * kPointerSize));
2098
+ } else {
2099
+ __ push(Immediate(isolate()->factory()->undefined_value()));
2100
+ }
2101
+
2102
+ // Push the receiver of the enclosing function.
2103
+ __ push(Operand(ebp, (2 + scope()->num_parameters()) * kPointerSize));
2104
+
2105
+ // Push the strict mode flag.
2106
+ __ push(Immediate(Smi::FromInt(strict_mode_flag())));
2107
+
2108
+ __ CallRuntime(flag == SKIP_CONTEXT_LOOKUP
2109
+ ? Runtime::kResolvePossiblyDirectEvalNoLookup
2110
+ : Runtime::kResolvePossiblyDirectEval, 4);
2111
+ }
2112
+
2113
+
2286
2114
  void FullCodeGenerator::VisitCall(Call* expr) {
2287
2115
  #ifdef DEBUG
2288
2116
  // We want to verify that RecordJSReturnSite gets called on all paths
@@ -2304,28 +2132,37 @@ void FullCodeGenerator::VisitCall(Call* expr) {
2304
2132
  { PreservePositionScope pos_scope(masm()->positions_recorder());
2305
2133
  VisitForStackValue(fun);
2306
2134
  // Reserved receiver slot.
2307
- __ push(Immediate(Factory::undefined_value()));
2135
+ __ push(Immediate(isolate()->factory()->undefined_value()));
2308
2136
 
2309
2137
  // Push the arguments.
2310
2138
  for (int i = 0; i < arg_count; i++) {
2311
2139
  VisitForStackValue(args->at(i));
2312
2140
  }
2313
2141
 
2314
- // Push copy of the function - found below the arguments.
2315
- __ push(Operand(esp, (arg_count + 1) * kPointerSize));
2316
-
2317
- // Push copy of the first argument or undefined if it doesn't exist.
2318
- if (arg_count > 0) {
2319
- __ push(Operand(esp, arg_count * kPointerSize));
2320
- } else {
2321
- __ push(Immediate(Factory::undefined_value()));
2142
+ // If we know that eval can only be shadowed by eval-introduced
2143
+ // variables we attempt to load the global eval function directly
2144
+ // in generated code. If we succeed, there is no need to perform a
2145
+ // context lookup in the runtime system.
2146
+ Label done;
2147
+ if (var->AsSlot() != NULL && var->mode() == Variable::DYNAMIC_GLOBAL) {
2148
+ Label slow;
2149
+ EmitLoadGlobalSlotCheckExtensions(var->AsSlot(),
2150
+ NOT_INSIDE_TYPEOF,
2151
+ &slow);
2152
+ // Push the function and resolve eval.
2153
+ __ push(eax);
2154
+ EmitResolvePossiblyDirectEval(SKIP_CONTEXT_LOOKUP, arg_count);
2155
+ __ jmp(&done);
2156
+ __ bind(&slow);
2322
2157
  }
2323
2158
 
2324
- // Push the receiver of the enclosing function and do runtime call.
2325
- __ push(Operand(ebp, (2 + scope()->num_parameters()) * kPointerSize));
2326
- // Push the strict mode flag.
2327
- __ push(Immediate(Smi::FromInt(strict_mode_flag())));
2328
- __ CallRuntime(Runtime::kResolvePossiblyDirectEval, 4);
2159
+ // Push copy of the function (found below the arguments) and
2160
+ // resolve eval.
2161
+ __ push(Operand(esp, (arg_count + 1) * kPointerSize));
2162
+ EmitResolvePossiblyDirectEval(PERFORM_CONTEXT_LOOKUP, arg_count);
2163
+ if (done.is_linked()) {
2164
+ __ bind(&done);
2165
+ }
2329
2166
 
2330
2167
  // The runtime call returns a pair of values in eax (function) and
2331
2168
  // edx (receiver). Touch up the stack with the right values.
@@ -2390,7 +2227,9 @@ void FullCodeGenerator::VisitCall(Call* expr) {
2390
2227
  Literal* key = prop->key()->AsLiteral();
2391
2228
  if (key != NULL && key->handle()->IsSymbol()) {
2392
2229
  // Call to a named property, use call IC.
2393
- VisitForStackValue(prop->obj());
2230
+ { PreservePositionScope scope(masm()->positions_recorder());
2231
+ VisitForStackValue(prop->obj());
2232
+ }
2394
2233
  EmitCallWithIC(expr, key->handle(), RelocInfo::CODE_TARGET);
2395
2234
  } else {
2396
2235
  // Call to a keyed property.
@@ -2412,7 +2251,7 @@ void FullCodeGenerator::VisitCall(Call* expr) {
2412
2251
  // Record source code position for IC call.
2413
2252
  SetSourcePosition(prop->position());
2414
2253
 
2415
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedLoadIC_Initialize));
2254
+ Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Initialize();
2416
2255
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
2417
2256
  // Push result (function).
2418
2257
  __ push(eax);
@@ -2428,15 +2267,6 @@ void FullCodeGenerator::VisitCall(Call* expr) {
2428
2267
  }
2429
2268
  }
2430
2269
  } else {
2431
- // Call to some other expression. If the expression is an anonymous
2432
- // function literal not called in a loop, mark it as one that should
2433
- // also use the full code generator.
2434
- FunctionLiteral* lit = fun->AsFunctionLiteral();
2435
- if (lit != NULL &&
2436
- lit->name()->Equals(Heap::empty_string()) &&
2437
- loop_depth() == 0) {
2438
- lit->set_try_full_codegen(true);
2439
- }
2440
2270
  { PreservePositionScope scope(masm()->positions_recorder());
2441
2271
  VisitForStackValue(fun);
2442
2272
  }
@@ -2480,7 +2310,8 @@ void FullCodeGenerator::VisitCallNew(CallNew* expr) {
2480
2310
  __ Set(eax, Immediate(arg_count));
2481
2311
  __ mov(edi, Operand(esp, arg_count * kPointerSize));
2482
2312
 
2483
- Handle<Code> construct_builtin(Builtins::builtin(Builtins::JSConstructCall));
2313
+ Handle<Code> construct_builtin =
2314
+ isolate()->builtins()->JSConstructCall();
2484
2315
  __ call(construct_builtin, RelocInfo::CONSTRUCT_CALL);
2485
2316
  context()->Plug(eax);
2486
2317
  }
@@ -2540,7 +2371,7 @@ void FullCodeGenerator::EmitIsObject(ZoneList<Expression*>* args) {
2540
2371
 
2541
2372
  __ test(eax, Immediate(kSmiTagMask));
2542
2373
  __ j(zero, if_false);
2543
- __ cmp(eax, Factory::null_value());
2374
+ __ cmp(eax, isolate()->factory()->null_value());
2544
2375
  __ j(equal, if_true);
2545
2376
  __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
2546
2377
  // Undetectable objects behave like undefined when tested with typeof.
@@ -2617,10 +2448,73 @@ void FullCodeGenerator::EmitIsStringWrapperSafeForDefaultValueOf(
2617
2448
  context()->PrepareTest(&materialize_true, &materialize_false,
2618
2449
  &if_true, &if_false, &fall_through);
2619
2450
 
2620
- // TODO(3110205): Implement this.
2621
- // Currently unimplemented. Emit false, a safe choice.
2451
+ if (FLAG_debug_code) __ AbortIfSmi(eax);
2452
+
2453
+ // Check whether this map has already been checked to be safe for default
2454
+ // valueOf.
2455
+ __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
2456
+ __ test_b(FieldOperand(ebx, Map::kBitField2Offset),
2457
+ 1 << Map::kStringWrapperSafeForDefaultValueOf);
2458
+ __ j(not_zero, if_true);
2459
+
2460
+ // Check for fast case object. Return false for slow case objects.
2461
+ __ mov(ecx, FieldOperand(eax, JSObject::kPropertiesOffset));
2462
+ __ mov(ecx, FieldOperand(ecx, HeapObject::kMapOffset));
2463
+ __ cmp(ecx, FACTORY->hash_table_map());
2464
+ __ j(equal, if_false);
2465
+
2466
+ // Look for valueOf symbol in the descriptor array, and indicate false if
2467
+ // found. The type is not checked, so if it is a transition it is a false
2468
+ // negative.
2469
+ __ mov(ebx, FieldOperand(ebx, Map::kInstanceDescriptorsOffset));
2470
+ __ mov(ecx, FieldOperand(ebx, FixedArray::kLengthOffset));
2471
+ // ebx: descriptor array
2472
+ // ecx: length of descriptor array
2473
+ // Calculate the end of the descriptor array.
2474
+ STATIC_ASSERT(kSmiTag == 0);
2475
+ STATIC_ASSERT(kSmiTagSize == 1);
2476
+ STATIC_ASSERT(kPointerSize == 4);
2477
+ __ lea(ecx, Operand(ebx, ecx, times_2, FixedArray::kHeaderSize));
2478
+ // Calculate location of the first key name.
2479
+ __ add(Operand(ebx),
2480
+ Immediate(FixedArray::kHeaderSize +
2481
+ DescriptorArray::kFirstIndex * kPointerSize));
2482
+ // Loop through all the keys in the descriptor array. If one of these is the
2483
+ // symbol valueOf the result is false.
2484
+ Label entry, loop;
2485
+ __ jmp(&entry);
2486
+ __ bind(&loop);
2487
+ __ mov(edx, FieldOperand(ebx, 0));
2488
+ __ cmp(edx, FACTORY->value_of_symbol());
2489
+ __ j(equal, if_false);
2490
+ __ add(Operand(ebx), Immediate(kPointerSize));
2491
+ __ bind(&entry);
2492
+ __ cmp(ebx, Operand(ecx));
2493
+ __ j(not_equal, &loop);
2494
+
2495
+ // Reload map as register ebx was used as temporary above.
2496
+ __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset));
2497
+
2498
+ // If a valueOf property is not found on the object check that it's
2499
+ // prototype is the un-modified String prototype. If not result is false.
2500
+ __ mov(ecx, FieldOperand(ebx, Map::kPrototypeOffset));
2501
+ __ test(ecx, Immediate(kSmiTagMask));
2502
+ __ j(zero, if_false);
2503
+ __ mov(ecx, FieldOperand(ecx, HeapObject::kMapOffset));
2504
+ __ mov(edx, Operand(esi, Context::SlotOffset(Context::GLOBAL_INDEX)));
2505
+ __ mov(edx,
2506
+ FieldOperand(edx, GlobalObject::kGlobalContextOffset));
2507
+ __ cmp(ecx,
2508
+ ContextOperand(edx,
2509
+ Context::STRING_FUNCTION_PROTOTYPE_MAP_INDEX));
2510
+ __ j(not_equal, if_false);
2511
+ // Set the bit in the map to indicate that it has been checked safe for
2512
+ // default valueOf and set true result.
2513
+ __ or_(FieldOperand(ebx, Map::kBitField2Offset),
2514
+ Immediate(1 << Map::kStringWrapperSafeForDefaultValueOf));
2515
+ __ jmp(if_true);
2516
+
2622
2517
  PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
2623
- __ jmp(if_false);
2624
2518
  context()->Plug(if_true, if_false);
2625
2519
  }
2626
2520
 
@@ -2819,17 +2713,17 @@ void FullCodeGenerator::EmitClassOf(ZoneList<Expression*>* args) {
2819
2713
 
2820
2714
  // Functions have class 'Function'.
2821
2715
  __ bind(&function);
2822
- __ mov(eax, Factory::function_class_symbol());
2716
+ __ mov(eax, isolate()->factory()->function_class_symbol());
2823
2717
  __ jmp(&done);
2824
2718
 
2825
2719
  // Objects with a non-function constructor have class 'Object'.
2826
2720
  __ bind(&non_function_constructor);
2827
- __ mov(eax, Factory::Object_symbol());
2721
+ __ mov(eax, isolate()->factory()->Object_symbol());
2828
2722
  __ jmp(&done);
2829
2723
 
2830
2724
  // Non-JS objects have class null.
2831
2725
  __ bind(&null);
2832
- __ mov(eax, Factory::null_value());
2726
+ __ mov(eax, isolate()->factory()->null_value());
2833
2727
 
2834
2728
  // All done.
2835
2729
  __ bind(&done);
@@ -2855,7 +2749,7 @@ void FullCodeGenerator::EmitLog(ZoneList<Expression*>* args) {
2855
2749
  }
2856
2750
  #endif
2857
2751
  // Finally, we're expected to leave a value on the top of the stack.
2858
- __ mov(eax, Factory::undefined_value());
2752
+ __ mov(eax, isolate()->factory()->undefined_value());
2859
2753
  context()->Plug(eax);
2860
2754
  }
2861
2755
 
@@ -2876,8 +2770,10 @@ void FullCodeGenerator::EmitRandomHeapNumber(ZoneList<Expression*>* args) {
2876
2770
 
2877
2771
  __ bind(&heapnumber_allocated);
2878
2772
 
2879
- __ PrepareCallCFunction(0, ebx);
2880
- __ CallCFunction(ExternalReference::random_uint32_function(), 0);
2773
+ __ PrepareCallCFunction(1, ebx);
2774
+ __ mov(Operand(esp, 0), Immediate(ExternalReference::isolate_address()));
2775
+ __ CallCFunction(ExternalReference::random_uint32_function(isolate()),
2776
+ 1);
2881
2777
 
2882
2778
  // Convert 32 random bits in eax to 0.(32 random bits) in a double
2883
2779
  // by computing:
@@ -2958,8 +2854,12 @@ void FullCodeGenerator::EmitMathPow(ZoneList<Expression*>* args) {
2958
2854
  VisitForStackValue(args->at(0));
2959
2855
  VisitForStackValue(args->at(1));
2960
2856
 
2961
- MathPowStub stub;
2962
- __ CallStub(&stub);
2857
+ if (CpuFeatures::IsSupported(SSE2)) {
2858
+ MathPowStub stub;
2859
+ __ CallStub(&stub);
2860
+ } else {
2861
+ __ CallRuntime(Runtime::kMath_pow, 2);
2862
+ }
2963
2863
  context()->Plug(eax);
2964
2864
  }
2965
2865
 
@@ -3052,13 +2952,13 @@ void FullCodeGenerator::EmitStringCharCodeAt(ZoneList<Expression*>* args) {
3052
2952
  __ bind(&index_out_of_range);
3053
2953
  // When the index is out of range, the spec requires us to return
3054
2954
  // NaN.
3055
- __ Set(result, Immediate(Factory::nan_value()));
2955
+ __ Set(result, Immediate(isolate()->factory()->nan_value()));
3056
2956
  __ jmp(&done);
3057
2957
 
3058
2958
  __ bind(&need_conversion);
3059
2959
  // Move the undefined value into the result register, which will
3060
2960
  // trigger conversion.
3061
- __ Set(result, Immediate(Factory::undefined_value()));
2961
+ __ Set(result, Immediate(isolate()->factory()->undefined_value()));
3062
2962
  __ jmp(&done);
3063
2963
 
3064
2964
  NopRuntimeCallHelper call_helper;
@@ -3101,7 +3001,7 @@ void FullCodeGenerator::EmitStringCharAt(ZoneList<Expression*>* args) {
3101
3001
  __ bind(&index_out_of_range);
3102
3002
  // When the index is out of range, the spec requires us to return
3103
3003
  // the empty string.
3104
- __ Set(result, Immediate(Factory::empty_string()));
3004
+ __ Set(result, Immediate(isolate()->factory()->empty_string()));
3105
3005
  __ jmp(&done);
3106
3006
 
3107
3007
  __ bind(&need_conversion);
@@ -3231,8 +3131,8 @@ void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) {
3231
3131
  // Fetch the map and check if array is in fast case.
3232
3132
  // Check that object doesn't require security checks and
3233
3133
  // has no indexed interceptor.
3234
- __ CmpObjectType(object, FIRST_JS_OBJECT_TYPE, temp);
3235
- __ j(below, &slow_case);
3134
+ __ CmpObjectType(object, JS_ARRAY_TYPE, temp);
3135
+ __ j(not_equal, &slow_case);
3236
3136
  __ test_b(FieldOperand(temp, Map::kBitFieldOffset),
3237
3137
  KeyedLoadIC::kSlowCaseBitFieldMask);
3238
3138
  __ j(not_zero, &slow_case);
@@ -3240,7 +3140,7 @@ void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) {
3240
3140
  // Check the object's elements are in fast case and writable.
3241
3141
  __ mov(elements, FieldOperand(object, JSObject::kElementsOffset));
3242
3142
  __ cmp(FieldOperand(elements, HeapObject::kMapOffset),
3243
- Immediate(Factory::fixed_array_map()));
3143
+ Immediate(isolate()->factory()->fixed_array_map()));
3244
3144
  __ j(not_equal, &slow_case);
3245
3145
 
3246
3146
  // Check that both indices are smis.
@@ -3278,7 +3178,7 @@ void FullCodeGenerator::EmitSwapElements(ZoneList<Expression*>* args) {
3278
3178
  __ bind(&new_space);
3279
3179
  // We are done. Drop elements from the stack, and return undefined.
3280
3180
  __ add(Operand(esp), Immediate(3 * kPointerSize));
3281
- __ mov(eax, Factory::undefined_value());
3181
+ __ mov(eax, isolate()->factory()->undefined_value());
3282
3182
  __ jmp(&done);
3283
3183
 
3284
3184
  __ bind(&slow_case);
@@ -3296,10 +3196,10 @@ void FullCodeGenerator::EmitGetFromCache(ZoneList<Expression*>* args) {
3296
3196
  int cache_id = Smi::cast(*(args->at(0)->AsLiteral()->handle()))->value();
3297
3197
 
3298
3198
  Handle<FixedArray> jsfunction_result_caches(
3299
- Top::global_context()->jsfunction_result_caches());
3199
+ isolate()->global_context()->jsfunction_result_caches());
3300
3200
  if (jsfunction_result_caches->length() <= cache_id) {
3301
3201
  __ Abort("Attempt to use undefined cache.");
3302
- __ mov(eax, Factory::undefined_value());
3202
+ __ mov(eax, isolate()->factory()->undefined_value());
3303
3203
  context()->Plug(eax);
3304
3204
  return;
3305
3205
  }
@@ -3356,7 +3256,8 @@ void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) {
3356
3256
  __ and_(Operand(tmp), right);
3357
3257
  __ test(Operand(tmp), Immediate(kSmiTagMask));
3358
3258
  __ j(zero, &fail);
3359
- __ CmpObjectType(left, JS_REGEXP_TYPE, tmp);
3259
+ __ mov(tmp, FieldOperand(left, HeapObject::kMapOffset));
3260
+ __ CmpInstanceType(tmp, JS_REGEXP_TYPE);
3360
3261
  __ j(not_equal, &fail);
3361
3262
  __ cmp(tmp, FieldOperand(right, HeapObject::kMapOffset));
3362
3263
  __ j(not_equal, &fail);
@@ -3364,10 +3265,10 @@ void FullCodeGenerator::EmitIsRegExpEquivalent(ZoneList<Expression*>* args) {
3364
3265
  __ cmp(tmp, FieldOperand(right, JSRegExp::kDataOffset));
3365
3266
  __ j(equal, &ok);
3366
3267
  __ bind(&fail);
3367
- __ mov(eax, Immediate(Factory::false_value()));
3268
+ __ mov(eax, Immediate(isolate()->factory()->false_value()));
3368
3269
  __ jmp(&done);
3369
3270
  __ bind(&ok);
3370
- __ mov(eax, Immediate(Factory::true_value()));
3271
+ __ mov(eax, Immediate(isolate()->factory()->true_value()));
3371
3272
  __ bind(&done);
3372
3273
 
3373
3274
  context()->Plug(eax);
@@ -3401,7 +3302,6 @@ void FullCodeGenerator::EmitHasCachedArrayIndex(ZoneList<Expression*>* args) {
3401
3302
 
3402
3303
  void FullCodeGenerator::EmitGetCachedArrayIndex(ZoneList<Expression*>* args) {
3403
3304
  ASSERT(args->length() == 1);
3404
-
3405
3305
  VisitForAccumulatorValue(args->at(0));
3406
3306
 
3407
3307
  if (FLAG_debug_code) {
@@ -3417,7 +3317,7 @@ void FullCodeGenerator::EmitGetCachedArrayIndex(ZoneList<Expression*>* args) {
3417
3317
 
3418
3318
  void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3419
3319
  Label bailout, done, one_char_separator, long_separator,
3420
- non_trivial_array, not_size_one_array, loop, loop_condition,
3320
+ non_trivial_array, not_size_one_array, loop,
3421
3321
  loop_1, loop_1_condition, loop_2, loop_2_entry, loop_3, loop_3_entry;
3422
3322
 
3423
3323
  ASSERT(args->length() == 2);
@@ -3459,9 +3359,9 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3459
3359
 
3460
3360
  // If the array has length zero, return the empty string.
3461
3361
  __ mov(array_length, FieldOperand(array, JSArray::kLengthOffset));
3462
- __ sar(array_length, 1);
3362
+ __ SmiUntag(array_length);
3463
3363
  __ j(not_zero, &non_trivial_array);
3464
- __ mov(result_operand, Factory::empty_string());
3364
+ __ mov(result_operand, isolate()->factory()->empty_string());
3465
3365
  __ jmp(&done);
3466
3366
 
3467
3367
  // Save the array length.
@@ -3482,14 +3382,15 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3482
3382
  // Loop condition: while (index < length).
3483
3383
  // Live loop registers: index, array_length, string,
3484
3384
  // scratch, string_length, elements.
3485
- __ jmp(&loop_condition);
3385
+ if (FLAG_debug_code) {
3386
+ __ cmp(index, Operand(array_length));
3387
+ __ Assert(less, "No empty arrays here in EmitFastAsciiArrayJoin");
3388
+ }
3486
3389
  __ bind(&loop);
3487
- __ cmp(index, Operand(array_length));
3488
- __ j(greater_equal, &done);
3489
-
3490
- __ mov(string, FieldOperand(elements, index,
3491
- times_pointer_size,
3492
- FixedArray::kHeaderSize));
3390
+ __ mov(string, FieldOperand(elements,
3391
+ index,
3392
+ times_pointer_size,
3393
+ FixedArray::kHeaderSize));
3493
3394
  __ test(string, Immediate(kSmiTagMask));
3494
3395
  __ j(zero, &bailout);
3495
3396
  __ mov(scratch, FieldOperand(string, HeapObject::kMapOffset));
@@ -3502,7 +3403,6 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3502
3403
  FieldOperand(string, SeqAsciiString::kLengthOffset));
3503
3404
  __ j(overflow, &bailout);
3504
3405
  __ add(Operand(index), Immediate(1));
3505
- __ bind(&loop_condition);
3506
3406
  __ cmp(index, Operand(array_length));
3507
3407
  __ j(less, &loop);
3508
3408
 
@@ -3531,7 +3431,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3531
3431
  __ movzx_b(scratch, FieldOperand(scratch, Map::kInstanceTypeOffset));
3532
3432
  __ and_(scratch, Immediate(
3533
3433
  kIsNotStringMask | kStringEncodingMask | kStringRepresentationMask));
3534
- __ cmp(scratch, kStringTag | kAsciiStringTag | kSeqStringTag);
3434
+ __ cmp(scratch, ASCII_STRING_TYPE);
3535
3435
  __ j(not_equal, &bailout);
3536
3436
 
3537
3437
  // Add (separator length times array_length) - separator length
@@ -3672,7 +3572,7 @@ void FullCodeGenerator::EmitFastAsciiArrayJoin(ZoneList<Expression*>* args) {
3672
3572
 
3673
3573
 
3674
3574
  __ bind(&bailout);
3675
- __ mov(result_operand, Factory::undefined_value());
3575
+ __ mov(result_operand, isolate()->factory()->undefined_value());
3676
3576
  __ bind(&done);
3677
3577
  __ mov(eax, result_operand);
3678
3578
  // Drop temp values from the stack, and restore context register.
@@ -3710,7 +3610,8 @@ void FullCodeGenerator::VisitCallRuntime(CallRuntime* expr) {
3710
3610
  // Call the JS runtime function via a call IC.
3711
3611
  __ Set(ecx, Immediate(expr->name()));
3712
3612
  InLoopFlag in_loop = (loop_depth() > 0) ? IN_LOOP : NOT_IN_LOOP;
3713
- Handle<Code> ic = StubCache::ComputeCallInitialize(arg_count, in_loop);
3613
+ Handle<Code> ic = isolate()->stub_cache()->ComputeCallInitialize(
3614
+ arg_count, in_loop);
3714
3615
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
3715
3616
  // Restore context register.
3716
3617
  __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
@@ -3776,7 +3677,7 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
3776
3677
  case Token::VOID: {
3777
3678
  Comment cmnt(masm_, "[ UnaryOperation (VOID)");
3778
3679
  VisitForEffect(expr->expression());
3779
- context()->Plug(Factory::undefined_value());
3680
+ context()->Plug(isolate()->factory()->undefined_value());
3780
3681
  break;
3781
3682
  }
3782
3683
 
@@ -3791,6 +3692,7 @@ void FullCodeGenerator::VisitUnaryOperation(UnaryOperation* expr) {
3791
3692
  Label* if_true = NULL;
3792
3693
  Label* if_false = NULL;
3793
3694
  Label* fall_through = NULL;
3695
+
3794
3696
  // Notice that the labels are swapped.
3795
3697
  context()->PrepareTest(&materialize_true, &materialize_false,
3796
3698
  &if_false, &if_true, &fall_through);
@@ -3930,7 +3832,11 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
3930
3832
 
3931
3833
  // We need a second deoptimization point after loading the value
3932
3834
  // in case evaluating the property load my have a side effect.
3933
- PrepareForBailout(expr->increment(), TOS_REG);
3835
+ if (assign_type == VARIABLE) {
3836
+ PrepareForBailout(expr->expression(), TOS_REG);
3837
+ } else {
3838
+ PrepareForBailout(expr->increment(), TOS_REG);
3839
+ }
3934
3840
 
3935
3841
  // Call ToNumber only if operand is not a smi.
3936
3842
  NearLabel no_conversion;
@@ -4023,7 +3929,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4023
3929
  case NAMED_PROPERTY: {
4024
3930
  __ mov(ecx, prop->key()->AsLiteral()->handle());
4025
3931
  __ pop(edx);
4026
- Handle<Code> ic(Builtins::builtin(Builtins::StoreIC_Initialize));
3932
+ Handle<Code> ic = is_strict_mode()
3933
+ ? isolate()->builtins()->StoreIC_Initialize_Strict()
3934
+ : isolate()->builtins()->StoreIC_Initialize();
4027
3935
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
4028
3936
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
4029
3937
  if (expr->is_postfix()) {
@@ -4038,7 +3946,9 @@ void FullCodeGenerator::VisitCountOperation(CountOperation* expr) {
4038
3946
  case KEYED_PROPERTY: {
4039
3947
  __ pop(ecx);
4040
3948
  __ pop(edx);
4041
- Handle<Code> ic(Builtins::builtin(Builtins::KeyedStoreIC_Initialize));
3949
+ Handle<Code> ic = is_strict_mode()
3950
+ ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict()
3951
+ : isolate()->builtins()->KeyedStoreIC_Initialize();
4042
3952
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
4043
3953
  PrepareForBailoutForId(expr->AssignmentId(), TOS_REG);
4044
3954
  if (expr->is_postfix()) {
@@ -4064,7 +3974,7 @@ void FullCodeGenerator::VisitForTypeofValue(Expression* expr) {
4064
3974
  Comment cmnt(masm_, "Global variable");
4065
3975
  __ mov(eax, GlobalObjectOperand());
4066
3976
  __ mov(ecx, Immediate(proxy->name()));
4067
- Handle<Code> ic(Builtins::builtin(Builtins::LoadIC_Initialize));
3977
+ Handle<Code> ic = isolate()->builtins()->LoadIC_Initialize();
4068
3978
  // Use a regular load, not a contextual load, to avoid a reference
4069
3979
  // error.
4070
3980
  EmitCallIC(ic, RelocInfo::CODE_TARGET);
@@ -4117,63 +4027,49 @@ bool FullCodeGenerator::TryLiteralCompare(Token::Value op,
4117
4027
  }
4118
4028
  PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
4119
4029
 
4120
- if (check->Equals(Heap::number_symbol())) {
4121
- __ test(eax, Immediate(kSmiTagMask));
4122
- __ j(zero, if_true);
4030
+ if (check->Equals(isolate()->heap()->number_symbol())) {
4031
+ __ JumpIfSmi(eax, if_true);
4123
4032
  __ cmp(FieldOperand(eax, HeapObject::kMapOffset),
4124
- Factory::heap_number_map());
4033
+ isolate()->factory()->heap_number_map());
4125
4034
  Split(equal, if_true, if_false, fall_through);
4126
- } else if (check->Equals(Heap::string_symbol())) {
4127
- __ test(eax, Immediate(kSmiTagMask));
4128
- __ j(zero, if_false);
4035
+ } else if (check->Equals(isolate()->heap()->string_symbol())) {
4036
+ __ JumpIfSmi(eax, if_false);
4037
+ __ CmpObjectType(eax, FIRST_NONSTRING_TYPE, edx);
4038
+ __ j(above_equal, if_false);
4129
4039
  // Check for undetectable objects => false.
4130
- __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset));
4131
- __ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset));
4132
- __ test(ecx, Immediate(1 << Map::kIsUndetectable));
4133
- __ j(not_zero, if_false);
4134
- __ CmpInstanceType(edx, FIRST_NONSTRING_TYPE);
4135
- Split(below, if_true, if_false, fall_through);
4136
- } else if (check->Equals(Heap::boolean_symbol())) {
4137
- __ cmp(eax, Factory::true_value());
4040
+ __ test_b(FieldOperand(edx, Map::kBitFieldOffset),
4041
+ 1 << Map::kIsUndetectable);
4042
+ Split(zero, if_true, if_false, fall_through);
4043
+ } else if (check->Equals(isolate()->heap()->boolean_symbol())) {
4044
+ __ cmp(eax, isolate()->factory()->true_value());
4138
4045
  __ j(equal, if_true);
4139
- __ cmp(eax, Factory::false_value());
4046
+ __ cmp(eax, isolate()->factory()->false_value());
4140
4047
  Split(equal, if_true, if_false, fall_through);
4141
- } else if (check->Equals(Heap::undefined_symbol())) {
4142
- __ cmp(eax, Factory::undefined_value());
4048
+ } else if (check->Equals(isolate()->heap()->undefined_symbol())) {
4049
+ __ cmp(eax, isolate()->factory()->undefined_value());
4143
4050
  __ j(equal, if_true);
4144
- __ test(eax, Immediate(kSmiTagMask));
4145
- __ j(zero, if_false);
4051
+ __ JumpIfSmi(eax, if_false);
4146
4052
  // Check for undetectable objects => true.
4147
4053
  __ mov(edx, FieldOperand(eax, HeapObject::kMapOffset));
4148
4054
  __ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset));
4149
4055
  __ test(ecx, Immediate(1 << Map::kIsUndetectable));
4150
4056
  Split(not_zero, if_true, if_false, fall_through);
4151
- } else if (check->Equals(Heap::function_symbol())) {
4152
- __ test(eax, Immediate(kSmiTagMask));
4153
- __ j(zero, if_false);
4154
- __ CmpObjectType(eax, JS_FUNCTION_TYPE, edx);
4057
+ } else if (check->Equals(isolate()->heap()->function_symbol())) {
4058
+ __ JumpIfSmi(eax, if_false);
4059
+ __ CmpObjectType(eax, FIRST_FUNCTION_CLASS_TYPE, edx);
4060
+ Split(above_equal, if_true, if_false, fall_through);
4061
+ } else if (check->Equals(isolate()->heap()->object_symbol())) {
4062
+ __ JumpIfSmi(eax, if_false);
4063
+ __ cmp(eax, isolate()->factory()->null_value());
4155
4064
  __ j(equal, if_true);
4156
- // Regular expressions => 'function' (they are callable).
4157
- __ CmpInstanceType(edx, JS_REGEXP_TYPE);
4158
- Split(equal, if_true, if_false, fall_through);
4159
- } else if (check->Equals(Heap::object_symbol())) {
4160
- __ test(eax, Immediate(kSmiTagMask));
4161
- __ j(zero, if_false);
4162
- __ cmp(eax, Factory::null_value());
4163
- __ j(equal, if_true);
4164
- // Regular expressions => 'function', not 'object'.
4165
- __ CmpObjectType(eax, JS_REGEXP_TYPE, edx);
4166
- __ j(equal, if_false);
4065
+ __ CmpObjectType(eax, FIRST_JS_OBJECT_TYPE, edx);
4066
+ __ j(below, if_false);
4067
+ __ CmpInstanceType(edx, FIRST_FUNCTION_CLASS_TYPE);
4068
+ __ j(above_equal, if_false);
4167
4069
  // Check for undetectable objects => false.
4168
- __ movzx_b(ecx, FieldOperand(edx, Map::kBitFieldOffset));
4169
- __ test(ecx, Immediate(1 << Map::kIsUndetectable));
4170
- __ j(not_zero, if_false);
4171
- // Check for JS objects => true.
4172
- __ movzx_b(ecx, FieldOperand(edx, Map::kInstanceTypeOffset));
4173
- __ cmp(ecx, FIRST_JS_OBJECT_TYPE);
4174
- __ j(less, if_false);
4175
- __ cmp(ecx, LAST_JS_OBJECT_TYPE);
4176
- Split(less_equal, if_true, if_false, fall_through);
4070
+ __ test_b(FieldOperand(edx, Map::kBitFieldOffset),
4071
+ 1 << Map::kIsUndetectable);
4072
+ Split(zero, if_true, if_false, fall_through);
4177
4073
  } else {
4178
4074
  if (if_false != fall_through) __ jmp(if_false);
4179
4075
  }
@@ -4212,7 +4108,7 @@ void FullCodeGenerator::VisitCompareOperation(CompareOperation* expr) {
4212
4108
  VisitForStackValue(expr->right());
4213
4109
  __ InvokeBuiltin(Builtins::IN, CALL_FUNCTION);
4214
4110
  PrepareForBailoutBeforeSplit(TOS_REG, false, NULL, NULL);
4215
- __ cmp(eax, Factory::true_value());
4111
+ __ cmp(eax, isolate()->factory()->true_value());
4216
4112
  Split(equal, if_true, if_false, fall_through);
4217
4113
  break;
4218
4114
 
@@ -4305,12 +4201,12 @@ void FullCodeGenerator::VisitCompareToNull(CompareToNull* expr) {
4305
4201
  VisitForAccumulatorValue(expr->expression());
4306
4202
  PrepareForBailoutBeforeSplit(TOS_REG, true, if_true, if_false);
4307
4203
 
4308
- __ cmp(eax, Factory::null_value());
4204
+ __ cmp(eax, isolate()->factory()->null_value());
4309
4205
  if (expr->is_strict()) {
4310
4206
  Split(equal, if_true, if_false, fall_through);
4311
4207
  } else {
4312
4208
  __ j(equal, if_true);
4313
- __ cmp(eax, Factory::undefined_value());
4209
+ __ cmp(eax, isolate()->factory()->undefined_value());
4314
4210
  __ j(equal, if_true);
4315
4211
  __ test(eax, Immediate(kSmiTagMask));
4316
4212
  __ j(zero, if_false);
@@ -4345,16 +4241,16 @@ void FullCodeGenerator::EmitCallIC(Handle<Code> ic, RelocInfo::Mode mode) {
4345
4241
  mode == RelocInfo::CODE_TARGET_CONTEXT);
4346
4242
  switch (ic->kind()) {
4347
4243
  case Code::LOAD_IC:
4348
- __ IncrementCounter(&Counters::named_load_full, 1);
4244
+ __ IncrementCounter(isolate()->counters()->named_load_full(), 1);
4349
4245
  break;
4350
4246
  case Code::KEYED_LOAD_IC:
4351
- __ IncrementCounter(&Counters::keyed_load_full, 1);
4247
+ __ IncrementCounter(isolate()->counters()->keyed_load_full(), 1);
4352
4248
  break;
4353
4249
  case Code::STORE_IC:
4354
- __ IncrementCounter(&Counters::named_store_full, 1);
4250
+ __ IncrementCounter(isolate()->counters()->named_store_full(), 1);
4355
4251
  break;
4356
4252
  case Code::KEYED_STORE_IC:
4357
- __ IncrementCounter(&Counters::keyed_store_full, 1);
4253
+ __ IncrementCounter(isolate()->counters()->keyed_store_full(), 1);
4358
4254
  default:
4359
4255
  break;
4360
4256
  }
@@ -4386,6 +4282,23 @@ void FullCodeGenerator::EmitCallIC(Handle<Code> ic, RelocInfo::Mode mode) {
4386
4282
 
4387
4283
 
4388
4284
  void FullCodeGenerator::EmitCallIC(Handle<Code> ic, JumpPatchSite* patch_site) {
4285
+ Counters* counters = isolate()->counters();
4286
+ switch (ic->kind()) {
4287
+ case Code::LOAD_IC:
4288
+ __ IncrementCounter(counters->named_load_full(), 1);
4289
+ break;
4290
+ case Code::KEYED_LOAD_IC:
4291
+ __ IncrementCounter(counters->keyed_load_full(), 1);
4292
+ break;
4293
+ case Code::STORE_IC:
4294
+ __ IncrementCounter(counters->named_store_full(), 1);
4295
+ break;
4296
+ case Code::KEYED_STORE_IC:
4297
+ __ IncrementCounter(counters->keyed_store_full(), 1);
4298
+ default:
4299
+ break;
4300
+ }
4301
+
4389
4302
  __ call(ic, RelocInfo::CODE_TARGET);
4390
4303
  if (patch_site != NULL && patch_site->is_bound()) {
4391
4304
  patch_site->EmitPatchInfo();