mustang 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (560) hide show
  1. data/.rspec +1 -0
  2. data/Isolate +9 -0
  3. data/README.md +6 -12
  4. data/Rakefile +30 -4
  5. data/TODO.md +9 -0
  6. data/ext/v8/extconf.rb +56 -0
  7. data/ext/v8/v8.cpp +37 -0
  8. data/ext/v8/v8_array.cpp +161 -0
  9. data/ext/v8/v8_array.h +17 -0
  10. data/ext/v8/v8_base.cpp +147 -0
  11. data/ext/v8/v8_base.h +23 -0
  12. data/ext/v8/v8_cast.cpp +151 -0
  13. data/ext/v8/v8_cast.h +64 -0
  14. data/ext/v8/v8_context.cpp +174 -0
  15. data/ext/v8/v8_context.h +12 -0
  16. data/ext/v8/v8_date.cpp +61 -0
  17. data/ext/v8/v8_date.h +16 -0
  18. data/ext/v8/v8_errors.cpp +147 -0
  19. data/ext/v8/v8_errors.h +19 -0
  20. data/ext/v8/v8_external.cpp +66 -0
  21. data/ext/v8/v8_external.h +16 -0
  22. data/ext/v8/v8_function.cpp +182 -0
  23. data/ext/v8/v8_function.h +14 -0
  24. data/ext/v8/v8_integer.cpp +70 -0
  25. data/ext/v8/v8_integer.h +16 -0
  26. data/ext/v8/v8_macros.h +30 -0
  27. data/ext/v8/v8_main.cpp +53 -0
  28. data/ext/v8/v8_main.h +13 -0
  29. data/ext/v8/v8_number.cpp +62 -0
  30. data/ext/v8/v8_number.h +16 -0
  31. data/ext/v8/v8_object.cpp +172 -0
  32. data/ext/v8/v8_object.h +17 -0
  33. data/ext/v8/v8_ref.cpp +72 -0
  34. data/ext/v8/v8_ref.h +43 -0
  35. data/ext/v8/v8_regexp.cpp +148 -0
  36. data/ext/v8/v8_regexp.h +16 -0
  37. data/ext/v8/v8_string.cpp +78 -0
  38. data/ext/v8/v8_string.h +16 -0
  39. data/ext/v8/v8_value.cpp +370 -0
  40. data/ext/v8/v8_value.h +19 -0
  41. data/gemspec.yml +2 -1
  42. data/lib/core_ext/class.rb +14 -0
  43. data/lib/core_ext/object.rb +12 -0
  44. data/lib/core_ext/symbol.rb +23 -0
  45. data/lib/mustang.rb +44 -0
  46. data/lib/mustang/context.rb +69 -0
  47. data/lib/mustang/errors.rb +36 -0
  48. data/lib/support/delegated.rb +25 -0
  49. data/lib/v8/array.rb +21 -0
  50. data/lib/v8/context.rb +13 -0
  51. data/lib/v8/date.rb +20 -0
  52. data/lib/v8/error.rb +15 -0
  53. data/lib/v8/external.rb +16 -0
  54. data/lib/v8/function.rb +11 -0
  55. data/lib/v8/integer.rb +16 -0
  56. data/lib/v8/number.rb +16 -0
  57. data/lib/v8/object.rb +66 -0
  58. data/lib/v8/regexp.rb +23 -0
  59. data/lib/v8/string.rb +27 -0
  60. data/mustang.gemspec +3 -0
  61. data/spec/core_ext/class_spec.rb +19 -0
  62. data/spec/core_ext/object_spec.rb +19 -0
  63. data/spec/core_ext/symbol_spec.rb +27 -0
  64. data/spec/fixtures/test1.js +2 -0
  65. data/spec/fixtures/test2.js +2 -0
  66. data/spec/spec_helper.rb +20 -0
  67. data/spec/v8/array_spec.rb +88 -0
  68. data/spec/v8/cast_spec.rb +151 -0
  69. data/spec/v8/context_spec.rb +78 -0
  70. data/spec/v8/data_spec.rb +39 -0
  71. data/spec/v8/date_spec.rb +45 -0
  72. data/spec/v8/empty_spec.rb +27 -0
  73. data/spec/v8/errors_spec.rb +142 -0
  74. data/spec/v8/external_spec.rb +44 -0
  75. data/spec/v8/function_spec.rb +170 -0
  76. data/spec/v8/integer_spec.rb +41 -0
  77. data/spec/v8/main_spec.rb +18 -0
  78. data/spec/v8/null_spec.rb +27 -0
  79. data/spec/v8/number_spec.rb +40 -0
  80. data/spec/v8/object_spec.rb +79 -0
  81. data/spec/v8/primitive_spec.rb +9 -0
  82. data/spec/v8/regexp_spec.rb +65 -0
  83. data/spec/v8/string_spec.rb +48 -0
  84. data/spec/v8/undefined_spec.rb +27 -0
  85. data/spec/v8/value_spec.rb +215 -0
  86. data/vendor/v8/.gitignore +2 -0
  87. data/vendor/v8/AUTHORS +3 -1
  88. data/vendor/v8/ChangeLog +117 -0
  89. data/vendor/v8/SConstruct +334 -53
  90. data/vendor/v8/include/v8-debug.h +21 -11
  91. data/vendor/v8/include/v8-preparser.h +1 -1
  92. data/vendor/v8/include/v8-profiler.h +122 -43
  93. data/vendor/v8/include/v8-testing.h +5 -0
  94. data/vendor/v8/include/v8.h +171 -17
  95. data/vendor/v8/preparser/SConscript +38 -0
  96. data/vendor/v8/preparser/preparser-process.cc +77 -114
  97. data/vendor/v8/samples/shell.cc +232 -46
  98. data/vendor/v8/src/SConscript +29 -5
  99. data/vendor/v8/src/accessors.cc +70 -211
  100. data/vendor/v8/{test/cctest/test-mips.cc → src/allocation-inl.h} +15 -18
  101. data/vendor/v8/src/allocation.cc +0 -82
  102. data/vendor/v8/src/allocation.h +9 -42
  103. data/vendor/v8/src/api.cc +1645 -1156
  104. data/vendor/v8/src/api.h +76 -12
  105. data/vendor/v8/src/apiutils.h +0 -7
  106. data/vendor/v8/src/arguments.h +15 -4
  107. data/vendor/v8/src/arm/assembler-arm-inl.h +10 -9
  108. data/vendor/v8/src/arm/assembler-arm.cc +62 -23
  109. data/vendor/v8/src/arm/assembler-arm.h +76 -11
  110. data/vendor/v8/src/arm/builtins-arm.cc +39 -33
  111. data/vendor/v8/src/arm/code-stubs-arm.cc +1182 -402
  112. data/vendor/v8/src/arm/code-stubs-arm.h +20 -54
  113. data/vendor/v8/src/arm/codegen-arm.cc +159 -106
  114. data/vendor/v8/src/arm/codegen-arm.h +6 -6
  115. data/vendor/v8/src/arm/constants-arm.h +16 -1
  116. data/vendor/v8/src/arm/cpu-arm.cc +7 -5
  117. data/vendor/v8/src/arm/debug-arm.cc +6 -4
  118. data/vendor/v8/src/arm/deoptimizer-arm.cc +51 -14
  119. data/vendor/v8/src/arm/disasm-arm.cc +47 -15
  120. data/vendor/v8/src/arm/frames-arm.h +1 -1
  121. data/vendor/v8/src/arm/full-codegen-arm.cc +724 -408
  122. data/vendor/v8/src/arm/ic-arm.cc +90 -85
  123. data/vendor/v8/src/arm/lithium-arm.cc +140 -69
  124. data/vendor/v8/src/arm/lithium-arm.h +161 -46
  125. data/vendor/v8/src/arm/lithium-codegen-arm.cc +567 -297
  126. data/vendor/v8/src/arm/lithium-codegen-arm.h +21 -9
  127. data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +2 -0
  128. data/vendor/v8/src/arm/macro-assembler-arm.cc +457 -96
  129. data/vendor/v8/src/arm/macro-assembler-arm.h +115 -18
  130. data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +20 -13
  131. data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +1 -0
  132. data/vendor/v8/src/arm/simulator-arm.cc +184 -101
  133. data/vendor/v8/src/arm/simulator-arm.h +26 -21
  134. data/vendor/v8/src/arm/stub-cache-arm.cc +450 -467
  135. data/vendor/v8/src/arm/virtual-frame-arm.cc +14 -12
  136. data/vendor/v8/src/arm/virtual-frame-arm.h +11 -8
  137. data/vendor/v8/src/array.js +35 -18
  138. data/vendor/v8/src/assembler.cc +186 -92
  139. data/vendor/v8/src/assembler.h +106 -69
  140. data/vendor/v8/src/ast-inl.h +5 -0
  141. data/vendor/v8/src/ast.cc +46 -35
  142. data/vendor/v8/src/ast.h +107 -50
  143. data/vendor/v8/src/atomicops.h +2 -0
  144. data/vendor/v8/src/atomicops_internals_mips_gcc.h +169 -0
  145. data/vendor/v8/src/bootstrapper.cc +649 -399
  146. data/vendor/v8/src/bootstrapper.h +94 -27
  147. data/vendor/v8/src/builtins.cc +359 -227
  148. data/vendor/v8/src/builtins.h +157 -123
  149. data/vendor/v8/src/checks.cc +2 -2
  150. data/vendor/v8/src/checks.h +4 -0
  151. data/vendor/v8/src/code-stubs.cc +27 -17
  152. data/vendor/v8/src/code-stubs.h +38 -17
  153. data/vendor/v8/src/codegen-inl.h +5 -1
  154. data/vendor/v8/src/codegen.cc +27 -17
  155. data/vendor/v8/src/codegen.h +9 -9
  156. data/vendor/v8/src/compilation-cache.cc +92 -206
  157. data/vendor/v8/src/compilation-cache.h +205 -30
  158. data/vendor/v8/src/compiler.cc +107 -120
  159. data/vendor/v8/src/compiler.h +17 -2
  160. data/vendor/v8/src/contexts.cc +22 -15
  161. data/vendor/v8/src/contexts.h +14 -8
  162. data/vendor/v8/src/conversions.cc +86 -30
  163. data/vendor/v8/src/counters.cc +19 -4
  164. data/vendor/v8/src/counters.h +28 -16
  165. data/vendor/v8/src/cpu-profiler-inl.h +4 -3
  166. data/vendor/v8/src/cpu-profiler.cc +123 -72
  167. data/vendor/v8/src/cpu-profiler.h +33 -19
  168. data/vendor/v8/src/cpu.h +2 -0
  169. data/vendor/v8/src/d8-debug.cc +3 -3
  170. data/vendor/v8/src/d8-debug.h +7 -6
  171. data/vendor/v8/src/d8-posix.cc +2 -0
  172. data/vendor/v8/src/d8.cc +22 -12
  173. data/vendor/v8/src/d8.gyp +3 -0
  174. data/vendor/v8/src/d8.js +618 -0
  175. data/vendor/v8/src/data-flow.h +3 -3
  176. data/vendor/v8/src/dateparser.h +4 -2
  177. data/vendor/v8/src/debug-agent.cc +10 -9
  178. data/vendor/v8/src/debug-agent.h +9 -11
  179. data/vendor/v8/src/debug-debugger.js +121 -0
  180. data/vendor/v8/src/debug.cc +331 -227
  181. data/vendor/v8/src/debug.h +248 -219
  182. data/vendor/v8/src/deoptimizer.cc +173 -62
  183. data/vendor/v8/src/deoptimizer.h +119 -19
  184. data/vendor/v8/src/disasm.h +3 -0
  185. data/vendor/v8/src/disassembler.cc +10 -9
  186. data/vendor/v8/src/execution.cc +185 -129
  187. data/vendor/v8/src/execution.h +47 -78
  188. data/vendor/v8/src/extensions/experimental/break-iterator.cc +250 -0
  189. data/vendor/v8/src/extensions/experimental/break-iterator.h +89 -0
  190. data/vendor/v8/src/extensions/experimental/experimental.gyp +2 -0
  191. data/vendor/v8/src/extensions/experimental/i18n-extension.cc +22 -2
  192. data/vendor/v8/src/extensions/externalize-string-extension.cc +2 -2
  193. data/vendor/v8/src/extensions/gc-extension.cc +1 -1
  194. data/vendor/v8/src/factory.cc +261 -154
  195. data/vendor/v8/src/factory.h +162 -158
  196. data/vendor/v8/src/flag-definitions.h +17 -11
  197. data/vendor/v8/src/frame-element.cc +0 -5
  198. data/vendor/v8/src/frame-element.h +9 -13
  199. data/vendor/v8/src/frames-inl.h +7 -0
  200. data/vendor/v8/src/frames.cc +56 -46
  201. data/vendor/v8/src/frames.h +36 -25
  202. data/vendor/v8/src/full-codegen.cc +15 -24
  203. data/vendor/v8/src/full-codegen.h +13 -41
  204. data/vendor/v8/src/func-name-inferrer.cc +7 -6
  205. data/vendor/v8/src/func-name-inferrer.h +1 -1
  206. data/vendor/v8/src/gdb-jit.cc +1 -0
  207. data/vendor/v8/src/global-handles.cc +118 -56
  208. data/vendor/v8/src/global-handles.h +98 -40
  209. data/vendor/v8/src/globals.h +2 -2
  210. data/vendor/v8/src/handles-inl.h +106 -9
  211. data/vendor/v8/src/handles.cc +220 -157
  212. data/vendor/v8/src/handles.h +38 -59
  213. data/vendor/v8/src/hashmap.h +3 -3
  214. data/vendor/v8/src/heap-inl.h +141 -25
  215. data/vendor/v8/src/heap-profiler.cc +117 -63
  216. data/vendor/v8/src/heap-profiler.h +38 -21
  217. data/vendor/v8/src/heap.cc +805 -564
  218. data/vendor/v8/src/heap.h +640 -594
  219. data/vendor/v8/src/hydrogen-instructions.cc +216 -73
  220. data/vendor/v8/src/hydrogen-instructions.h +259 -124
  221. data/vendor/v8/src/hydrogen.cc +996 -1171
  222. data/vendor/v8/src/hydrogen.h +163 -144
  223. data/vendor/v8/src/ia32/assembler-ia32-inl.h +12 -11
  224. data/vendor/v8/src/ia32/assembler-ia32.cc +85 -39
  225. data/vendor/v8/src/ia32/assembler-ia32.h +82 -16
  226. data/vendor/v8/src/ia32/builtins-ia32.cc +64 -58
  227. data/vendor/v8/src/ia32/code-stubs-ia32.cc +248 -324
  228. data/vendor/v8/src/ia32/code-stubs-ia32.h +3 -44
  229. data/vendor/v8/src/ia32/codegen-ia32.cc +217 -165
  230. data/vendor/v8/src/ia32/codegen-ia32.h +3 -0
  231. data/vendor/v8/src/ia32/cpu-ia32.cc +6 -5
  232. data/vendor/v8/src/ia32/debug-ia32.cc +8 -5
  233. data/vendor/v8/src/ia32/deoptimizer-ia32.cc +124 -14
  234. data/vendor/v8/src/ia32/disasm-ia32.cc +85 -62
  235. data/vendor/v8/src/ia32/frames-ia32.h +1 -1
  236. data/vendor/v8/src/ia32/full-codegen-ia32.cc +348 -435
  237. data/vendor/v8/src/ia32/ic-ia32.cc +91 -91
  238. data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +500 -255
  239. data/vendor/v8/src/ia32/lithium-codegen-ia32.h +13 -4
  240. data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +6 -0
  241. data/vendor/v8/src/ia32/lithium-ia32.cc +122 -45
  242. data/vendor/v8/src/ia32/lithium-ia32.h +128 -41
  243. data/vendor/v8/src/ia32/macro-assembler-ia32.cc +109 -84
  244. data/vendor/v8/src/ia32/macro-assembler-ia32.h +18 -9
  245. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +26 -15
  246. data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +1 -0
  247. data/vendor/v8/src/ia32/register-allocator-ia32.cc +30 -30
  248. data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
  249. data/vendor/v8/src/ia32/stub-cache-ia32.cc +383 -400
  250. data/vendor/v8/src/ia32/virtual-frame-ia32.cc +36 -13
  251. data/vendor/v8/src/ia32/virtual-frame-ia32.h +11 -5
  252. data/vendor/v8/src/ic-inl.h +12 -2
  253. data/vendor/v8/src/ic.cc +304 -221
  254. data/vendor/v8/src/ic.h +115 -58
  255. data/vendor/v8/src/interpreter-irregexp.cc +25 -21
  256. data/vendor/v8/src/interpreter-irregexp.h +2 -1
  257. data/vendor/v8/src/isolate.cc +883 -0
  258. data/vendor/v8/src/isolate.h +1304 -0
  259. data/vendor/v8/src/json.js +10 -10
  260. data/vendor/v8/src/jsregexp.cc +111 -80
  261. data/vendor/v8/src/jsregexp.h +6 -7
  262. data/vendor/v8/src/jump-target-heavy.cc +5 -8
  263. data/vendor/v8/src/jump-target-heavy.h +0 -6
  264. data/vendor/v8/src/jump-target-inl.h +1 -1
  265. data/vendor/v8/src/jump-target-light.cc +3 -3
  266. data/vendor/v8/src/lithium-allocator-inl.h +2 -0
  267. data/vendor/v8/src/lithium-allocator.cc +42 -30
  268. data/vendor/v8/src/lithium-allocator.h +8 -22
  269. data/vendor/v8/src/lithium.cc +1 -0
  270. data/vendor/v8/src/liveedit.cc +141 -99
  271. data/vendor/v8/src/liveedit.h +7 -2
  272. data/vendor/v8/src/liveobjectlist-inl.h +90 -0
  273. data/vendor/v8/src/liveobjectlist.cc +2537 -1
  274. data/vendor/v8/src/liveobjectlist.h +245 -35
  275. data/vendor/v8/src/log-utils.cc +122 -35
  276. data/vendor/v8/src/log-utils.h +33 -36
  277. data/vendor/v8/src/log.cc +299 -241
  278. data/vendor/v8/src/log.h +177 -110
  279. data/vendor/v8/src/mark-compact.cc +612 -470
  280. data/vendor/v8/src/mark-compact.h +153 -80
  281. data/vendor/v8/src/messages.cc +16 -14
  282. data/vendor/v8/src/messages.js +30 -7
  283. data/vendor/v8/src/mips/assembler-mips-inl.h +155 -35
  284. data/vendor/v8/src/mips/assembler-mips.cc +1093 -219
  285. data/vendor/v8/src/mips/assembler-mips.h +552 -153
  286. data/vendor/v8/src/mips/builtins-mips.cc +43 -100
  287. data/vendor/v8/src/mips/code-stubs-mips.cc +752 -0
  288. data/vendor/v8/src/mips/code-stubs-mips.h +511 -0
  289. data/vendor/v8/src/mips/codegen-mips-inl.h +8 -14
  290. data/vendor/v8/src/mips/codegen-mips.cc +672 -896
  291. data/vendor/v8/src/mips/codegen-mips.h +271 -69
  292. data/vendor/v8/src/mips/constants-mips.cc +44 -20
  293. data/vendor/v8/src/mips/constants-mips.h +238 -40
  294. data/vendor/v8/src/mips/cpu-mips.cc +20 -3
  295. data/vendor/v8/src/mips/debug-mips.cc +35 -7
  296. data/vendor/v8/src/mips/deoptimizer-mips.cc +91 -0
  297. data/vendor/v8/src/mips/disasm-mips.cc +329 -93
  298. data/vendor/v8/src/mips/frames-mips.cc +2 -50
  299. data/vendor/v8/src/mips/frames-mips.h +24 -9
  300. data/vendor/v8/src/mips/full-codegen-mips.cc +473 -23
  301. data/vendor/v8/src/mips/ic-mips.cc +81 -45
  302. data/vendor/v8/src/mips/jump-target-mips.cc +11 -106
  303. data/vendor/v8/src/mips/lithium-codegen-mips.h +65 -0
  304. data/vendor/v8/src/mips/lithium-mips.h +304 -0
  305. data/vendor/v8/src/mips/macro-assembler-mips.cc +2391 -390
  306. data/vendor/v8/src/mips/macro-assembler-mips.h +718 -121
  307. data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
  308. data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
  309. data/vendor/v8/src/mips/register-allocator-mips-inl.h +0 -3
  310. data/vendor/v8/src/mips/register-allocator-mips.h +3 -2
  311. data/vendor/v8/src/mips/simulator-mips.cc +1009 -221
  312. data/vendor/v8/src/mips/simulator-mips.h +119 -36
  313. data/vendor/v8/src/mips/stub-cache-mips.cc +331 -148
  314. data/vendor/v8/src/mips/{fast-codegen-mips.cc → virtual-frame-mips-inl.h} +11 -30
  315. data/vendor/v8/src/mips/virtual-frame-mips.cc +137 -149
  316. data/vendor/v8/src/mips/virtual-frame-mips.h +294 -312
  317. data/vendor/v8/src/mirror-debugger.js +9 -8
  318. data/vendor/v8/src/mksnapshot.cc +2 -2
  319. data/vendor/v8/src/objects-debug.cc +16 -16
  320. data/vendor/v8/src/objects-inl.h +421 -195
  321. data/vendor/v8/src/objects-printer.cc +7 -7
  322. data/vendor/v8/src/objects-visiting.cc +1 -1
  323. data/vendor/v8/src/objects-visiting.h +33 -12
  324. data/vendor/v8/src/objects.cc +935 -658
  325. data/vendor/v8/src/objects.h +234 -139
  326. data/vendor/v8/src/parser.cc +484 -439
  327. data/vendor/v8/src/parser.h +35 -14
  328. data/vendor/v8/src/platform-cygwin.cc +173 -107
  329. data/vendor/v8/src/platform-freebsd.cc +224 -72
  330. data/vendor/v8/src/platform-linux.cc +234 -95
  331. data/vendor/v8/src/platform-macos.cc +215 -82
  332. data/vendor/v8/src/platform-nullos.cc +9 -3
  333. data/vendor/v8/src/platform-openbsd.cc +22 -7
  334. data/vendor/v8/src/platform-posix.cc +30 -5
  335. data/vendor/v8/src/platform-solaris.cc +120 -38
  336. data/vendor/v8/src/platform-tls-mac.h +62 -0
  337. data/vendor/v8/src/platform-tls-win32.h +62 -0
  338. data/vendor/v8/src/platform-tls.h +50 -0
  339. data/vendor/v8/src/platform-win32.cc +195 -97
  340. data/vendor/v8/src/platform.h +72 -15
  341. data/vendor/v8/src/preparse-data.cc +2 -0
  342. data/vendor/v8/src/preparser-api.cc +8 -2
  343. data/vendor/v8/src/preparser.cc +1 -1
  344. data/vendor/v8/src/prettyprinter.cc +43 -52
  345. data/vendor/v8/src/prettyprinter.h +1 -1
  346. data/vendor/v8/src/profile-generator-inl.h +0 -28
  347. data/vendor/v8/src/profile-generator.cc +942 -685
  348. data/vendor/v8/src/profile-generator.h +210 -176
  349. data/vendor/v8/src/property.cc +6 -0
  350. data/vendor/v8/src/property.h +14 -3
  351. data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +1 -1
  352. data/vendor/v8/src/regexp-macro-assembler.cc +28 -19
  353. data/vendor/v8/src/regexp-macro-assembler.h +11 -6
  354. data/vendor/v8/src/regexp-stack.cc +18 -10
  355. data/vendor/v8/src/regexp-stack.h +45 -21
  356. data/vendor/v8/src/regexp.js +3 -3
  357. data/vendor/v8/src/register-allocator-inl.h +3 -3
  358. data/vendor/v8/src/register-allocator.cc +1 -7
  359. data/vendor/v8/src/register-allocator.h +5 -15
  360. data/vendor/v8/src/rewriter.cc +2 -1
  361. data/vendor/v8/src/runtime-profiler.cc +158 -128
  362. data/vendor/v8/src/runtime-profiler.h +131 -15
  363. data/vendor/v8/src/runtime.cc +2409 -1692
  364. data/vendor/v8/src/runtime.h +93 -17
  365. data/vendor/v8/src/safepoint-table.cc +3 -0
  366. data/vendor/v8/src/safepoint-table.h +9 -3
  367. data/vendor/v8/src/scanner-base.cc +21 -28
  368. data/vendor/v8/src/scanner-base.h +22 -11
  369. data/vendor/v8/src/scanner.cc +3 -5
  370. data/vendor/v8/src/scanner.h +4 -2
  371. data/vendor/v8/src/scopeinfo.cc +11 -16
  372. data/vendor/v8/src/scopeinfo.h +26 -15
  373. data/vendor/v8/src/scopes.cc +67 -37
  374. data/vendor/v8/src/scopes.h +26 -12
  375. data/vendor/v8/src/serialize.cc +193 -154
  376. data/vendor/v8/src/serialize.h +41 -36
  377. data/vendor/v8/src/small-pointer-list.h +163 -0
  378. data/vendor/v8/src/snapshot-common.cc +1 -1
  379. data/vendor/v8/src/snapshot.h +3 -1
  380. data/vendor/v8/src/spaces-inl.h +30 -25
  381. data/vendor/v8/src/spaces.cc +263 -370
  382. data/vendor/v8/src/spaces.h +178 -166
  383. data/vendor/v8/src/string-search.cc +4 -3
  384. data/vendor/v8/src/string-search.h +21 -20
  385. data/vendor/v8/src/string-stream.cc +32 -24
  386. data/vendor/v8/src/string.js +7 -7
  387. data/vendor/v8/src/stub-cache.cc +324 -248
  388. data/vendor/v8/src/stub-cache.h +181 -155
  389. data/vendor/v8/src/token.cc +3 -3
  390. data/vendor/v8/src/token.h +3 -3
  391. data/vendor/v8/src/top.cc +218 -390
  392. data/vendor/v8/src/type-info.cc +98 -32
  393. data/vendor/v8/src/type-info.h +10 -3
  394. data/vendor/v8/src/unicode.cc +1 -1
  395. data/vendor/v8/src/unicode.h +1 -1
  396. data/vendor/v8/src/utils.h +3 -0
  397. data/vendor/v8/src/v8-counters.cc +18 -11
  398. data/vendor/v8/src/v8-counters.h +34 -13
  399. data/vendor/v8/src/v8.cc +66 -121
  400. data/vendor/v8/src/v8.h +7 -4
  401. data/vendor/v8/src/v8globals.h +18 -12
  402. data/vendor/v8/src/{memory.h → v8memory.h} +0 -0
  403. data/vendor/v8/src/v8natives.js +59 -18
  404. data/vendor/v8/src/v8threads.cc +127 -114
  405. data/vendor/v8/src/v8threads.h +42 -35
  406. data/vendor/v8/src/v8utils.h +2 -39
  407. data/vendor/v8/src/variables.h +1 -1
  408. data/vendor/v8/src/version.cc +26 -5
  409. data/vendor/v8/src/version.h +4 -0
  410. data/vendor/v8/src/virtual-frame-heavy-inl.h +2 -4
  411. data/vendor/v8/src/virtual-frame-light-inl.h +5 -4
  412. data/vendor/v8/src/vm-state-inl.h +21 -17
  413. data/vendor/v8/src/vm-state.h +7 -5
  414. data/vendor/v8/src/win32-headers.h +1 -0
  415. data/vendor/v8/src/x64/assembler-x64-inl.h +12 -11
  416. data/vendor/v8/src/x64/assembler-x64.cc +80 -40
  417. data/vendor/v8/src/x64/assembler-x64.h +67 -17
  418. data/vendor/v8/src/x64/builtins-x64.cc +34 -33
  419. data/vendor/v8/src/x64/code-stubs-x64.cc +636 -377
  420. data/vendor/v8/src/x64/code-stubs-x64.h +14 -48
  421. data/vendor/v8/src/x64/codegen-x64-inl.h +1 -1
  422. data/vendor/v8/src/x64/codegen-x64.cc +158 -136
  423. data/vendor/v8/src/x64/codegen-x64.h +4 -1
  424. data/vendor/v8/src/x64/cpu-x64.cc +7 -5
  425. data/vendor/v8/src/x64/debug-x64.cc +8 -6
  426. data/vendor/v8/src/x64/deoptimizer-x64.cc +195 -20
  427. data/vendor/v8/src/x64/disasm-x64.cc +42 -23
  428. data/vendor/v8/src/x64/frames-x64.cc +1 -1
  429. data/vendor/v8/src/x64/frames-x64.h +2 -2
  430. data/vendor/v8/src/x64/full-codegen-x64.cc +780 -218
  431. data/vendor/v8/src/x64/ic-x64.cc +77 -79
  432. data/vendor/v8/src/x64/jump-target-x64.cc +1 -1
  433. data/vendor/v8/src/x64/lithium-codegen-x64.cc +698 -181
  434. data/vendor/v8/src/x64/lithium-codegen-x64.h +31 -6
  435. data/vendor/v8/src/x64/lithium-x64.cc +136 -54
  436. data/vendor/v8/src/x64/lithium-x64.h +142 -51
  437. data/vendor/v8/src/x64/macro-assembler-x64.cc +456 -187
  438. data/vendor/v8/src/x64/macro-assembler-x64.h +166 -34
  439. data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +44 -28
  440. data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +8 -4
  441. data/vendor/v8/src/x64/register-allocator-x64-inl.h +3 -3
  442. data/vendor/v8/src/x64/register-allocator-x64.cc +12 -8
  443. data/vendor/v8/src/x64/simulator-x64.h +5 -5
  444. data/vendor/v8/src/x64/stub-cache-x64.cc +299 -344
  445. data/vendor/v8/src/x64/virtual-frame-x64.cc +37 -13
  446. data/vendor/v8/src/x64/virtual-frame-x64.h +13 -7
  447. data/vendor/v8/src/zone-inl.h +49 -3
  448. data/vendor/v8/src/zone.cc +42 -41
  449. data/vendor/v8/src/zone.h +37 -34
  450. data/vendor/v8/test/benchmarks/testcfg.py +100 -0
  451. data/vendor/v8/test/cctest/SConscript +5 -4
  452. data/vendor/v8/test/cctest/cctest.h +3 -2
  453. data/vendor/v8/test/cctest/cctest.status +6 -11
  454. data/vendor/v8/test/cctest/test-accessors.cc +3 -3
  455. data/vendor/v8/test/cctest/test-alloc.cc +39 -33
  456. data/vendor/v8/test/cctest/test-api.cc +1092 -205
  457. data/vendor/v8/test/cctest/test-assembler-arm.cc +39 -25
  458. data/vendor/v8/test/cctest/test-assembler-ia32.cc +36 -37
  459. data/vendor/v8/test/cctest/test-assembler-mips.cc +1098 -40
  460. data/vendor/v8/test/cctest/test-assembler-x64.cc +32 -25
  461. data/vendor/v8/test/cctest/test-ast.cc +1 -0
  462. data/vendor/v8/test/cctest/test-circular-queue.cc +8 -5
  463. data/vendor/v8/test/cctest/test-compiler.cc +24 -24
  464. data/vendor/v8/test/cctest/test-cpu-profiler.cc +140 -5
  465. data/vendor/v8/test/cctest/test-dataflow.cc +1 -0
  466. data/vendor/v8/test/cctest/test-debug.cc +136 -77
  467. data/vendor/v8/test/cctest/test-decls.cc +1 -1
  468. data/vendor/v8/test/cctest/test-deoptimization.cc +25 -24
  469. data/vendor/v8/test/cctest/test-disasm-arm.cc +9 -4
  470. data/vendor/v8/test/cctest/test-disasm-ia32.cc +10 -8
  471. data/vendor/v8/test/cctest/test-func-name-inference.cc +10 -4
  472. data/vendor/v8/test/cctest/test-heap-profiler.cc +226 -164
  473. data/vendor/v8/test/cctest/test-heap.cc +240 -217
  474. data/vendor/v8/test/cctest/test-liveedit.cc +1 -0
  475. data/vendor/v8/test/cctest/test-log-stack-tracer.cc +18 -20
  476. data/vendor/v8/test/cctest/test-log.cc +114 -108
  477. data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +247 -177
  478. data/vendor/v8/test/cctest/test-mark-compact.cc +129 -90
  479. data/vendor/v8/test/cctest/test-parsing.cc +15 -14
  480. data/vendor/v8/test/cctest/test-platform-linux.cc +1 -0
  481. data/vendor/v8/test/cctest/test-platform-tls.cc +66 -0
  482. data/vendor/v8/test/cctest/test-platform-win32.cc +1 -0
  483. data/vendor/v8/test/cctest/test-profile-generator.cc +1 -1
  484. data/vendor/v8/test/cctest/test-regexp.cc +53 -41
  485. data/vendor/v8/test/cctest/test-reloc-info.cc +18 -11
  486. data/vendor/v8/test/cctest/test-serialize.cc +44 -43
  487. data/vendor/v8/test/cctest/test-sockets.cc +8 -3
  488. data/vendor/v8/test/cctest/test-spaces.cc +47 -29
  489. data/vendor/v8/test/cctest/test-strings.cc +20 -20
  490. data/vendor/v8/test/cctest/test-thread-termination.cc +8 -3
  491. data/vendor/v8/test/cctest/test-threads.cc +5 -3
  492. data/vendor/v8/test/cctest/test-utils.cc +5 -4
  493. data/vendor/v8/test/cctest/testcfg.py +7 -3
  494. data/vendor/v8/test/es5conform/es5conform.status +2 -77
  495. data/vendor/v8/test/es5conform/testcfg.py +1 -1
  496. data/vendor/v8/test/message/testcfg.py +1 -1
  497. data/vendor/v8/test/mjsunit/accessors-on-global-object.js +3 -3
  498. data/vendor/v8/test/mjsunit/array-concat.js +43 -1
  499. data/vendor/v8/test/mjsunit/array-join.js +25 -0
  500. data/vendor/v8/test/mjsunit/bitops-info.js +7 -1
  501. data/vendor/v8/test/mjsunit/compiler/array-length.js +2 -2
  502. data/vendor/v8/test/mjsunit/compiler/global-accessors.js +47 -0
  503. data/vendor/v8/test/mjsunit/compiler/pic.js +1 -1
  504. data/vendor/v8/test/mjsunit/compiler/regress-loadfield.js +65 -0
  505. data/vendor/v8/test/mjsunit/math-sqrt.js +5 -1
  506. data/vendor/v8/test/mjsunit/mjsunit.js +59 -8
  507. data/vendor/v8/test/mjsunit/mjsunit.status +0 -12
  508. data/vendor/v8/test/mjsunit/mul-exhaustive.js +129 -11
  509. data/vendor/v8/test/mjsunit/negate-zero.js +1 -1
  510. data/vendor/v8/test/mjsunit/object-freeze.js +5 -13
  511. data/vendor/v8/test/mjsunit/object-prevent-extensions.js +9 -50
  512. data/vendor/v8/test/mjsunit/object-seal.js +4 -13
  513. data/vendor/v8/test/mjsunit/override-eval-with-non-function.js +36 -0
  514. data/vendor/v8/test/mjsunit/regress/regress-1145.js +54 -0
  515. data/vendor/v8/test/mjsunit/regress/regress-1172-bis.js +37 -0
  516. data/vendor/v8/test/mjsunit/regress/regress-1181.js +54 -0
  517. data/vendor/v8/test/mjsunit/regress/regress-1207.js +35 -0
  518. data/vendor/v8/test/mjsunit/regress/regress-1209.js +34 -0
  519. data/vendor/v8/test/mjsunit/regress/regress-1210.js +48 -0
  520. data/vendor/v8/test/mjsunit/regress/regress-1213.js +43 -0
  521. data/vendor/v8/test/mjsunit/regress/regress-1218.js +29 -0
  522. data/vendor/v8/test/mjsunit/regress/regress-1229.js +79 -0
  523. data/vendor/v8/test/mjsunit/regress/regress-1233.js +47 -0
  524. data/vendor/v8/test/mjsunit/regress/regress-1236.js +34 -0
  525. data/vendor/v8/test/mjsunit/regress/regress-1237.js +36 -0
  526. data/vendor/v8/test/mjsunit/regress/regress-1240.js +39 -0
  527. data/vendor/v8/test/mjsunit/regress/regress-1257.js +58 -0
  528. data/vendor/v8/test/mjsunit/regress/regress-1278.js +69 -0
  529. data/vendor/v8/test/mjsunit/regress/regress-create-exception.js +1 -0
  530. data/vendor/v8/test/mjsunit/regress/regress-lazy-deopt-reloc.js +52 -0
  531. data/vendor/v8/test/mjsunit/sin-cos.js +15 -10
  532. data/vendor/v8/test/mjsunit/smi-negative-zero.js +2 -2
  533. data/vendor/v8/test/mjsunit/str-to-num.js +1 -1
  534. data/vendor/v8/test/mjsunit/strict-mode.js +435 -0
  535. data/vendor/v8/test/mjsunit/testcfg.py +23 -6
  536. data/vendor/v8/test/mozilla/mozilla.status +0 -2
  537. data/vendor/v8/test/mozilla/testcfg.py +1 -1
  538. data/vendor/v8/test/preparser/empty.js +28 -0
  539. data/vendor/v8/test/preparser/functions-only.js +38 -0
  540. data/vendor/v8/test/preparser/non-alphanum.js +34 -0
  541. data/vendor/v8/test/preparser/symbols-only.js +49 -0
  542. data/vendor/v8/test/preparser/testcfg.py +90 -0
  543. data/vendor/v8/test/sputnik/testcfg.py +1 -1
  544. data/vendor/v8/test/test262/README +16 -0
  545. data/vendor/v8/test/test262/harness-adapt.js +80 -0
  546. data/vendor/v8/test/test262/test262.status +1506 -0
  547. data/vendor/v8/test/test262/testcfg.py +123 -0
  548. data/vendor/v8/tools/freebsd-tick-processor +10 -0
  549. data/vendor/v8/tools/gyp/v8.gyp +8 -33
  550. data/vendor/v8/tools/linux-tick-processor +5 -3
  551. data/vendor/v8/tools/test.py +37 -14
  552. data/vendor/v8/tools/tickprocessor.js +22 -8
  553. data/vendor/v8/tools/visual_studio/v8_base.vcproj +13 -1
  554. data/vendor/v8/tools/visual_studio/v8_base_arm.vcproj +5 -1
  555. data/vendor/v8/tools/visual_studio/v8_base_x64.vcproj +5 -1
  556. data/vendor/v8/tools/visual_studio/x64.vsprops +1 -0
  557. metadata +1495 -1341
  558. data/ext/extconf.rb +0 -22
  559. data/ext/mustang.cpp +0 -58
  560. data/vendor/v8/src/top.h +0 -608
