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
@@ -34,6 +34,8 @@
34
34
  namespace v8 {
35
35
  namespace internal {
36
36
 
37
+ class Isolate;
38
+
37
39
  // -----------------------------------------------------------------------------
38
40
  // Heap structures:
39
41
  //
@@ -241,7 +243,7 @@ class Page {
241
243
  static const intptr_t kPageAlignmentMask = (1 << kPageSizeBits) - 1;
242
244
 
243
245
  static const int kPageHeaderSize = kPointerSize + kPointerSize + kIntSize +
244
- kIntSize + kPointerSize;
246
+ kIntSize + kPointerSize + kPointerSize;
245
247
 
246
248
  // The start offset of the object area in a page. Aligned to both maps and
247
249
  // code alignment to be suitable for both.
@@ -286,7 +288,7 @@ class Page {
286
288
  // This invariant guarantees that after flipping flag meaning at the
287
289
  // beginning of scavenge all pages in use will be marked as having valid
288
290
  // watermark.
289
- static inline void FlipMeaningOfInvalidatedWatermarkFlag();
291
+ static inline void FlipMeaningOfInvalidatedWatermarkFlag(Heap* heap);
290
292
 
291
293
  // Returns true if the page allocation watermark was not altered during
292
294
  // scavenge.
@@ -312,11 +314,6 @@ class Page {
312
314
  STATIC_CHECK(kBitsPerInt - kAllocationWatermarkOffsetShift >=
313
315
  kAllocationWatermarkOffsetBits);
314
316
 
315
- // This field contains the meaning of the WATERMARK_INVALIDATED flag.
316
- // Instead of clearing this flag from all pages we just flip
317
- // its meaning at the beginning of a scavenge.
318
- static intptr_t watermark_invalidated_mark_;
319
-
320
317
  //---------------------------------------------------------------------------
321
318
  // Page header description.
322
319
  //
@@ -353,6 +350,8 @@ class Page {
353
350
  // During scavenge collection this field is used to store allocation watermark
354
351
  // if it is altered during scavenge.
355
352
  Address mc_first_forwarded;
353
+
354
+ Heap* heap_;
356
355
  };
357
356
 
358
357
 
@@ -360,11 +359,13 @@ class Page {
360
359
  // Space is the abstract superclass for all allocation spaces.
361
360
  class Space : public Malloced {
362
361
  public:
363
- Space(AllocationSpace id, Executability executable)
364
- : id_(id), executable_(executable) {}
362
+ Space(Heap* heap, AllocationSpace id, Executability executable)
363
+ : heap_(heap), id_(id), executable_(executable) {}
365
364
 
366
365
  virtual ~Space() {}
367
366
 
367
+ Heap* heap() const { return heap_; }
368
+
368
369
  // Does the space need executable memory?
369
370
  Executability executable() { return executable_; }
370
371
 
@@ -397,6 +398,7 @@ class Space : public Malloced {
397
398
  virtual bool ReserveSpace(int bytes) = 0;
398
399
 
399
400
  private:
401
+ Heap* heap_;
400
402
  AllocationSpace id_;
401
403
  Executability executable_;
402
404
  };
@@ -409,19 +411,19 @@ class Space : public Malloced {
409
411
  // displacements cover the entire 4GB virtual address space. On 64-bit
410
412
  // platforms, we support this using the CodeRange object, which reserves and
411
413
  // manages a range of virtual memory.
412
- class CodeRange : public AllStatic {
414
+ class CodeRange {
413
415
  public:
414
416
  // Reserves a range of virtual memory, but does not commit any of it.
415
417
  // Can only be called once, at heap initialization time.
416
418
  // Returns false on failure.
417
- static bool Setup(const size_t requested_size);
419
+ bool Setup(const size_t requested_size);
418
420
 
419
421
  // Frees the range of virtual memory, and frees the data structures used to
420
422
  // manage it.
421
- static void TearDown();
423
+ void TearDown();
422
424
 
423
- static bool exists() { return code_range_ != NULL; }
424
- static bool contains(Address address) {
425
+ bool exists() { return code_range_ != NULL; }
426
+ bool contains(Address address) {
425
427
  if (code_range_ == NULL) return false;
426
428
  Address start = static_cast<Address>(code_range_->address());
427
429
  return start <= address && address < start + code_range_->size();
@@ -430,13 +432,15 @@ class CodeRange : public AllStatic {
430
432
  // Allocates a chunk of memory from the large-object portion of
431
433
  // the code range. On platforms with no separate code range, should
432
434
  // not be called.
433
- MUST_USE_RESULT static void* AllocateRawMemory(const size_t requested,
434
- size_t* allocated);
435
- static void FreeRawMemory(void* buf, size_t length);
435
+ MUST_USE_RESULT void* AllocateRawMemory(const size_t requested,
436
+ size_t* allocated);
437
+ void FreeRawMemory(void* buf, size_t length);
436
438
 
437
439
  private:
440
+ CodeRange();
441
+
438
442
  // The reserved range of virtual memory that all code objects are put in.
439
- static VirtualMemory* code_range_;
443
+ VirtualMemory* code_range_;
440
444
  // Plain old data class, just a struct plus a constructor.
441
445
  class FreeBlock {
442
446
  public:
@@ -452,20 +456,26 @@ class CodeRange : public AllStatic {
452
456
  // Freed blocks of memory are added to the free list. When the allocation
453
457
  // list is exhausted, the free list is sorted and merged to make the new
454
458
  // allocation list.
455
- static List<FreeBlock> free_list_;
459
+ List<FreeBlock> free_list_;
456
460
  // Memory is allocated from the free blocks on the allocation list.
457
461
  // The block at current_allocation_block_index_ is the current block.
458
- static List<FreeBlock> allocation_list_;
459
- static int current_allocation_block_index_;
462
+ List<FreeBlock> allocation_list_;
463
+ int current_allocation_block_index_;
460
464
 
461
465
  // Finds a block on the allocation list that contains at least the
462
466
  // requested amount of memory. If none is found, sorts and merges
463
467
  // the existing free memory blocks, and searches again.
464
468
  // If none can be found, terminates V8 with FatalProcessOutOfMemory.
465
- static void GetNextAllocationBlock(size_t requested);
469
+ void GetNextAllocationBlock(size_t requested);
466
470
  // Compares the start addresses of two free blocks.
467
471
  static int CompareFreeBlockAddress(const FreeBlock* left,
468
472
  const FreeBlock* right);
473
+
474
+ friend class Isolate;
475
+
476
+ Isolate* isolate_;
477
+
478
+ DISALLOW_COPY_AND_ASSIGN(CodeRange);
469
479
  };
470
480
 
471
481
 
@@ -493,14 +503,14 @@ class CodeRange : public AllStatic {
493
503
  //
494
504
 
495
505
 
496
- class MemoryAllocator : public AllStatic {
506
+ class MemoryAllocator {
497
507
  public:
498
508
  // Initializes its internal bookkeeping structures.
499
509
  // Max capacity of the total space and executable memory limit.
500
- static bool Setup(intptr_t max_capacity, intptr_t capacity_executable);
510
+ bool Setup(intptr_t max_capacity, intptr_t capacity_executable);
501
511
 
502
512
  // Deletes valid chunks.
503
- static void TearDown();
513
+ void TearDown();
504
514
 
505
515
  // Reserves an initial address range of virtual memory to be split between
506
516
  // the two new space semispaces, the old space, and the map space. The
@@ -511,7 +521,7 @@ class MemoryAllocator : public AllStatic {
511
521
  // address of the initial chunk if successful, with the side effect of
512
522
  // setting the initial chunk, or else NULL if unsuccessful and leaves the
513
523
  // initial chunk NULL.
514
- static void* ReserveInitialChunk(const size_t requested);
524
+ void* ReserveInitialChunk(const size_t requested);
515
525
 
516
526
  // Commits pages from an as-yet-unmanaged block of virtual memory into a
517
527
  // paged space. The block should be part of the initial chunk reserved via
@@ -520,24 +530,24 @@ class MemoryAllocator : public AllStatic {
520
530
  // address is non-null and that it is big enough to hold at least one
521
531
  // page-aligned page. The call always succeeds, and num_pages is always
522
532
  // greater than zero.
523
- static Page* CommitPages(Address start, size_t size, PagedSpace* owner,
524
- int* num_pages);
533
+ Page* CommitPages(Address start, size_t size, PagedSpace* owner,
534
+ int* num_pages);
525
535
 
526
536
  // Commit a contiguous block of memory from the initial chunk. Assumes that
527
537
  // the address is not NULL, the size is greater than zero, and that the
528
538
  // block is contained in the initial chunk. Returns true if it succeeded
529
539
  // and false otherwise.
530
- static bool CommitBlock(Address start, size_t size, Executability executable);
540
+ bool CommitBlock(Address start, size_t size, Executability executable);
531
541
 
532
542
  // Uncommit a contiguous block of memory [start..(start+size)[.
533
543
  // start is not NULL, the size is greater than zero, and the
534
544
  // block is contained in the initial chunk. Returns true if it succeeded
535
545
  // and false otherwise.
536
- static bool UncommitBlock(Address start, size_t size);
546
+ bool UncommitBlock(Address start, size_t size);
537
547
 
538
548
  // Zaps a contiguous block of memory [start..(start+size)[ thus
539
549
  // filling it up with a recognizable non-NULL bit pattern.
540
- static void ZapBlock(Address start, size_t size);
550
+ void ZapBlock(Address start, size_t size);
541
551
 
542
552
  // Attempts to allocate the requested (non-zero) number of pages from the
543
553
  // OS. Fewer pages might be allocated than requested. If it fails to
@@ -548,8 +558,8 @@ class MemoryAllocator : public AllStatic {
548
558
  // number of allocated pages is returned in the output parameter
549
559
  // allocated_pages. If the PagedSpace owner is executable and there is
550
560
  // a code range, the pages are allocated from the code range.
551
- static Page* AllocatePages(int requested_pages, int* allocated_pages,
552
- PagedSpace* owner);
561
+ Page* AllocatePages(int requested_pages, int* allocated_pages,
562
+ PagedSpace* owner);
553
563
 
554
564
  // Frees pages from a given page and after. Requires pages to be
555
565
  // linked in chunk-order (see comment for class).
@@ -558,10 +568,10 @@ class MemoryAllocator : public AllStatic {
558
568
  // Otherwise, the function searches a page after 'p' that is
559
569
  // the first page of a chunk. Pages after the found page
560
570
  // are freed and the function returns 'p'.
561
- static Page* FreePages(Page* p);
571
+ Page* FreePages(Page* p);
562
572
 
563
573
  // Frees all pages owned by given space.
564
- static void FreeAllPages(PagedSpace* space);
574
+ void FreeAllPages(PagedSpace* space);
565
575
 
566
576
  // Allocates and frees raw memory of certain size.
567
577
  // These are just thin wrappers around OS::Allocate and OS::Free,
@@ -569,96 +579,83 @@ class MemoryAllocator : public AllStatic {
569
579
  // If the flag is EXECUTABLE and a code range exists, the requested
570
580
  // memory is allocated from the code range. If a code range exists
571
581
  // and the freed memory is in it, the code range manages the freed memory.
572
- MUST_USE_RESULT static void* AllocateRawMemory(const size_t requested,
573
- size_t* allocated,
574
- Executability executable);
575
- static void FreeRawMemory(void* buf,
576
- size_t length,
577
- Executability executable);
578
- static void PerformAllocationCallback(ObjectSpace space,
579
- AllocationAction action,
580
- size_t size);
581
-
582
- static void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
583
- ObjectSpace space,
584
- AllocationAction action);
585
- static void RemoveMemoryAllocationCallback(
586
- MemoryAllocationCallback callback);
587
- static bool MemoryAllocationCallbackRegistered(
588
- MemoryAllocationCallback callback);
582
+ MUST_USE_RESULT void* AllocateRawMemory(const size_t requested,
583
+ size_t* allocated,
584
+ Executability executable);
585
+ void FreeRawMemory(void* buf,
586
+ size_t length,
587
+ Executability executable);
588
+ void PerformAllocationCallback(ObjectSpace space,
589
+ AllocationAction action,
590
+ size_t size);
591
+
592
+ void AddMemoryAllocationCallback(MemoryAllocationCallback callback,
593
+ ObjectSpace space,
594
+ AllocationAction action);
595
+ void RemoveMemoryAllocationCallback(MemoryAllocationCallback callback);
596
+ bool MemoryAllocationCallbackRegistered(MemoryAllocationCallback callback);
589
597
 
590
598
  // Returns the maximum available bytes of heaps.
591
- static intptr_t Available() {
592
- return capacity_ < size_ ? 0 : capacity_ - size_;
593
- }
599
+ intptr_t Available() { return capacity_ < size_ ? 0 : capacity_ - size_; }
594
600
 
595
601
  // Returns allocated spaces in bytes.
596
- static intptr_t Size() { return size_; }
602
+ intptr_t Size() { return size_; }
597
603
 
598
604
  // Returns the maximum available executable bytes of heaps.
599
- static intptr_t AvailableExecutable() {
605
+ intptr_t AvailableExecutable() {
600
606
  if (capacity_executable_ < size_executable_) return 0;
601
607
  return capacity_executable_ - size_executable_;
602
608
  }
603
609
 
604
610
  // Returns allocated executable spaces in bytes.
605
- static intptr_t SizeExecutable() { return size_executable_; }
611
+ intptr_t SizeExecutable() { return size_executable_; }
606
612
 
607
613
  // Returns maximum available bytes that the old space can have.
608
- static intptr_t MaxAvailable() {
614
+ intptr_t MaxAvailable() {
609
615
  return (Available() / Page::kPageSize) * Page::kObjectAreaSize;
610
616
  }
611
617
 
612
- // Sanity check on a pointer.
613
- static bool SafeIsInAPageChunk(Address addr);
614
-
615
618
  // Links two pages.
616
- static inline void SetNextPage(Page* prev, Page* next);
619
+ inline void SetNextPage(Page* prev, Page* next);
617
620
 
618
621
  // Returns the next page of a given page.
619
- static inline Page* GetNextPage(Page* p);
622
+ inline Page* GetNextPage(Page* p);
620
623
 
621
624
  // Checks whether a page belongs to a space.
622
- static inline bool IsPageInSpace(Page* p, PagedSpace* space);
625
+ inline bool IsPageInSpace(Page* p, PagedSpace* space);
623
626
 
624
627
  // Returns the space that owns the given page.
625
- static inline PagedSpace* PageOwner(Page* page);
628
+ inline PagedSpace* PageOwner(Page* page);
626
629
 
627
630
  // Finds the first/last page in the same chunk as a given page.
628
- static Page* FindFirstPageInSameChunk(Page* p);
629
- static Page* FindLastPageInSameChunk(Page* p);
631
+ Page* FindFirstPageInSameChunk(Page* p);
632
+ Page* FindLastPageInSameChunk(Page* p);
630
633
 
631
634
  // Relinks list of pages owned by space to make it chunk-ordered.
632
635
  // Returns new first and last pages of space.
633
636
  // Also returns last page in relinked list which has WasInUsedBeforeMC
634
637
  // flag set.
635
- static void RelinkPageListInChunkOrder(PagedSpace* space,
636
- Page** first_page,
637
- Page** last_page,
638
- Page** last_page_in_use);
638
+ void RelinkPageListInChunkOrder(PagedSpace* space,
639
+ Page** first_page,
640
+ Page** last_page,
641
+ Page** last_page_in_use);
639
642
 
640
643
  #ifdef ENABLE_HEAP_PROTECTION
641
644
  // Protect/unprotect a block of memory by marking it read-only/writable.
642
- static inline void Protect(Address start, size_t size);
643
- static inline void Unprotect(Address start, size_t size,
644
- Executability executable);
645
+ inline void Protect(Address start, size_t size);
646
+ inline void Unprotect(Address start, size_t size,
647
+ Executability executable);
645
648
 
646
649
  // Protect/unprotect a chunk given a page in the chunk.
647
- static inline void ProtectChunkFromPage(Page* page);
648
- static inline void UnprotectChunkFromPage(Page* page);
650
+ inline void ProtectChunkFromPage(Page* page);
651
+ inline void UnprotectChunkFromPage(Page* page);
649
652
  #endif
650
653
 
651
654
  #ifdef DEBUG
652
655
  // Reports statistic info of the space.
653
- static void ReportStatistics();
656
+ void ReportStatistics();
654
657
  #endif
655
658
 
656
- static void AddToAllocatedChunks(Address addr, intptr_t size);
657
- static void RemoveFromAllocatedChunks(Address addr, intptr_t size);
658
- // Note: This only checks the regular chunks, not the odd-sized initial
659
- // chunk.
660
- static bool InAllocatedChunks(Address addr);
661
-
662
659
  // Due to encoding limitation, we can only have 8K chunks.
663
660
  static const int kMaxNofChunks = 1 << kPageSizeBits;
664
661
  // If a chunk has at least 16 pages, the maximum heap size is about
@@ -678,29 +675,21 @@ class MemoryAllocator : public AllStatic {
678
675
  #endif
679
676
 
680
677
  private:
678
+ MemoryAllocator();
679
+
681
680
  static const int kChunkSize = kPagesPerChunk * Page::kPageSize;
682
681
  static const int kChunkSizeLog2 = kPagesPerChunkLog2 + kPageSizeBits;
683
- static const int kChunkTableTopLevelEntries =
684
- 1 << (sizeof(intptr_t) * kBitsPerByte - kChunkSizeLog2 -
685
- (kChunkTableLevels - 1) * kChunkTableBitsPerLevel);
686
-
687
- // The chunks are not chunk-size aligned so for a given chunk-sized area of
688
- // memory there can be two chunks that cover it.
689
- static const int kChunkTableFineGrainedWordsPerEntry = 2;
690
- static const uintptr_t kUnusedChunkTableEntry = 0;
691
682
 
692
683
  // Maximum space size in bytes.
693
- static intptr_t capacity_;
684
+ intptr_t capacity_;
694
685
  // Maximum subset of capacity_ that can be executable
695
- static intptr_t capacity_executable_;
696
-
697
- // Top level table to track whether memory is part of a chunk or not.
698
- static uintptr_t chunk_table_[kChunkTableTopLevelEntries];
686
+ intptr_t capacity_executable_;
699
687
 
700
688
  // Allocated space size in bytes.
701
- static intptr_t size_;
689
+ intptr_t size_;
690
+
702
691
  // Allocated executable space size in bytes.
703
- static intptr_t size_executable_;
692
+ intptr_t size_executable_;
704
693
 
705
694
  struct MemoryAllocationCallbackRegistration {
706
695
  MemoryAllocationCallbackRegistration(MemoryAllocationCallback callback,
@@ -713,11 +702,11 @@ class MemoryAllocator : public AllStatic {
713
702
  AllocationAction action;
714
703
  };
715
704
  // A List of callback that are triggered when memory is allocated or free'd
716
- static List<MemoryAllocationCallbackRegistration>
705
+ List<MemoryAllocationCallbackRegistration>
717
706
  memory_allocation_callbacks_;
718
707
 
719
708
  // The initial chunk of virtual memory.
720
- static VirtualMemory* initial_chunk_;
709
+ VirtualMemory* initial_chunk_;
721
710
 
722
711
  // Allocated chunk info: chunk start address, chunk size, and owning space.
723
712
  class ChunkInfo BASE_EMBEDDED {
@@ -725,7 +714,8 @@ class MemoryAllocator : public AllStatic {
725
714
  ChunkInfo() : address_(NULL),
726
715
  size_(0),
727
716
  owner_(NULL),
728
- executable_(NOT_EXECUTABLE) {}
717
+ executable_(NOT_EXECUTABLE),
718
+ owner_identity_(FIRST_SPACE) {}
729
719
  inline void init(Address a, size_t s, PagedSpace* o);
730
720
  Address address() { return address_; }
731
721
  size_t size() { return size_; }
@@ -733,74 +723,60 @@ class MemoryAllocator : public AllStatic {
733
723
  // We save executability of the owner to allow using it
734
724
  // when collecting stats after the owner has been destroyed.
735
725
  Executability executable() const { return executable_; }
726
+ AllocationSpace owner_identity() const { return owner_identity_; }
736
727
 
737
728
  private:
738
729
  Address address_;
739
730
  size_t size_;
740
731
  PagedSpace* owner_;
741
732
  Executability executable_;
733
+ AllocationSpace owner_identity_;
742
734
  };
743
735
 
744
736
  // Chunks_, free_chunk_ids_ and top_ act as a stack of free chunk ids.
745
- static List<ChunkInfo> chunks_;
746
- static List<int> free_chunk_ids_;
747
- static int max_nof_chunks_;
748
- static int top_;
737
+ List<ChunkInfo> chunks_;
738
+ List<int> free_chunk_ids_;
739
+ int max_nof_chunks_;
740
+ int top_;
749
741
 
750
742
  // Push/pop a free chunk id onto/from the stack.
751
- static void Push(int free_chunk_id);
752
- static int Pop();
753
- static bool OutOfChunkIds() { return top_ == 0; }
743
+ void Push(int free_chunk_id);
744
+ int Pop();
745
+ bool OutOfChunkIds() { return top_ == 0; }
754
746
 
755
747
  // Frees a chunk.
756
- static void DeleteChunk(int chunk_id);
757
-
758
- // Helpers to maintain and query the chunk tables.
759
- static void AddChunkUsingAddress(
760
- uintptr_t chunk_start, // Where the chunk starts.
761
- uintptr_t chunk_index_base); // Used to place the chunk in the tables.
762
- static void RemoveChunkFoundUsingAddress(
763
- uintptr_t chunk_start, // Where the chunk starts.
764
- uintptr_t chunk_index_base); // Used to locate the entry in the tables.
765
- // Controls whether the lookup creates intermediate levels of tables as
766
- // needed.
767
- enum CreateTables { kDontCreateTables, kCreateTablesAsNeeded };
768
- static uintptr_t* AllocatedChunksFinder(uintptr_t* table,
769
- uintptr_t address,
770
- int bit_position,
771
- CreateTables create_as_needed);
772
- static void FreeChunkTables(uintptr_t* array, int length, int level);
773
- static int FineGrainedIndexForAddress(uintptr_t address) {
774
- int index = ((address >> kChunkSizeLog2) &
775
- ((1 << kChunkTableBitsPerLevel) - 1));
776
- return index * kChunkTableFineGrainedWordsPerEntry;
777
- }
778
-
748
+ void DeleteChunk(int chunk_id);
779
749
 
780
750
  // Basic check whether a chunk id is in the valid range.
781
- static inline bool IsValidChunkId(int chunk_id);
751
+ inline bool IsValidChunkId(int chunk_id);
782
752
 
783
753
  // Checks whether a chunk id identifies an allocated chunk.
784
- static inline bool IsValidChunk(int chunk_id);
754
+ inline bool IsValidChunk(int chunk_id);
785
755
 
786
756
  // Returns the chunk id that a page belongs to.
787
- static inline int GetChunkId(Page* p);
757
+ inline int GetChunkId(Page* p);
788
758
 
789
759
  // True if the address lies in the initial chunk.
790
- static inline bool InInitialChunk(Address address);
760
+ inline bool InInitialChunk(Address address);
791
761
 
792
762
  // Initializes pages in a chunk. Returns the first page address.
793
763
  // This function and GetChunkId() are provided for the mark-compact
794
764
  // collector to rebuild page headers in the from space, which is
795
765
  // used as a marking stack and its page headers are destroyed.
796
- static Page* InitializePagesInChunk(int chunk_id, int pages_in_chunk,
797
- PagedSpace* owner);
766
+ Page* InitializePagesInChunk(int chunk_id, int pages_in_chunk,
767
+ PagedSpace* owner);
798
768
 
799
- static Page* RelinkPagesInChunk(int chunk_id,
800
- Address chunk_start,
801
- size_t chunk_size,
802
- Page* prev,
803
- Page** last_page_in_use);
769
+ Page* RelinkPagesInChunk(int chunk_id,
770
+ Address chunk_start,
771
+ size_t chunk_size,
772
+ Page* prev,
773
+ Page** last_page_in_use);
774
+
775
+ friend class Isolate;
776
+
777
+ Isolate* isolate_;
778
+
779
+ DISALLOW_COPY_AND_ASSIGN(MemoryAllocator);
804
780
  };
805
781
 
806
782
 
@@ -1048,7 +1024,8 @@ class AllocationStats BASE_EMBEDDED {
1048
1024
  class PagedSpace : public Space {
1049
1025
  public:
1050
1026
  // Creates a space with a maximum capacity, and an id.
1051
- PagedSpace(intptr_t max_capacity,
1027
+ PagedSpace(Heap* heap,
1028
+ intptr_t max_capacity,
1052
1029
  AllocationSpace id,
1053
1030
  Executability executable);
1054
1031
 
@@ -1341,7 +1318,7 @@ class HistogramInfo: public NumberAndSizeInfo {
1341
1318
  class SemiSpace : public Space {
1342
1319
  public:
1343
1320
  // Constructor.
1344
- SemiSpace() :Space(NEW_SPACE, NOT_EXECUTABLE) {
1321
+ explicit SemiSpace(Heap* heap) : Space(heap, NEW_SPACE, NOT_EXECUTABLE) {
1345
1322
  start_ = NULL;
1346
1323
  age_mark_ = NULL;
1347
1324
  }
@@ -1508,7 +1485,10 @@ class SemiSpaceIterator : public ObjectIterator {
1508
1485
  class NewSpace : public Space {
1509
1486
  public:
1510
1487
  // Constructor.
1511
- NewSpace() : Space(NEW_SPACE, NOT_EXECUTABLE) {}
1488
+ explicit NewSpace(Heap* heap)
1489
+ : Space(heap, NEW_SPACE, NOT_EXECUTABLE),
1490
+ to_space_(heap),
1491
+ from_space_(heap) {}
1512
1492
 
1513
1493
  // Sets up the new space using the given chunk.
1514
1494
  bool Setup(Address start, int size);
@@ -1741,11 +1721,11 @@ class FreeListNode: public HeapObject {
1741
1721
  // function also writes a map to the first word of the block so that it
1742
1722
  // looks like a heap object to the garbage collector and heap iteration
1743
1723
  // functions.
1744
- void set_size(int size_in_bytes);
1724
+ void set_size(Heap* heap, int size_in_bytes);
1745
1725
 
1746
1726
  // Accessors for the next field.
1747
- inline Address next();
1748
- inline void set_next(Address next);
1727
+ inline Address next(Heap* heap);
1728
+ inline void set_next(Heap* heap, Address next);
1749
1729
 
1750
1730
  private:
1751
1731
  static const int kNextOffset = POINTER_SIZE_ALIGN(ByteArray::kHeaderSize);
@@ -1757,7 +1737,7 @@ class FreeListNode: public HeapObject {
1757
1737
  // The free list for the old space.
1758
1738
  class OldSpaceFreeList BASE_EMBEDDED {
1759
1739
  public:
1760
- explicit OldSpaceFreeList(AllocationSpace owner);
1740
+ OldSpaceFreeList(Heap* heap, AllocationSpace owner);
1761
1741
 
1762
1742
  // Clear the free list.
1763
1743
  void Reset();
@@ -1787,6 +1767,8 @@ class OldSpaceFreeList BASE_EMBEDDED {
1787
1767
  static const int kMinBlockSize = 2 * kPointerSize;
1788
1768
  static const int kMaxBlockSize = Page::kMaxHeapObjectSize;
1789
1769
 
1770
+ Heap* heap_;
1771
+
1790
1772
  // The identity of the owning space, for building allocation Failure
1791
1773
  // objects.
1792
1774
  AllocationSpace owner_;
@@ -1861,7 +1843,7 @@ class OldSpaceFreeList BASE_EMBEDDED {
1861
1843
  // The free list for the map space.
1862
1844
  class FixedSizeFreeList BASE_EMBEDDED {
1863
1845
  public:
1864
- FixedSizeFreeList(AllocationSpace owner, int object_size);
1846
+ FixedSizeFreeList(Heap* heap, AllocationSpace owner, int object_size);
1865
1847
 
1866
1848
  // Clear the free list.
1867
1849
  void Reset();
@@ -1882,6 +1864,9 @@ class FixedSizeFreeList BASE_EMBEDDED {
1882
1864
  void MarkNodes();
1883
1865
 
1884
1866
  private:
1867
+
1868
+ Heap* heap_;
1869
+
1885
1870
  // Available bytes on the free list.
1886
1871
  intptr_t available_;
1887
1872
 
@@ -1909,10 +1894,12 @@ class OldSpace : public PagedSpace {
1909
1894
  public:
1910
1895
  // Creates an old space object with a given maximum capacity.
1911
1896
  // The constructor does not allocate pages from OS.
1912
- explicit OldSpace(intptr_t max_capacity,
1913
- AllocationSpace id,
1914
- Executability executable)
1915
- : PagedSpace(max_capacity, id, executable), free_list_(id) {
1897
+ OldSpace(Heap* heap,
1898
+ intptr_t max_capacity,
1899
+ AllocationSpace id,
1900
+ Executability executable)
1901
+ : PagedSpace(heap, max_capacity, id, executable),
1902
+ free_list_(heap, id) {
1916
1903
  page_extra_ = 0;
1917
1904
  }
1918
1905
 
@@ -1981,14 +1968,15 @@ class OldSpace : public PagedSpace {
1981
1968
 
1982
1969
  class FixedSpace : public PagedSpace {
1983
1970
  public:
1984
- FixedSpace(intptr_t max_capacity,
1971
+ FixedSpace(Heap* heap,
1972
+ intptr_t max_capacity,
1985
1973
  AllocationSpace id,
1986
1974
  int object_size_in_bytes,
1987
1975
  const char* name)
1988
- : PagedSpace(max_capacity, id, NOT_EXECUTABLE),
1976
+ : PagedSpace(heap, max_capacity, id, NOT_EXECUTABLE),
1989
1977
  object_size_in_bytes_(object_size_in_bytes),
1990
1978
  name_(name),
1991
- free_list_(id, object_size_in_bytes) {
1979
+ free_list_(heap, id, object_size_in_bytes) {
1992
1980
  page_extra_ = Page::kObjectAreaSize % object_size_in_bytes;
1993
1981
  }
1994
1982
 
@@ -2059,8 +2047,11 @@ class FixedSpace : public PagedSpace {
2059
2047
  class MapSpace : public FixedSpace {
2060
2048
  public:
2061
2049
  // Creates a map space object with a maximum capacity.
2062
- MapSpace(intptr_t max_capacity, int max_map_space_pages, AllocationSpace id)
2063
- : FixedSpace(max_capacity, id, Map::kSize, "map"),
2050
+ MapSpace(Heap* heap,
2051
+ intptr_t max_capacity,
2052
+ int max_map_space_pages,
2053
+ AllocationSpace id)
2054
+ : FixedSpace(heap, max_capacity, id, Map::kSize, "map"),
2064
2055
  max_map_space_pages_(max_map_space_pages) {
2065
2056
  ASSERT(max_map_space_pages < kMaxMapPageIndex);
2066
2057
  }
@@ -2121,6 +2112,12 @@ class MapSpace : public FixedSpace {
2121
2112
  accounting_stats_.DeallocateBytes(accounting_stats_.Size());
2122
2113
  accounting_stats_.AllocateBytes(new_size);
2123
2114
 
2115
+ // Flush allocation watermarks.
2116
+ for (Page* p = first_page_; p != top_page; p = p->next_page()) {
2117
+ p->SetAllocationWatermark(p->AllocationTop());
2118
+ }
2119
+ top_page->SetAllocationWatermark(new_top);
2120
+
2124
2121
  #ifdef DEBUG
2125
2122
  if (FLAG_enable_slow_asserts) {
2126
2123
  intptr_t actual_size = 0;
@@ -2164,8 +2161,9 @@ class MapSpace : public FixedSpace {
2164
2161
  class CellSpace : public FixedSpace {
2165
2162
  public:
2166
2163
  // Creates a property cell space object with a maximum capacity.
2167
- CellSpace(intptr_t max_capacity, AllocationSpace id)
2168
- : FixedSpace(max_capacity, id, JSGlobalPropertyCell::kSize, "cell") {}
2164
+ CellSpace(Heap* heap, intptr_t max_capacity, AllocationSpace id)
2165
+ : FixedSpace(heap, max_capacity, id, JSGlobalPropertyCell::kSize, "cell")
2166
+ {}
2169
2167
 
2170
2168
  protected:
2171
2169
  #ifdef DEBUG
@@ -2240,7 +2238,7 @@ class LargeObjectChunk {
2240
2238
 
2241
2239
  class LargeObjectSpace : public Space {
2242
2240
  public:
2243
- explicit LargeObjectSpace(AllocationSpace id);
2241
+ LargeObjectSpace(Heap* heap, AllocationSpace id);
2244
2242
  virtual ~LargeObjectSpace() {}
2245
2243
 
2246
2244
  // Initializes internal data structures.
@@ -2257,9 +2255,7 @@ class LargeObjectSpace : public Space {
2257
2255
  MUST_USE_RESULT MaybeObject* AllocateRawFixedArray(int size_in_bytes);
2258
2256
 
2259
2257
  // Available bytes for objects in this space.
2260
- intptr_t Available() {
2261
- return LargeObjectChunk::ObjectSizeFor(MemoryAllocator::Available());
2262
- }
2258
+ inline intptr_t Available();
2263
2259
 
2264
2260
  virtual intptr_t Size() {
2265
2261
  return size_;
@@ -2351,6 +2347,22 @@ class LargeObjectIterator: public ObjectIterator {
2351
2347
  };
2352
2348
 
2353
2349
 
2350
+ #ifdef DEBUG
2351
+ struct CommentStatistic {
2352
+ const char* comment;
2353
+ int size;
2354
+ int count;
2355
+ void Clear() {
2356
+ comment = NULL;
2357
+ size = 0;
2358
+ count = 0;
2359
+ }
2360
+ // Must be small, since an iteration is used for lookup.
2361
+ static const int kMaxComments = 64;
2362
+ };
2363
+ #endif
2364
+
2365
+
2354
2366
  } } // namespace v8::internal
2355
2367
 
2356
2368
  #endif // V8_SPACES_H_