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
data/vendor/v8/src/api.h CHANGED
@@ -122,7 +122,7 @@ template <typename T> static inline T ToCData(v8::internal::Object* obj) {
122
122
  template <typename T>
123
123
  static inline v8::internal::Handle<v8::internal::Object> FromCData(T obj) {
124
124
  STATIC_ASSERT(sizeof(T) == sizeof(v8::internal::Address));
125
- return v8::internal::Factory::NewProxy(
125
+ return FACTORY->NewProxy(
126
126
  reinterpret_cast<v8::internal::Address>(reinterpret_cast<intptr_t>(obj)));
127
127
  }
128
128
 
@@ -157,7 +157,6 @@ class RegisteredExtension {
157
157
  RegisteredExtension* next_auto_;
158
158
  ExtensionTraversalState state_;
159
159
  static RegisteredExtension* first_extension_;
160
- static RegisteredExtension* first_auto_extension_;
161
160
  };
162
161
 
163
162
 
@@ -321,16 +320,83 @@ MAKE_OPEN_HANDLE(StackFrame, JSObject)
321
320
 
322
321
  namespace internal {
323
322
 
323
+ // Tracks string usage to help make better decisions when
324
+ // externalizing strings.
325
+ //
326
+ // Implementation note: internally this class only tracks fresh
327
+ // strings and keeps a single use counter for them.
328
+ class StringTracker {
329
+ public:
330
+ // Records that the given string's characters were copied to some
331
+ // external buffer. If this happens often we should honor
332
+ // externalization requests for the string.
333
+ void RecordWrite(Handle<String> string) {
334
+ Address address = reinterpret_cast<Address>(*string);
335
+ Address top = isolate_->heap()->NewSpaceTop();
336
+ if (IsFreshString(address, top)) {
337
+ IncrementUseCount(top);
338
+ }
339
+ }
340
+
341
+ // Estimates freshness and use frequency of the given string based
342
+ // on how close it is to the new space top and the recorded usage
343
+ // history.
344
+ inline bool IsFreshUnusedString(Handle<String> string) {
345
+ Address address = reinterpret_cast<Address>(*string);
346
+ Address top = isolate_->heap()->NewSpaceTop();
347
+ return IsFreshString(address, top) && IsUseCountLow(top);
348
+ }
349
+
350
+ private:
351
+ StringTracker() : use_count_(0), last_top_(NULL), isolate_(NULL) { }
352
+
353
+ static inline bool IsFreshString(Address string, Address top) {
354
+ return top - kFreshnessLimit <= string && string <= top;
355
+ }
356
+
357
+ inline bool IsUseCountLow(Address top) {
358
+ if (last_top_ != top) return true;
359
+ return use_count_ < kUseLimit;
360
+ }
361
+
362
+ inline void IncrementUseCount(Address top) {
363
+ if (last_top_ != top) {
364
+ use_count_ = 0;
365
+ last_top_ = top;
366
+ }
367
+ ++use_count_;
368
+ }
369
+
370
+ // Single use counter shared by all fresh strings.
371
+ int use_count_;
372
+
373
+ // Last new space top when the use count above was valid.
374
+ Address last_top_;
375
+
376
+ Isolate* isolate_;
377
+
378
+ // How close to the new space top a fresh string has to be.
379
+ static const int kFreshnessLimit = 1024;
380
+
381
+ // The number of uses required to consider a string useful.
382
+ static const int kUseLimit = 32;
383
+
384
+ friend class Isolate;
385
+
386
+ DISALLOW_COPY_AND_ASSIGN(StringTracker);
387
+ };
388
+
389
+
324
390
  // This class is here in order to be able to declare it a friend of
325
391
  // HandleScope. Moving these methods to be members of HandleScope would be
326
- // neat in some ways, but it would expose external implementation details in
392
+ // neat in some ways, but it would expose internal implementation details in
327
393
  // our public header file, which is undesirable.
328
394
  //
329
- // There is a singleton instance of this class to hold the per-thread data.
330
- // For multithreaded V8 programs this data is copied in and out of storage
395
+ // An isolate has a single instance of this class to hold the current thread's
396
+ // data. In multithreaded V8 programs this data is copied in and out of storage
331
397
  // so that the currently executing thread always has its own copy of this
332
398
  // data.
333
- class HandleScopeImplementer {
399
+ ISOLATED_CLASS HandleScopeImplementer {
334
400
  public:
335
401
 
336
402
  HandleScopeImplementer()
@@ -341,16 +407,14 @@ class HandleScopeImplementer {
341
407
  ignore_out_of_memory_(false),
342
408
  call_depth_(0) { }
343
409
 
344
- static HandleScopeImplementer* instance();
345
-
346
410
  // Threading support for handle data.
347
411
  static int ArchiveSpacePerThread();
348
- static char* RestoreThread(char* from);
349
- static char* ArchiveThread(char* to);
350
- static void FreeThreadResources();
412
+ char* RestoreThread(char* from);
413
+ char* ArchiveThread(char* to);
414
+ void FreeThreadResources();
351
415
 
352
416
  // Garbage collection support.
353
- static void Iterate(v8::internal::ObjectVisitor* v);
417
+ void Iterate(v8::internal::ObjectVisitor* v);
354
418
  static char* Iterate(v8::internal::ObjectVisitor* v, char* data);
355
419
 
356
420
 
@@ -31,11 +31,6 @@
31
31
  namespace v8 {
32
32
  class ImplementationUtilities {
33
33
  public:
34
- static v8::Handle<v8::Primitive> Undefined();
35
- static v8::Handle<v8::Primitive> Null();
36
- static v8::Handle<v8::Boolean> True();
37
- static v8::Handle<v8::Boolean> False();
38
-
39
34
  static int GetNameCount(ExtensionConfiguration* that) {
40
35
  return that->name_count_;
41
36
  }
@@ -68,8 +63,6 @@ class ImplementationUtilities {
68
63
  // to access the HandleScope data.
69
64
  typedef v8::HandleScope::Data HandleScopeData;
70
65
 
71
- static HandleScopeData* CurrentHandleScope();
72
-
73
66
  #ifdef DEBUG
74
67
  static void ZapHandleRange(internal::Object** begin, internal::Object** end);
75
68
  #endif
@@ -65,7 +65,6 @@ class Arguments BASE_EMBEDDED {
65
65
  int length() const { return length_; }
66
66
 
67
67
  Object** arguments() { return arguments_; }
68
-
69
68
  private:
70
69
  int length_;
71
70
  Object** arguments_;
@@ -77,15 +76,16 @@ class Arguments BASE_EMBEDDED {
77
76
  // can.
78
77
  class CustomArguments : public Relocatable {
79
78
  public:
80
- inline CustomArguments(Object* data,
79
+ inline CustomArguments(Isolate* isolate,
80
+ Object* data,
81
81
  Object* self,
82
- JSObject* holder) {
82
+ JSObject* holder) : Relocatable(isolate) {
83
83
  values_[2] = self;
84
84
  values_[1] = holder;
85
85
  values_[0] = data;
86
86
  }
87
87
 
88
- inline CustomArguments() {
88
+ inline explicit CustomArguments(Isolate* isolate) : Relocatable(isolate) {
89
89
  #ifdef DEBUG
90
90
  for (size_t i = 0; i < ARRAY_SIZE(values_); i++) {
91
91
  values_[i] = reinterpret_cast<Object*>(kZapValue);
@@ -100,6 +100,17 @@ class CustomArguments : public Relocatable {
100
100
  };
101
101
 
102
102
 
103
+ #define DECLARE_RUNTIME_FUNCTION(Type, Name) \
104
+ Type Name(Arguments args, Isolate* isolate)
105
+
106
+
107
+ #define RUNTIME_FUNCTION(Type, Name) \
108
+ Type Name(Arguments args, Isolate* isolate)
109
+
110
+
111
+ #define RUNTIME_ARGUMENTS(isolate, args) args, isolate
112
+
113
+
103
114
  } } // namespace v8::internal
104
115
 
105
116
  #endif // V8_ARGUMENTS_H_
@@ -203,11 +203,12 @@ void RelocInfo::Visit(ObjectVisitor* visitor) {
203
203
  } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
204
204
  visitor->VisitExternalReference(target_reference_address());
205
205
  #ifdef ENABLE_DEBUGGER_SUPPORT
206
- } else if (Debug::has_break_points() &&
207
- ((RelocInfo::IsJSReturn(mode) &&
206
+ // TODO(isolates): Get a cached isolate below.
207
+ } else if (((RelocInfo::IsJSReturn(mode) &&
208
208
  IsPatchedReturnSequence()) ||
209
209
  (RelocInfo::IsDebugBreakSlot(mode) &&
210
- IsPatchedDebugBreakSlotSequence()))) {
210
+ IsPatchedDebugBreakSlotSequence())) &&
211
+ Isolate::Current()->debug()->has_break_points()) {
211
212
  visitor->VisitDebugTarget(this);
212
213
  #endif
213
214
  } else if (mode == RelocInfo::RUNTIME_ENTRY) {
@@ -217,23 +218,23 @@ void RelocInfo::Visit(ObjectVisitor* visitor) {
217
218
 
218
219
 
219
220
  template<typename StaticVisitor>
220
- void RelocInfo::Visit() {
221
+ void RelocInfo::Visit(Heap* heap) {
221
222
  RelocInfo::Mode mode = rmode();
222
223
  if (mode == RelocInfo::EMBEDDED_OBJECT) {
223
- StaticVisitor::VisitPointer(target_object_address());
224
+ StaticVisitor::VisitPointer(heap, target_object_address());
224
225
  } else if (RelocInfo::IsCodeTarget(mode)) {
225
- StaticVisitor::VisitCodeTarget(this);
226
+ StaticVisitor::VisitCodeTarget(heap, this);
226
227
  } else if (mode == RelocInfo::GLOBAL_PROPERTY_CELL) {
227
- StaticVisitor::VisitGlobalPropertyCell(this);
228
+ StaticVisitor::VisitGlobalPropertyCell(heap, this);
228
229
  } else if (mode == RelocInfo::EXTERNAL_REFERENCE) {
229
230
  StaticVisitor::VisitExternalReference(target_reference_address());
230
231
  #ifdef ENABLE_DEBUGGER_SUPPORT
231
- } else if (Debug::has_break_points() &&
232
+ } else if (heap->isolate()->debug()->has_break_points() &&
232
233
  ((RelocInfo::IsJSReturn(mode) &&
233
234
  IsPatchedReturnSequence()) ||
234
235
  (RelocInfo::IsDebugBreakSlot(mode) &&
235
236
  IsPatchedDebugBreakSlotSequence()))) {
236
- StaticVisitor::VisitDebugTarget(this);
237
+ StaticVisitor::VisitDebugTarget(heap, this);
237
238
  #endif
238
239
  } else if (mode == RelocInfo::RUNTIME_ENTRY) {
239
240
  StaticVisitor::VisitRuntimeEntry(this);
@@ -44,9 +44,10 @@
44
44
  namespace v8 {
45
45
  namespace internal {
46
46
 
47
- // Safe default is no features.
47
+ #ifdef DEBUG
48
+ bool CpuFeatures::initialized_ = false;
49
+ #endif
48
50
  unsigned CpuFeatures::supported_ = 0;
49
- unsigned CpuFeatures::enabled_ = 0;
50
51
  unsigned CpuFeatures::found_by_runtime_probing_ = 0;
51
52
 
52
53
 
@@ -70,7 +71,11 @@ static uint64_t CpuFeaturesImpliedByCompiler() {
70
71
  #endif // def __arm__
71
72
 
72
73
 
73
- void CpuFeatures::Probe(bool portable) {
74
+ void CpuFeatures::Probe() {
75
+ ASSERT(!initialized_);
76
+ #ifdef DEBUG
77
+ initialized_ = true;
78
+ #endif
74
79
  #ifndef __arm__
75
80
  // For the simulator=arm build, use VFP when FLAG_enable_vfp3 is enabled.
76
81
  if (FLAG_enable_vfp3) {
@@ -81,7 +86,7 @@ void CpuFeatures::Probe(bool portable) {
81
86
  supported_ |= 1u << ARMv7;
82
87
  }
83
88
  #else // def __arm__
84
- if (portable && Serializer::enabled()) {
89
+ if (Serializer::enabled()) {
85
90
  supported_ |= OS::CpuFeaturesImpliedByPlatform();
86
91
  supported_ |= CpuFeaturesImpliedByCompiler();
87
92
  return; // No features if we might serialize.
@@ -98,8 +103,6 @@ void CpuFeatures::Probe(bool portable) {
98
103
  supported_ |= 1u << ARMv7;
99
104
  found_by_runtime_probing_ |= 1u << ARMv7;
100
105
  }
101
-
102
- if (!portable) found_by_runtime_probing_ = 0;
103
106
  #endif
104
107
  }
105
108
 
@@ -148,7 +151,7 @@ Operand::Operand(Handle<Object> handle) {
148
151
  rm_ = no_reg;
149
152
  // Verify all Objects referred by code are NOT in new space.
150
153
  Object* obj = *handle;
151
- ASSERT(!Heap::InNewSpace(obj));
154
+ ASSERT(!HEAP->InNewSpace(obj));
152
155
  if (obj->IsHeapObject()) {
153
156
  imm32_ = reinterpret_cast<intptr_t>(handle.location());
154
157
  rmode_ = RelocInfo::EMBEDDED_OBJECT;
@@ -266,21 +269,22 @@ const Instr kLdrStrOffsetMask = 0x00000fff;
266
269
 
267
270
  // Spare buffer.
268
271
  static const int kMinimalBufferSize = 4*KB;
269
- static byte* spare_buffer_ = NULL;
270
272
 
271
273
 
272
- Assembler::Assembler(void* buffer, int buffer_size)
273
- : positions_recorder_(this),
274
- allow_peephole_optimization_(false) {
274
+ Assembler::Assembler(Isolate* arg_isolate, void* buffer, int buffer_size)
275
+ : AssemblerBase(arg_isolate),
276
+ positions_recorder_(this),
277
+ allow_peephole_optimization_(false),
278
+ emit_debug_code_(FLAG_debug_code) {
275
279
  allow_peephole_optimization_ = FLAG_peephole_optimization;
276
280
  if (buffer == NULL) {
277
281
  // Do our own buffer management.
278
282
  if (buffer_size <= kMinimalBufferSize) {
279
283
  buffer_size = kMinimalBufferSize;
280
284
 
281
- if (spare_buffer_ != NULL) {
282
- buffer = spare_buffer_;
283
- spare_buffer_ = NULL;
285
+ if (isolate()->assembler_spare_buffer() != NULL) {
286
+ buffer = isolate()->assembler_spare_buffer();
287
+ isolate()->set_assembler_spare_buffer(NULL);
284
288
  }
285
289
  }
286
290
  if (buffer == NULL) {
@@ -315,8 +319,9 @@ Assembler::Assembler(void* buffer, int buffer_size)
315
319
  Assembler::~Assembler() {
316
320
  ASSERT(const_pool_blocked_nesting_ == 0);
317
321
  if (own_buffer_) {
318
- if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) {
319
- spare_buffer_ = buffer_;
322
+ if (isolate()->assembler_spare_buffer() == NULL &&
323
+ buffer_size_ == kMinimalBufferSize) {
324
+ isolate()->set_assembler_spare_buffer(buffer_);
320
325
  } else {
321
326
  DeleteArray(buffer_);
322
327
  }
@@ -767,11 +772,36 @@ bool Operand::must_use_constant_pool() const {
767
772
  }
768
773
 
769
774
 
770
- bool Operand::is_single_instruction() const {
775
+ bool Operand::is_single_instruction(Instr instr) const {
771
776
  if (rm_.is_valid()) return true;
772
- if (must_use_constant_pool()) return false;
773
777
  uint32_t dummy1, dummy2;
774
- return fits_shifter(imm32_, &dummy1, &dummy2, NULL);
778
+ if (must_use_constant_pool() ||
779
+ !fits_shifter(imm32_, &dummy1, &dummy2, &instr)) {
780
+ // The immediate operand cannot be encoded as a shifter operand, or use of
781
+ // constant pool is required. For a mov instruction not setting the
782
+ // condition code additional instruction conventions can be used.
783
+ if ((instr & ~kCondMask) == 13*B21) { // mov, S not set
784
+ if (must_use_constant_pool() ||
785
+ !CpuFeatures::IsSupported(ARMv7)) {
786
+ // mov instruction will be an ldr from constant pool (one instruction).
787
+ return true;
788
+ } else {
789
+ // mov instruction will be a mov or movw followed by movt (two
790
+ // instructions).
791
+ return false;
792
+ }
793
+ } else {
794
+ // If this is not a mov or mvn instruction there will always an additional
795
+ // instructions - either mov or ldr. The mov might actually be two
796
+ // instructions mov or movw followed by movt so including the actual
797
+ // instruction two or three instructions will be generated.
798
+ return false;
799
+ }
800
+ } else {
801
+ // No use of constant pool and the immediate operand can be encoded as a
802
+ // shifter operand.
803
+ return true;
804
+ }
775
805
  }
776
806
 
777
807
 
@@ -794,7 +824,8 @@ void Assembler::addrmod1(Instr instr,
794
824
  CHECK(!rn.is(ip)); // rn should never be ip, or will be trashed
795
825
  Condition cond = Instruction::ConditionField(instr);
796
826
  if ((instr & ~kCondMask) == 13*B21) { // mov, S not set
797
- if (x.must_use_constant_pool() || !CpuFeatures::IsSupported(ARMv7)) {
827
+ if (x.must_use_constant_pool() ||
828
+ !CpuFeatures::IsSupported(ARMv7)) {
798
829
  RecordRelocInfo(x.rmode_, x.imm32_);
799
830
  ldr(rd, MemOperand(pc, 0), cond);
800
831
  } else {
@@ -2360,6 +2391,14 @@ void Assembler::vcvt_f32_f64(const SwVfpRegister dst,
2360
2391
  }
2361
2392
 
2362
2393
 
2394
+ void Assembler::vneg(const DwVfpRegister dst,
2395
+ const DwVfpRegister src,
2396
+ const Condition cond) {
2397
+ emit(cond | 0xE*B24 | 0xB*B20 | B16 | dst.code()*B12 |
2398
+ 0x5*B9 | B8 | B6 | src.code());
2399
+ }
2400
+
2401
+
2363
2402
  void Assembler::vabs(const DwVfpRegister dst,
2364
2403
  const DwVfpRegister src,
2365
2404
  const Condition cond) {
@@ -2633,7 +2672,7 @@ void Assembler::RecordRelocInfo(RelocInfo::Mode rmode, intptr_t data) {
2633
2672
  Serializer::TooLateToEnableNow();
2634
2673
  }
2635
2674
  #endif
2636
- if (!Serializer::enabled() && !FLAG_debug_code) {
2675
+ if (!Serializer::enabled() && !emit_debug_code()) {
2637
2676
  return;
2638
2677
  }
2639
2678
  }
@@ -2711,8 +2750,8 @@ void Assembler::CheckConstPool(bool force_emit, bool require_jump) {
2711
2750
  RecordComment("[ Constant Pool");
2712
2751
 
2713
2752
  // Put down constant pool marker "Undefined instruction" as specified by
2714
- // A3.1 Instruction set encoding.
2715
- emit(0x03000000 | num_prinfo_);
2753
+ // A5.6 (ARMv7) Instruction set encoding.
2754
+ emit(kConstantPoolMarker | num_prinfo_);
2716
2755
 
2717
2756
  // Emit constant pool entries.
2718
2757
  for (int i = 0; i < num_prinfo_; i++) {
@@ -284,6 +284,7 @@ const SwVfpRegister s29 = { 29 };
284
284
  const SwVfpRegister s30 = { 30 };
285
285
  const SwVfpRegister s31 = { 31 };
286
286
 
287
+ const DwVfpRegister no_dreg = { -1 };
287
288
  const DwVfpRegister d0 = { 0 };
288
289
  const DwVfpRegister d1 = { 1 };
289
290
  const DwVfpRegister d2 = { 2 };
@@ -388,8 +389,11 @@ class Operand BASE_EMBEDDED {
388
389
  INLINE(bool is_reg() const);
389
390
 
390
391
  // Return true if this operand fits in one instruction so that no
391
- // 2-instruction solution with a load into the ip register is necessary.
392
- bool is_single_instruction() const;
392
+ // 2-instruction solution with a load into the ip register is necessary. If
393
+ // the instruction this operand is used for is a MOV or MVN instruction the
394
+ // actual instruction to use is required for this calculation. For other
395
+ // instructions instr is ignored.
396
+ bool is_single_instruction(Instr instr = 0) const;
393
397
  bool must_use_constant_pool() const;
394
398
 
395
399
  inline int32_t immediate() const {
@@ -468,32 +472,54 @@ class CpuFeatures : public AllStatic {
468
472
  public:
469
473
  // Detect features of the target CPU. Set safe defaults if the serializer
470
474
  // is enabled (snapshots must be portable).
471
- static void Probe(bool portable);
475
+ static void Probe();
472
476
 
473
477
  // Check whether a feature is supported by the target CPU.
474
478
  static bool IsSupported(CpuFeature f) {
479
+ ASSERT(initialized_);
475
480
  if (f == VFP3 && !FLAG_enable_vfp3) return false;
476
481
  return (supported_ & (1u << f)) != 0;
477
482
  }
478
483
 
484
+ #ifdef DEBUG
479
485
  // Check whether a feature is currently enabled.
480
486
  static bool IsEnabled(CpuFeature f) {
481
- return (enabled_ & (1u << f)) != 0;
487
+ ASSERT(initialized_);
488
+ Isolate* isolate = Isolate::UncheckedCurrent();
489
+ if (isolate == NULL) {
490
+ // When no isolate is available, work as if we're running in
491
+ // release mode.
492
+ return IsSupported(f);
493
+ }
494
+ unsigned enabled = static_cast<unsigned>(isolate->enabled_cpu_features());
495
+ return (enabled & (1u << f)) != 0;
482
496
  }
497
+ #endif
483
498
 
484
499
  // Enable a specified feature within a scope.
485
500
  class Scope BASE_EMBEDDED {
486
501
  #ifdef DEBUG
487
502
  public:
488
503
  explicit Scope(CpuFeature f) {
504
+ unsigned mask = 1u << f;
489
505
  ASSERT(CpuFeatures::IsSupported(f));
490
506
  ASSERT(!Serializer::enabled() ||
491
- (found_by_runtime_probing_ & (1u << f)) == 0);
492
- old_enabled_ = CpuFeatures::enabled_;
493
- CpuFeatures::enabled_ |= 1u << f;
507
+ (CpuFeatures::found_by_runtime_probing_ & mask) == 0);
508
+ isolate_ = Isolate::UncheckedCurrent();
509
+ old_enabled_ = 0;
510
+ if (isolate_ != NULL) {
511
+ old_enabled_ = static_cast<unsigned>(isolate_->enabled_cpu_features());
512
+ isolate_->set_enabled_cpu_features(old_enabled_ | mask);
513
+ }
514
+ }
515
+ ~Scope() {
516
+ ASSERT_EQ(Isolate::UncheckedCurrent(), isolate_);
517
+ if (isolate_ != NULL) {
518
+ isolate_->set_enabled_cpu_features(old_enabled_);
519
+ }
494
520
  }
495
- ~Scope() { CpuFeatures::enabled_ = old_enabled_; }
496
521
  private:
522
+ Isolate* isolate_;
497
523
  unsigned old_enabled_;
498
524
  #else
499
525
  public:
@@ -501,10 +527,40 @@ class CpuFeatures : public AllStatic {
501
527
  #endif
502
528
  };
503
529
 
530
+ class TryForceFeatureScope BASE_EMBEDDED {
531
+ public:
532
+ explicit TryForceFeatureScope(CpuFeature f)
533
+ : old_supported_(CpuFeatures::supported_) {
534
+ if (CanForce()) {
535
+ CpuFeatures::supported_ |= (1u << f);
536
+ }
537
+ }
538
+
539
+ ~TryForceFeatureScope() {
540
+ if (CanForce()) {
541
+ CpuFeatures::supported_ = old_supported_;
542
+ }
543
+ }
544
+
545
+ private:
546
+ static bool CanForce() {
547
+ // It's only safe to temporarily force support of CPU features
548
+ // when there's only a single isolate, which is guaranteed when
549
+ // the serializer is enabled.
550
+ return Serializer::enabled();
551
+ }
552
+
553
+ const unsigned old_supported_;
554
+ };
555
+
504
556
  private:
557
+ #ifdef DEBUG
558
+ static bool initialized_;
559
+ #endif
505
560
  static unsigned supported_;
506
- static unsigned enabled_;
507
561
  static unsigned found_by_runtime_probing_;
562
+
563
+ DISALLOW_COPY_AND_ASSIGN(CpuFeatures);
508
564
  };
509
565
 
510
566
 
@@ -532,7 +588,7 @@ extern const Instr kAndBicFlip;
532
588
 
533
589
 
534
590
 
535
- class Assembler : public Malloced {
591
+ class Assembler : public AssemblerBase {
536
592
  public:
537
593
  // Create an assembler. Instructions and relocation information are emitted
538
594
  // into a buffer, with the instructions starting from the beginning and the
@@ -547,9 +603,12 @@ class Assembler : public Malloced {
547
603
  // for code generation and assumes its size to be buffer_size. If the buffer
548
604
  // is too small, a fatal error occurs. No deallocation of the buffer is done
549
605
  // upon destruction of the assembler.
550
- Assembler(void* buffer, int buffer_size);
606
+ Assembler(Isolate* isolate, void* buffer, int buffer_size);
551
607
  ~Assembler();
552
608
 
609
+ // Overrides the default provided by FLAG_debug_code.
610
+ void set_emit_debug_code(bool value) { emit_debug_code_ = value; }
611
+
553
612
  // GetCode emits any pending (non-emitted) code and fills the descriptor
554
613
  // desc. GetCode() is idempotent; it returns the same result if no other
555
614
  // Assembler functions are invoked in between GetCode() calls.
@@ -988,6 +1047,9 @@ class Assembler : public Malloced {
988
1047
  VFPConversionMode mode = kDefaultRoundToZero,
989
1048
  const Condition cond = al);
990
1049
 
1050
+ void vneg(const DwVfpRegister dst,
1051
+ const DwVfpRegister src,
1052
+ const Condition cond = al);
991
1053
  void vabs(const DwVfpRegister dst,
992
1054
  const DwVfpRegister src,
993
1055
  const Condition cond = al);
@@ -1147,6 +1209,8 @@ class Assembler : public Malloced {
1147
1209
  void CheckConstPool(bool force_emit, bool require_jump);
1148
1210
 
1149
1211
  protected:
1212
+ bool emit_debug_code() const { return emit_debug_code_; }
1213
+
1150
1214
  int buffer_space() const { return reloc_info_writer.pos() - pc_; }
1151
1215
 
1152
1216
  // Read/patch instructions
@@ -1275,6 +1339,7 @@ class Assembler : public Malloced {
1275
1339
 
1276
1340
  PositionsRecorder positions_recorder_;
1277
1341
  bool allow_peephole_optimization_;
1342
+ bool emit_debug_code_;
1278
1343
  friend class PositionsRecorder;
1279
1344
  friend class EnsureSpace;
1280
1345
  };