@@ -1,4 +1,4 @@
1
- // Copyright 2010 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -357,6 +357,7 @@ class CodeGenerator: public AstVisitor {
357
357
  // Accessors
358
358
  inline bool is_eval();
359
359
  inline Scope* scope();
360
+ inline bool is_strict_mode();
360
361
  inline StrictModeFlag strict_mode_flag();
361
362
 
362
363
  // Generating deferred code.
@@ -732,6 +733,7 @@ class CodeGenerator: public AstVisitor {
732
733
  bool in_spilled_code_;
733
734
 
734
735
  friend class VirtualFrame;
736
+ friend class Isolate;
735
737
  friend class JumpTarget;
736
738
  friend class Reference;
737
739
  friend class Result;
@@ -740,6 +742,7 @@ class CodeGenerator: public AstVisitor {
740
742
  friend class FullCodeGenSyntaxChecker;
741
743
 
742
744
  friend class CodeGeneratorPatcher; // Used in test-log-stack-tracer.cc
745
+ friend class InlineRuntimeFunctionsTable;
743
746
 
744
747
  DISALLOW_COPY_AND_ASSIGN(CodeGenerator);
745
748
  };
@@ -1,4 +1,4 @@
1
- // Copyright 2009 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -42,10 +42,12 @@ namespace v8 {
42
42
  namespace internal {
43
43
 
44
44
  void CPU::Setup() {
45
- CpuFeatures::Probe(true);
46
- if (Serializer::enabled()) {
47
- V8::DisableCrankshaft();
48
- }
45
+ CpuFeatures::Probe();
46
+ }
47
+
48
+
49
+ bool CPU::SupportsCrankshaft() {
50
+ return true; // Yay!
49
51
  }
50
52
 
51
53
 
@@ -1,4 +1,4 @@
1
- // Copyright 2010 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -49,7 +49,8 @@ bool BreakLocationIterator::IsDebugBreakAtReturn() {
49
49
  void BreakLocationIterator::SetDebugBreakAtReturn() {
50
50
  ASSERT(Assembler::kJSReturnSequenceLength >=
51
51
  Assembler::kCallInstructionLength);
52
- rinfo()->PatchCodeWithCall(Debug::debug_break_return()->entry(),
52
+ rinfo()->PatchCodeWithCall(
53
+ Isolate::Current()->debug()->debug_break_return()->entry(),
53
54
  Assembler::kJSReturnSequenceLength - Assembler::kCallInstructionLength);
54
55
  }
55
56
 
@@ -79,7 +80,7 @@ bool BreakLocationIterator::IsDebugBreakAtSlot() {
79
80
  void BreakLocationIterator::SetDebugBreakAtSlot() {
80
81
  ASSERT(IsDebugBreakSlot());
81
82
  rinfo()->PatchCodeWithCall(
82
- Debug::debug_break_slot()->entry(),
83
+ Isolate::Current()->debug()->debug_break_slot()->entry(),
83
84
  Assembler::kDebugBreakSlotLength - Assembler::kCallInstructionLength);
84
85
  }
85
86
 
@@ -128,7 +129,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
128
129
  __ RecordComment("// Calling from debug break to runtime - come in - over");
129
130
  #endif
130
131
  __ Set(rax, 0); // No arguments (argc == 0).
131
- __ movq(rbx, ExternalReference::debug_break());
132
+ __ movq(rbx, ExternalReference::debug_break(masm->isolate()));
132
133
 
133
134
  CEntryStub ceb(1);
134
135
  __ CallStub(&ceb);
@@ -167,7 +168,7 @@ static void Generate_DebugBreakCallHelper(MacroAssembler* masm,
167
168
  // jumping to the target address intended by the caller and that was
168
169
  // overwritten by the address of DebugBreakXXX.
169
170
  ExternalReference after_break_target =
170
- ExternalReference(Debug_Address::AfterBreakTarget());
171
+ ExternalReference(Debug_Address::AfterBreakTarget(), masm->isolate());
171
172
  __ movq(kScratchRegister, after_break_target);
172
173
  __ jmp(Operand(kScratchRegister, 0));
173
174
  }
@@ -283,7 +284,8 @@ void Debug::GeneratePlainReturnLiveEdit(MacroAssembler* masm) {
283
284
 
284
285
  void Debug::GenerateFrameDropperLiveEdit(MacroAssembler* masm) {
285
286
  ExternalReference restarter_frame_function_slot =
286
- ExternalReference(Debug_Address::RestarterFrameFunctionPointer());
287
+ ExternalReference(Debug_Address::RestarterFrameFunctionPointer(),
288
+ masm->isolate());
287
289
  __ movq(rax, restarter_frame_function_slot);
288
290
  __ movq(Operand(rax, 0), Immediate(0));
289
291
 
@@ -101,7 +101,13 @@ class SafepointTableDeoptimiztionEntryIterator {
101
101
  };
102
102
 
103
103
 
104
+ void Deoptimizer::EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code) {
105
+ // TODO(1276): Implement.
106
+ }
107
+
108
+
104
109
  void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
110
+ HandleScope scope;
105
111
  AssertNoAllocation no_allocation;
106
112
 
107
113
  if (!function->IsOptimized()) return;
@@ -186,8 +192,9 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
186
192
 
187
193
  // Add the deoptimizing code to the list.
188
194
  DeoptimizingCodeListNode* node = new DeoptimizingCodeListNode(code);
189
- node->set_next(deoptimizing_code_list_);
190
- deoptimizing_code_list_ = node;
195
+ DeoptimizerData* data = code->GetIsolate()->deoptimizer_data();
196
+ node->set_next(data->deoptimizing_code_list_);
197
+ data->deoptimizing_code_list_ = node;
191
198
 
192
199
  // Set the code for the function to non-optimized version.
193
200
  function->ReplaceCode(function->shared()->code());
@@ -196,6 +203,11 @@ void Deoptimizer::DeoptimizeFunction(JSFunction* function) {
196
203
  PrintF("[forced deoptimization: ");
197
204
  function->PrintName();
198
205
  PrintF(" / %" V8PRIxPTR "]\n", reinterpret_cast<intptr_t>(function));
206
+ #ifdef DEBUG
207
+ if (FLAG_print_code) {
208
+ code->PrintLn();
209
+ }
210
+ #endif
199
211
  }
200
212
  }
201
213
 
@@ -224,7 +236,7 @@ void Deoptimizer::PatchStackCheckCodeAt(Address pc_after,
224
236
  // ok:
225
237
  //
226
238
  ASSERT(*(call_target_address - 3) == 0x73 && // jae
227
- *(call_target_address - 2) == 0x05 && // offset
239
+ *(call_target_address - 2) == 0x07 && // offset
228
240
  *(call_target_address - 1) == 0xe8); // call
229
241
  *(call_target_address - 3) = 0x90; // nop
230
242
  *(call_target_address - 2) = 0x90; // nop
@@ -245,14 +257,174 @@ void Deoptimizer::RevertStackCheckCodeAt(Address pc_after,
245
257
  *(call_target_address - 2) == 0x90 && // nop
246
258
  *(call_target_address - 1) == 0xe8); // call
247
259
  *(call_target_address - 3) = 0x73; // jae
248
- *(call_target_address - 2) = 0x05; // offset
260
+ *(call_target_address - 2) = 0x07; // offset
249
261
  Assembler::set_target_address_at(call_target_address,
250
262
  check_code->entry());
251
263
  }
252
264
 
253
265
 
266
+ static int LookupBailoutId(DeoptimizationInputData* data, unsigned ast_id) {
267
+ ByteArray* translations = data->TranslationByteArray();
268
+ int length = data->DeoptCount();
269
+ for (int i = 0; i < length; i++) {
270
+ if (static_cast<unsigned>(data->AstId(i)->value()) == ast_id) {
271
+ TranslationIterator it(translations, data->TranslationIndex(i)->value());
272
+ int value = it.Next();
273
+ ASSERT(Translation::BEGIN == static_cast<Translation::Opcode>(value));
274
+ // Read the number of frames.
275
+ value = it.Next();
276
+ if (value == 1) return i;
277
+ }
278
+ }
279
+ UNREACHABLE();
280
+ return -1;
281
+ }
282
+
283
+
254
284
  void Deoptimizer::DoComputeOsrOutputFrame() {
255
- UNIMPLEMENTED();
285
+ DeoptimizationInputData* data = DeoptimizationInputData::cast(
286
+ optimized_code_->deoptimization_data());
287
+ unsigned ast_id = data->OsrAstId()->value();
288
+ // TODO(kasperl): This should not be the bailout_id_. It should be
289
+ // the ast id. Confusing.
290
+ ASSERT(bailout_id_ == ast_id);
291
+
292
+ int bailout_id = LookupBailoutId(data, ast_id);
293
+ unsigned translation_index = data->TranslationIndex(bailout_id)->value();
294
+ ByteArray* translations = data->TranslationByteArray();
295
+
296
+ TranslationIterator iterator(translations, translation_index);
297
+ Translation::Opcode opcode =
298
+ static_cast<Translation::Opcode>(iterator.Next());
299
+ ASSERT(Translation::BEGIN == opcode);
300
+ USE(opcode);
301
+ int count = iterator.Next();
302
+ ASSERT(count == 1);
303
+ USE(count);
304
+
305
+ opcode = static_cast<Translation::Opcode>(iterator.Next());
306
+ USE(opcode);
307
+ ASSERT(Translation::FRAME == opcode);
308
+ unsigned node_id = iterator.Next();
309
+ USE(node_id);
310
+ ASSERT(node_id == ast_id);
311
+ JSFunction* function = JSFunction::cast(ComputeLiteral(iterator.Next()));
312
+ USE(function);
313
+ ASSERT(function == function_);
314
+ unsigned height = iterator.Next();
315
+ unsigned height_in_bytes = height * kPointerSize;
316
+ USE(height_in_bytes);
317
+
318
+ unsigned fixed_size = ComputeFixedSize(function_);
319
+ unsigned input_frame_size = static_cast<unsigned>(input_->GetFrameSize());
320
+ ASSERT(fixed_size + height_in_bytes == input_frame_size);
321
+
322
+ unsigned stack_slot_size = optimized_code_->stack_slots() * kPointerSize;
323
+ unsigned outgoing_height = data->ArgumentsStackHeight(bailout_id)->value();
324
+ unsigned outgoing_size = outgoing_height * kPointerSize;
325
+ unsigned output_frame_size = fixed_size + stack_slot_size + outgoing_size;
326
+ ASSERT(outgoing_size == 0); // OSR does not happen in the middle of a call.
327
+
328
+ if (FLAG_trace_osr) {
329
+ PrintF("[on-stack replacement: begin 0x%08" V8PRIxPTR " ",
330
+ reinterpret_cast<intptr_t>(function_));
331
+ function_->PrintName();
332
+ PrintF(" => node=%u, frame=%d->%d]\n",
333
+ ast_id,
334
+ input_frame_size,
335
+ output_frame_size);
336
+ }
337
+
338
+ // There's only one output frame in the OSR case.
339
+ output_count_ = 1;
340
+ output_ = new FrameDescription*[1];
341
+ output_[0] = new(output_frame_size) FrameDescription(
342
+ output_frame_size, function_);
343
+
344
+ // Clear the incoming parameters in the optimized frame to avoid
345
+ // confusing the garbage collector.
346
+ unsigned output_offset = output_frame_size - kPointerSize;
347
+ int parameter_count = function_->shared()->formal_parameter_count() + 1;
348
+ for (int i = 0; i < parameter_count; ++i) {
349
+ output_[0]->SetFrameSlot(output_offset, 0);
350
+ output_offset -= kPointerSize;
351
+ }
352
+
353
+ // Translate the incoming parameters. This may overwrite some of the
354
+ // incoming argument slots we've just cleared.
355
+ int input_offset = input_frame_size - kPointerSize;
356
+ bool ok = true;
357
+ int limit = input_offset - (parameter_count * kPointerSize);
358
+ while (ok && input_offset > limit) {
359
+ ok = DoOsrTranslateCommand(&iterator, &input_offset);
360
+ }
361
+
362
+ // There are no translation commands for the caller's pc and fp, the
363
+ // context, and the function. Set them up explicitly.
364
+ for (int i = StandardFrameConstants::kCallerPCOffset;
365
+ ok && i >= StandardFrameConstants::kMarkerOffset;
366
+ i -= kPointerSize) {
367
+ intptr_t input_value = input_->GetFrameSlot(input_offset);
368
+ if (FLAG_trace_osr) {
369
+ const char* name = "UNKNOWN";
370
+ switch (i) {
371
+ case StandardFrameConstants::kCallerPCOffset:
372
+ name = "caller's pc";
373
+ break;
374
+ case StandardFrameConstants::kCallerFPOffset:
375
+ name = "fp";
376
+ break;
377
+ case StandardFrameConstants::kContextOffset:
378
+ name = "context";
379
+ break;
380
+ case StandardFrameConstants::kMarkerOffset:
381
+ name = "function";
382
+ break;
383
+ }
384
+ PrintF(" [rsp + %d] <- 0x%08" V8PRIxPTR " ; [rsp + %d] "
385
+ "(fixed part - %s)\n",
386
+ output_offset,
387
+ input_value,
388
+ input_offset,
389
+ name);
390
+ }
391
+ output_[0]->SetFrameSlot(output_offset, input_->GetFrameSlot(input_offset));
392
+ input_offset -= kPointerSize;
393
+ output_offset -= kPointerSize;
394
+ }
395
+
396
+ // Translate the rest of the frame.
397
+ while (ok && input_offset >= 0) {
398
+ ok = DoOsrTranslateCommand(&iterator, &input_offset);
399
+ }
400
+
401
+ // If translation of any command failed, continue using the input frame.
402
+ if (!ok) {
403
+ delete output_[0];
404
+ output_[0] = input_;
405
+ output_[0]->SetPc(reinterpret_cast<intptr_t>(from_));
406
+ } else {
407
+ // Setup the frame pointer and the context pointer.
408
+ output_[0]->SetRegister(rbp.code(), input_->GetRegister(rbp.code()));
409
+ output_[0]->SetRegister(rsi.code(), input_->GetRegister(rsi.code()));
410
+
411
+ unsigned pc_offset = data->OsrPcOffset()->value();
412
+ intptr_t pc = reinterpret_cast<intptr_t>(
413
+ optimized_code_->entry() + pc_offset);
414
+ output_[0]->SetPc(pc);
415
+ }
416
+ Code* continuation =
417
+ function->GetIsolate()->builtins()->builtin(Builtins::kNotifyOSR);
418
+ output_[0]->SetContinuation(
419
+ reinterpret_cast<intptr_t>(continuation->entry()));
420
+
421
+ if (FLAG_trace_osr) {
422
+ PrintF("[on-stack replacement translation %s: 0x%08" V8PRIxPTR " ",
423
+ ok ? "finished" : "aborted",
424
+ reinterpret_cast<intptr_t>(function));
425
+ function->PrintName();
426
+ PrintF(" => pc=0x%0" V8PRIxPTR "]\n", output_[0]->GetPc());
427
+ }
256
428
  }
257
429
 
258
430
 
@@ -414,8 +586,8 @@ void Deoptimizer::DoComputeFrame(TranslationIterator* iterator,
414
586
  // Set the continuation for the topmost frame.
415
587
  if (is_topmost) {
416
588
  Code* continuation = (bailout_type_ == EAGER)
417
- ? Builtins::builtin(Builtins::NotifyDeoptimized)
418
- : Builtins::builtin(Builtins::NotifyLazyDeoptimized);
589
+ ? isolate_->builtins()->builtin(Builtins::kNotifyDeoptimized)
590
+ : isolate_->builtins()->builtin(Builtins::kNotifyLazyDeoptimized);
419
591
  output_frame->SetContinuation(
420
592
  reinterpret_cast<intptr_t>(continuation->entry()));
421
593
  }
@@ -491,21 +663,26 @@ void Deoptimizer::EntryGenerator::Generate() {
491
663
  __ neg(arg5);
492
664
 
493
665
  // Allocate a new deoptimizer object.
494
- __ PrepareCallCFunction(5);
666
+ __ PrepareCallCFunction(6);
495
667
  __ movq(rax, Operand(rbp, JavaScriptFrameConstants::kFunctionOffset));
496
668
  __ movq(arg1, rax);
497
669
  __ movq(arg2, Immediate(type()));
498
670
  // Args 3 and 4 are already in the right registers.
499
671
 
500
- // On windows put the argument on the stack (PrepareCallCFunction have
501
- // created space for this). On linux pass the argument in r8.
672
+ // On windows put the arguments on the stack (PrepareCallCFunction
673
+ // has created space for this). On linux pass the arguments in r8 and r9.
502
674
  #ifdef _WIN64
503
- __ movq(Operand(rsp, 0 * kPointerSize), arg5);
675
+ __ movq(Operand(rsp, 4 * kPointerSize), arg5);
676
+ __ LoadAddress(arg5, ExternalReference::isolate_address());
677
+ __ movq(Operand(rsp, 5 * kPointerSize), arg5);
504
678
  #else
505
679
  __ movq(r8, arg5);
680
+ __ LoadAddress(r9, ExternalReference::isolate_address());
506
681
  #endif
507
682
 
508
- __ CallCFunction(ExternalReference::new_deoptimizer_function(), 5);
683
+ Isolate* isolate = masm()->isolate();
684
+
685
+ __ CallCFunction(ExternalReference::new_deoptimizer_function(isolate), 6);
509
686
  // Preserve deoptimizer object in register rax and get the input
510
687
  // frame descriptor pointer.
511
688
  __ movq(rbx, Operand(rax, Deoptimizer::input_offset()));
@@ -548,9 +725,11 @@ void Deoptimizer::EntryGenerator::Generate() {
548
725
 
549
726
  // Compute the output frame in the deoptimizer.
550
727
  __ push(rax);
551
- __ PrepareCallCFunction(1);
728
+ __ PrepareCallCFunction(2);
552
729
  __ movq(arg1, rax);
553
- __ CallCFunction(ExternalReference::compute_output_frames_function(), 1);
730
+ __ LoadAddress(arg2, ExternalReference::isolate_address());
731
+ __ CallCFunction(
732
+ ExternalReference::compute_output_frames_function(isolate), 2);
554
733
  __ pop(rax);
555
734
 
556
735
  // Replace the current frame with the output frames.
@@ -608,12 +787,8 @@ void Deoptimizer::EntryGenerator::Generate() {
608
787
  }
609
788
 
610
789
  // Set up the roots register.
611
- ExternalReference roots_address = ExternalReference::roots_address();
612
- __ movq(r13, roots_address);
613
-
614
- __ movq(kSmiConstantRegister,
615
- reinterpret_cast<uint64_t>(Smi::FromInt(kSmiConstantRegisterValue)),
616
- RelocInfo::NONE);
790
+ __ InitializeRootRegister();
791
+ __ InitializeSmiConstantRegister();
617
792
 
618
793
  // Return to the continuation point.
619
794
  __ ret(0);
@@ -1,4 +1,4 @@
1
- // Copyright 2009 the V8 project authors. All rights reserved.
1
+ // Copyright 2011 the V8 project authors. All rights reserved.
2
2
  // Redistribution and use in source and binary forms, with or without
3
3
  // modification, are permitted provided that the following conditions are
4
4
  // met:
@@ -269,6 +269,7 @@ void InstructionTable::AddJumpConditionalShort() {
269
269
 
270
270
  static InstructionTable instruction_table;
271
271
 
272
+
272
273
  static InstructionDesc cmov_instructions[16] = {
273
274
  {"cmovo", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
274
275
  {"cmovno", TWO_OPERANDS_INSTR, REG_OPER_OP_ORDER, false},
@@ -451,9 +452,11 @@ void DisassemblerX64::AppendToBuffer(const char* format, ...) {
451
452
 
452
453
  int DisassemblerX64::PrintRightOperandHelper(
453
454
  byte* modrmp,
454
- RegisterNameMapping register_name) {
455
+ RegisterNameMapping direct_register_name) {
455
456
  int mod, regop, rm;
456
457
  get_modrm(*modrmp, &mod, &regop, &rm);
458
+ RegisterNameMapping register_name = (mod == 3) ? direct_register_name :
459
+ &DisassemblerX64::NameOfCPURegister;
457
460
  switch (mod) {
458
461
  case 0:
459
462
  if ((rm & 7) == 5) {
@@ -1028,7 +1031,7 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
1028
1031
  } else if (opcode == 0x6F) {
1029
1032
  AppendToBuffer("movdqa %s,",
1030
1033
  NameOfXMMRegister(regop));
1031
- current += PrintRightOperand(current);
1034
+ current += PrintRightXMMOperand(current);
1032
1035
  } else if (opcode == 0x7E) {
1033
1036
  AppendToBuffer("mov%c ",
1034
1037
  rex_w() ? 'q' : 'd');
@@ -1036,18 +1039,22 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
1036
1039
  AppendToBuffer(", %s", NameOfXMMRegister(regop));
1037
1040
  } else if (opcode == 0x7F) {
1038
1041
  AppendToBuffer("movdqa ");
1039
- current += PrintRightOperand(current);
1042
+ current += PrintRightXMMOperand(current);
1040
1043
  AppendToBuffer(", %s", NameOfXMMRegister(regop));
1041
1044
  } else {
1042
1045
  const char* mnemonic = "?";
1043
- if (opcode == 0x57) {
1046
+ if (opcode == 0x50) {
1047
+ mnemonic = "movmskpd";
1048
+ } else if (opcode == 0x54) {
1049
+ mnemonic = "andpd";
1050
+ } else if (opcode == 0x56) {
1051
+ mnemonic = "orpd";
1052
+ } else if (opcode == 0x57) {
1044
1053
  mnemonic = "xorpd";
1045
1054
  } else if (opcode == 0x2E) {
1046
1055
  mnemonic = "ucomisd";
1047
1056
  } else if (opcode == 0x2F) {
1048
1057
  mnemonic = "comisd";
1049
- } else if (opcode == 0x50) {
1050
- mnemonic = "movmskpd";
1051
1058
  } else {
1052
1059
  UnimplementedInstruction();
1053
1060
  }
@@ -1064,11 +1071,11 @@ int DisassemblerX64::TwoByteOpcodeInstruction(byte* data) {
1064
1071
  int mod, regop, rm;
1065
1072
  get_modrm(*current, &mod, &regop, &rm);
1066
1073
  if (opcode == 0x11) {
1067
- current += PrintRightOperand(current);
1074
+ current += PrintRightXMMOperand(current);
1068
1075
  AppendToBuffer(",%s", NameOfXMMRegister(regop));
1069
1076
  } else {
1070
1077
  AppendToBuffer("%s,", NameOfXMMRegister(regop));
1071
- current += PrintRightOperand(current);
1078
+ current += PrintRightXMMOperand(current);
1072
1079
  }
1073
1080
  } else if (opcode == 0x2A) {
1074
1081
  // CVTSI2SD: integer to XMM double conversion.
@@ -1431,19 +1438,26 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer,
1431
1438
  {
1432
1439
  bool is_byte = *data == 0xC6;
1433
1440
  data++;
1434
-
1435
- AppendToBuffer("mov%c ", is_byte ? 'b' : operand_size_code());
1436
- data += PrintRightOperand(data);
1437
- int32_t imm = is_byte ? *data : *reinterpret_cast<int32_t*>(data);
1438
- AppendToBuffer(",0x%x", imm);
1439
- data += is_byte ? 1 : 4;
1441
+ if (is_byte) {
1442
+ AppendToBuffer("movb ");
1443
+ data += PrintRightByteOperand(data);
1444
+ int32_t imm = *data;
1445
+ AppendToBuffer(",0x%x", imm);
1446
+ data++;
1447
+ } else {
1448
+ AppendToBuffer("mov%c ", operand_size_code());
1449
+ data += PrintRightOperand(data);
1450
+ int32_t imm = *reinterpret_cast<int32_t*>(data);
1451
+ AppendToBuffer(",0x%x", imm);
1452
+ data += 4;
1453
+ }
1440
1454
  }
1441
1455
  break;
1442
1456
 
1443
1457
  case 0x80: {
1444
1458
  data++;
1445
1459
  AppendToBuffer("cmpb ");
1446
- data += PrintRightOperand(data);
1460
+ data += PrintRightByteOperand(data);
1447
1461
  int32_t imm = *data;
1448
1462
  AppendToBuffer(",0x%x", imm);
1449
1463
  data++;
@@ -1457,9 +1471,15 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer,
1457
1471
  int mod, regop, rm;
1458
1472
  data++;
1459
1473
  get_modrm(*data, &mod, &regop, &rm);
1460
- AppendToBuffer("mov%c ", is_byte ? 'b' : operand_size_code());
1461
- data += PrintRightOperand(data);
1462
- AppendToBuffer(",%s", NameOfCPURegister(regop));
1474
+ if (is_byte) {
1475
+ AppendToBuffer("movb ");
1476
+ data += PrintRightByteOperand(data);
1477
+ AppendToBuffer(",%s", NameOfByteCPURegister(regop));
1478
+ } else {
1479
+ AppendToBuffer("mov%c ", operand_size_code());
1480
+ data += PrintRightOperand(data);
1481
+ AppendToBuffer(",%s", NameOfCPURegister(regop));
1482
+ }
1463
1483
  }
1464
1484
  break;
1465
1485
 
@@ -1489,7 +1509,7 @@ int DisassemblerX64::InstructionDecode(v8::internal::Vector<char> out_buffer,
1489
1509
  get_modrm(*data, &mod, &regop, &rm);
1490
1510
  if (regop == 1) {
1491
1511
  AppendToBuffer("decb ");
1492
- data += PrintRightOperand(data);
1512
+ data += PrintRightByteOperand(data);
1493
1513
  } else {
1494
1514
  UnimplementedInstruction();
1495
1515
  }
@@ -1648,9 +1668,8 @@ static const char* xmm_regs[16] = {
1648
1668
 
1649
1669
 
1650
1670
  const char* NameConverter::NameOfAddress(byte* addr) const {
1651
- static v8::internal::EmbeddedVector<char, 32> tmp_buffer;
1652
- v8::internal::OS::SNPrintF(tmp_buffer, "%p", addr);
1653
- return tmp_buffer.start();
1671
+ v8::internal::OS::SNPrintF(tmp_buffer_, "%p", addr);
1672
+ return tmp_buffer_.start();
1654
1673
  }
1655
1674
 
1656
1675