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
@@ -38,7 +38,6 @@
38
38
  #include "serialize.h"
39
39
  #include "stub-cache.h"
40
40
  #include "v8threads.h"
41
- #include "top.h"
42
41
  #include "bootstrapper.h"
43
42
 
44
43
  namespace v8 {
@@ -68,9 +67,14 @@ static int* GetInternalPointer(StatsCounter* counter) {
68
67
  // hashmaps in ExternalReferenceEncoder and ExternalReferenceDecoder.
69
68
  class ExternalReferenceTable {
70
69
  public:
71
- static ExternalReferenceTable* instance() {
72
- if (!instance_) instance_ = new ExternalReferenceTable();
73
- return instance_;
70
+ static ExternalReferenceTable* instance(Isolate* isolate) {
71
+ ExternalReferenceTable* external_reference_table =
72
+ isolate->external_reference_table();
73
+ if (external_reference_table == NULL) {
74
+ external_reference_table = new ExternalReferenceTable(isolate);
75
+ isolate->set_external_reference_table(external_reference_table);
76
+ }
77
+ return external_reference_table;
74
78
  }
75
79
 
76
80
  int size() const { return refs_.length(); }
@@ -84,9 +88,9 @@ class ExternalReferenceTable {
84
88
  int max_id(int code) { return max_id_[code]; }
85
89
 
86
90
  private:
87
- static ExternalReferenceTable* instance_;
88
-
89
- ExternalReferenceTable() : refs_(64) { PopulateTable(); }
91
+ explicit ExternalReferenceTable(Isolate* isolate) : refs_(64) {
92
+ PopulateTable(isolate);
93
+ }
90
94
  ~ExternalReferenceTable() { }
91
95
 
92
96
  struct ExternalReferenceEntry {
@@ -95,10 +99,13 @@ class ExternalReferenceTable {
95
99
  const char* name;
96
100
  };
97
101
 
98
- void PopulateTable();
102
+ void PopulateTable(Isolate* isolate);
99
103
 
100
104
  // For a few types of references, we can get their address from their id.
101
- void AddFromId(TypeCode type, uint16_t id, const char* name);
105
+ void AddFromId(TypeCode type,
106
+ uint16_t id,
107
+ const char* name,
108
+ Isolate* isolate);
102
109
 
103
110
  // For other types of references, the caller will figure out the address.
104
111
  void Add(Address address, TypeCode type, uint16_t id, const char* name);
@@ -108,31 +115,30 @@ class ExternalReferenceTable {
108
115
  };
109
116
 
110
117
 
111
- ExternalReferenceTable* ExternalReferenceTable::instance_ = NULL;
112
-
113
-
114
118
  void ExternalReferenceTable::AddFromId(TypeCode type,
115
119
  uint16_t id,
116
- const char* name) {
120
+ const char* name,
121
+ Isolate* isolate) {
117
122
  Address address;
118
123
  switch (type) {
119
124
  case C_BUILTIN: {
120
- ExternalReference ref(static_cast<Builtins::CFunctionId>(id));
125
+ ExternalReference ref(static_cast<Builtins::CFunctionId>(id), isolate);
121
126
  address = ref.address();
122
127
  break;
123
128
  }
124
129
  case BUILTIN: {
125
- ExternalReference ref(static_cast<Builtins::Name>(id));
130
+ ExternalReference ref(static_cast<Builtins::Name>(id), isolate);
126
131
  address = ref.address();
127
132
  break;
128
133
  }
129
134
  case RUNTIME_FUNCTION: {
130
- ExternalReference ref(static_cast<Runtime::FunctionId>(id));
135
+ ExternalReference ref(static_cast<Runtime::FunctionId>(id), isolate);
131
136
  address = ref.address();
132
137
  break;
133
138
  }
134
139
  case IC_UTILITY: {
135
- ExternalReference ref(IC_Utility(static_cast<IC::UtilityId>(id)));
140
+ ExternalReference ref(IC_Utility(static_cast<IC::UtilityId>(id)),
141
+ isolate);
136
142
  address = ref.address();
137
143
  break;
138
144
  }
@@ -159,7 +165,7 @@ void ExternalReferenceTable::Add(Address address,
159
165
  }
160
166
 
161
167
 
162
- void ExternalReferenceTable::PopulateTable() {
168
+ void ExternalReferenceTable::PopulateTable(Isolate* isolate) {
163
169
  for (int type_code = 0; type_code < kTypeCodeCount; type_code++) {
164
170
  max_id_[type_code] = 0;
165
171
  }
@@ -190,7 +196,7 @@ void ExternalReferenceTable::PopulateTable() {
190
196
 
191
197
  #define DEF_ENTRY_C(name, ignored) \
192
198
  { BUILTIN, \
193
- Builtins::name, \
199
+ Builtins::k##name, \
194
200
  "Builtins::" #name },
195
201
  #define DEF_ENTRY_A(name, kind, state, extra) DEF_ENTRY_C(name, ignored)
196
202
 
@@ -220,24 +226,27 @@ void ExternalReferenceTable::PopulateTable() {
220
226
  }; // end of ref_table[].
221
227
 
222
228
  for (size_t i = 0; i < ARRAY_SIZE(ref_table); ++i) {
223
- AddFromId(ref_table[i].type, ref_table[i].id, ref_table[i].name);
229
+ AddFromId(ref_table[i].type,
230
+ ref_table[i].id,
231
+ ref_table[i].name,
232
+ isolate);
224
233
  }
225
234
 
226
235
  #ifdef ENABLE_DEBUGGER_SUPPORT
227
236
  // Debug addresses
228
- Add(Debug_Address(Debug::k_after_break_target_address).address(),
237
+ Add(Debug_Address(Debug::k_after_break_target_address).address(isolate),
229
238
  DEBUG_ADDRESS,
230
239
  Debug::k_after_break_target_address << kDebugIdShift,
231
240
  "Debug::after_break_target_address()");
232
- Add(Debug_Address(Debug::k_debug_break_slot_address).address(),
241
+ Add(Debug_Address(Debug::k_debug_break_slot_address).address(isolate),
233
242
  DEBUG_ADDRESS,
234
243
  Debug::k_debug_break_slot_address << kDebugIdShift,
235
244
  "Debug::debug_break_slot_address()");
236
- Add(Debug_Address(Debug::k_debug_break_return_address).address(),
245
+ Add(Debug_Address(Debug::k_debug_break_return_address).address(isolate),
237
246
  DEBUG_ADDRESS,
238
247
  Debug::k_debug_break_return_address << kDebugIdShift,
239
248
  "Debug::debug_break_return_address()");
240
- Add(Debug_Address(Debug::k_restarter_frame_function_pointer).address(),
249
+ Add(Debug_Address(Debug::k_restarter_frame_function_pointer).address(isolate),
241
250
  DEBUG_ADDRESS,
242
251
  Debug::k_restarter_frame_function_pointer << kDebugIdShift,
243
252
  "Debug::restarter_frame_function_pointer_address()");
@@ -245,14 +254,14 @@ void ExternalReferenceTable::PopulateTable() {
245
254
 
246
255
  // Stat counters
247
256
  struct StatsRefTableEntry {
248
- StatsCounter* counter;
257
+ StatsCounter* (Counters::*counter)();
249
258
  uint16_t id;
250
259
  const char* name;
251
260
  };
252
261
 
253
- static const StatsRefTableEntry stats_ref_table[] = {
262
+ const StatsRefTableEntry stats_ref_table[] = {
254
263
  #define COUNTER_ENTRY(name, caption) \
255
- { &Counters::name, \
264
+ { &Counters::name, \
256
265
  Counters::k_##name, \
257
266
  "Counters::" #name },
258
267
 
@@ -261,33 +270,28 @@ void ExternalReferenceTable::PopulateTable() {
261
270
  #undef COUNTER_ENTRY
262
271
  }; // end of stats_ref_table[].
263
272
 
273
+ Counters* counters = isolate->counters();
264
274
  for (size_t i = 0; i < ARRAY_SIZE(stats_ref_table); ++i) {
265
- Add(reinterpret_cast<Address>(
266
- GetInternalPointer(stats_ref_table[i].counter)),
275
+ Add(reinterpret_cast<Address>(GetInternalPointer(
276
+ (counters->*(stats_ref_table[i].counter))())),
267
277
  STATS_COUNTER,
268
278
  stats_ref_table[i].id,
269
279
  stats_ref_table[i].name);
270
280
  }
271
281
 
272
282
  // Top addresses
273
- const char* top_address_format = "Top::%s";
274
283
 
275
284
  const char* AddressNames[] = {
276
- #define C(name) #name,
277
- TOP_ADDRESS_LIST(C)
278
- TOP_ADDRESS_LIST_PROF(C)
285
+ #define C(name) "Isolate::" #name,
286
+ ISOLATE_ADDRESS_LIST(C)
287
+ ISOLATE_ADDRESS_LIST_PROF(C)
279
288
  NULL
280
289
  #undef C
281
290
  };
282
291
 
283
- int top_format_length = StrLength(top_address_format) - 2;
284
- for (uint16_t i = 0; i < Top::k_top_address_count; ++i) {
285
- const char* address_name = AddressNames[i];
286
- Vector<char> name =
287
- Vector<char>::New(top_format_length + StrLength(address_name) + 1);
288
- const char* chars = name.start();
289
- OS::SNPrintF(name, top_address_format, address_name);
290
- Add(Top::get_address_from_id((Top::AddressId)i), TOP_ADDRESS, i, chars);
292
+ for (uint16_t i = 0; i < Isolate::k_isolate_address_count; ++i) {
293
+ Add(isolate->get_address_from_id((Isolate::AddressId)i),
294
+ TOP_ADDRESS, i, AddressNames[i]);
291
295
  }
292
296
 
293
297
  // Accessors
@@ -300,143 +304,145 @@ void ExternalReferenceTable::PopulateTable() {
300
304
  ACCESSOR_DESCRIPTOR_LIST(ACCESSOR_DESCRIPTOR_DECLARATION)
301
305
  #undef ACCESSOR_DESCRIPTOR_DECLARATION
302
306
 
307
+ StubCache* stub_cache = isolate->stub_cache();
308
+
303
309
  // Stub cache tables
304
- Add(SCTableReference::keyReference(StubCache::kPrimary).address(),
310
+ Add(stub_cache->key_reference(StubCache::kPrimary).address(),
305
311
  STUB_CACHE_TABLE,
306
312
  1,
307
313
  "StubCache::primary_->key");
308
- Add(SCTableReference::valueReference(StubCache::kPrimary).address(),
314
+ Add(stub_cache->value_reference(StubCache::kPrimary).address(),
309
315
  STUB_CACHE_TABLE,
310
316
  2,
311
317
  "StubCache::primary_->value");
312
- Add(SCTableReference::keyReference(StubCache::kSecondary).address(),
318
+ Add(stub_cache->key_reference(StubCache::kSecondary).address(),
313
319
  STUB_CACHE_TABLE,
314
320
  3,
315
321
  "StubCache::secondary_->key");
316
- Add(SCTableReference::valueReference(StubCache::kSecondary).address(),
322
+ Add(stub_cache->value_reference(StubCache::kSecondary).address(),
317
323
  STUB_CACHE_TABLE,
318
324
  4,
319
325
  "StubCache::secondary_->value");
320
326
 
321
327
  // Runtime entries
322
- Add(ExternalReference::perform_gc_function().address(),
328
+ Add(ExternalReference::perform_gc_function(isolate).address(),
323
329
  RUNTIME_ENTRY,
324
330
  1,
325
331
  "Runtime::PerformGC");
326
- Add(ExternalReference::fill_heap_number_with_random_function().address(),
332
+ Add(ExternalReference::fill_heap_number_with_random_function(
333
+ isolate).address(),
327
334
  RUNTIME_ENTRY,
328
335
  2,
329
336
  "V8::FillHeapNumberWithRandom");
330
-
331
- Add(ExternalReference::random_uint32_function().address(),
337
+ Add(ExternalReference::random_uint32_function(isolate).address(),
332
338
  RUNTIME_ENTRY,
333
339
  3,
334
340
  "V8::Random");
335
-
336
- Add(ExternalReference::delete_handle_scope_extensions().address(),
341
+ Add(ExternalReference::delete_handle_scope_extensions(isolate).address(),
337
342
  RUNTIME_ENTRY,
338
343
  4,
339
344
  "HandleScope::DeleteExtensions");
340
345
 
341
346
  // Miscellaneous
342
- Add(ExternalReference::the_hole_value_location().address(),
347
+ Add(ExternalReference::the_hole_value_location(isolate).address(),
343
348
  UNCLASSIFIED,
344
349
  2,
345
350
  "Factory::the_hole_value().location()");
346
- Add(ExternalReference::roots_address().address(),
351
+ Add(ExternalReference::roots_address(isolate).address(),
347
352
  UNCLASSIFIED,
348
353
  3,
349
354
  "Heap::roots_address()");
350
- Add(ExternalReference::address_of_stack_limit().address(),
355
+ Add(ExternalReference::address_of_stack_limit(isolate).address(),
351
356
  UNCLASSIFIED,
352
357
  4,
353
358
  "StackGuard::address_of_jslimit()");
354
- Add(ExternalReference::address_of_real_stack_limit().address(),
359
+ Add(ExternalReference::address_of_real_stack_limit(isolate).address(),
355
360
  UNCLASSIFIED,
356
361
  5,
357
362
  "StackGuard::address_of_real_jslimit()");
358
363
  #ifndef V8_INTERPRETED_REGEXP
359
- Add(ExternalReference::address_of_regexp_stack_limit().address(),
364
+ Add(ExternalReference::address_of_regexp_stack_limit(isolate).address(),
360
365
  UNCLASSIFIED,
361
366
  6,
362
367
  "RegExpStack::limit_address()");
363
- Add(ExternalReference::address_of_regexp_stack_memory_address().address(),
368
+ Add(ExternalReference::address_of_regexp_stack_memory_address(
369
+ isolate).address(),
364
370
  UNCLASSIFIED,
365
371
  7,
366
372
  "RegExpStack::memory_address()");
367
- Add(ExternalReference::address_of_regexp_stack_memory_size().address(),
373
+ Add(ExternalReference::address_of_regexp_stack_memory_size(isolate).address(),
368
374
  UNCLASSIFIED,
369
375
  8,
370
376
  "RegExpStack::memory_size()");
371
- Add(ExternalReference::address_of_static_offsets_vector().address(),
377
+ Add(ExternalReference::address_of_static_offsets_vector(isolate).address(),
372
378
  UNCLASSIFIED,
373
379
  9,
374
380
  "OffsetsVector::static_offsets_vector");
375
381
  #endif // V8_INTERPRETED_REGEXP
376
- Add(ExternalReference::new_space_start().address(),
382
+ Add(ExternalReference::new_space_start(isolate).address(),
377
383
  UNCLASSIFIED,
378
384
  10,
379
385
  "Heap::NewSpaceStart()");
380
- Add(ExternalReference::new_space_mask().address(),
386
+ Add(ExternalReference::new_space_mask(isolate).address(),
381
387
  UNCLASSIFIED,
382
388
  11,
383
389
  "Heap::NewSpaceMask()");
384
- Add(ExternalReference::heap_always_allocate_scope_depth().address(),
390
+ Add(ExternalReference::heap_always_allocate_scope_depth(isolate).address(),
385
391
  UNCLASSIFIED,
386
392
  12,
387
393
  "Heap::always_allocate_scope_depth()");
388
- Add(ExternalReference::new_space_allocation_limit_address().address(),
394
+ Add(ExternalReference::new_space_allocation_limit_address(isolate).address(),
389
395
  UNCLASSIFIED,
390
396
  13,
391
397
  "Heap::NewSpaceAllocationLimitAddress()");
392
- Add(ExternalReference::new_space_allocation_top_address().address(),
398
+ Add(ExternalReference::new_space_allocation_top_address(isolate).address(),
393
399
  UNCLASSIFIED,
394
400
  14,
395
401
  "Heap::NewSpaceAllocationTopAddress()");
396
402
  #ifdef ENABLE_DEBUGGER_SUPPORT
397
- Add(ExternalReference::debug_break().address(),
403
+ Add(ExternalReference::debug_break(isolate).address(),
398
404
  UNCLASSIFIED,
399
405
  15,
400
406
  "Debug::Break()");
401
- Add(ExternalReference::debug_step_in_fp_address().address(),
407
+ Add(ExternalReference::debug_step_in_fp_address(isolate).address(),
402
408
  UNCLASSIFIED,
403
409
  16,
404
410
  "Debug::step_in_fp_addr()");
405
411
  #endif
406
- Add(ExternalReference::double_fp_operation(Token::ADD).address(),
412
+ Add(ExternalReference::double_fp_operation(Token::ADD, isolate).address(),
407
413
  UNCLASSIFIED,
408
414
  17,
409
415
  "add_two_doubles");
410
- Add(ExternalReference::double_fp_operation(Token::SUB).address(),
416
+ Add(ExternalReference::double_fp_operation(Token::SUB, isolate).address(),
411
417
  UNCLASSIFIED,
412
418
  18,
413
419
  "sub_two_doubles");
414
- Add(ExternalReference::double_fp_operation(Token::MUL).address(),
420
+ Add(ExternalReference::double_fp_operation(Token::MUL, isolate).address(),
415
421
  UNCLASSIFIED,
416
422
  19,
417
423
  "mul_two_doubles");
418
- Add(ExternalReference::double_fp_operation(Token::DIV).address(),
424
+ Add(ExternalReference::double_fp_operation(Token::DIV, isolate).address(),
419
425
  UNCLASSIFIED,
420
426
  20,
421
427
  "div_two_doubles");
422
- Add(ExternalReference::double_fp_operation(Token::MOD).address(),
428
+ Add(ExternalReference::double_fp_operation(Token::MOD, isolate).address(),
423
429
  UNCLASSIFIED,
424
430
  21,
425
431
  "mod_two_doubles");
426
- Add(ExternalReference::compare_doubles().address(),
432
+ Add(ExternalReference::compare_doubles(isolate).address(),
427
433
  UNCLASSIFIED,
428
434
  22,
429
435
  "compare_doubles");
430
436
  #ifndef V8_INTERPRETED_REGEXP
431
- Add(ExternalReference::re_case_insensitive_compare_uc16().address(),
437
+ Add(ExternalReference::re_case_insensitive_compare_uc16(isolate).address(),
432
438
  UNCLASSIFIED,
433
439
  23,
434
440
  "NativeRegExpMacroAssembler::CaseInsensitiveCompareUC16()");
435
- Add(ExternalReference::re_check_stack_guard_state().address(),
441
+ Add(ExternalReference::re_check_stack_guard_state(isolate).address(),
436
442
  UNCLASSIFIED,
437
443
  24,
438
444
  "RegExpMacroAssembler*::CheckStackGuardState()");
439
- Add(ExternalReference::re_grow_stack().address(),
445
+ Add(ExternalReference::re_grow_stack(isolate).address(),
440
446
  UNCLASSIFIED,
441
447
  25,
442
448
  "NativeRegExpMacroAssembler::GrowStack()");
@@ -446,15 +452,15 @@ void ExternalReferenceTable::PopulateTable() {
446
452
  "NativeRegExpMacroAssembler::word_character_map");
447
453
  #endif // V8_INTERPRETED_REGEXP
448
454
  // Keyed lookup cache.
449
- Add(ExternalReference::keyed_lookup_cache_keys().address(),
455
+ Add(ExternalReference::keyed_lookup_cache_keys(isolate).address(),
450
456
  UNCLASSIFIED,
451
457
  27,
452
458
  "KeyedLookupCache::keys()");
453
- Add(ExternalReference::keyed_lookup_cache_field_offsets().address(),
459
+ Add(ExternalReference::keyed_lookup_cache_field_offsets(isolate).address(),
454
460
  UNCLASSIFIED,
455
461
  28,
456
462
  "KeyedLookupCache::field_offsets()");
457
- Add(ExternalReference::transcendental_cache_array_address().address(),
463
+ Add(ExternalReference::transcendental_cache_array_address(isolate).address(),
458
464
  UNCLASSIFIED,
459
465
  29,
460
466
  "TranscendentalCache::caches()");
@@ -470,11 +476,11 @@ void ExternalReferenceTable::PopulateTable() {
470
476
  UNCLASSIFIED,
471
477
  32,
472
478
  "HandleScope::level");
473
- Add(ExternalReference::new_deoptimizer_function().address(),
479
+ Add(ExternalReference::new_deoptimizer_function(isolate).address(),
474
480
  UNCLASSIFIED,
475
481
  33,
476
482
  "Deoptimizer::New()");
477
- Add(ExternalReference::compute_output_frames_function().address(),
483
+ Add(ExternalReference::compute_output_frames_function(isolate).address(),
478
484
  UNCLASSIFIED,
479
485
  34,
480
486
  "Deoptimizer::ComputeOutputFrames()");
@@ -486,33 +492,38 @@ void ExternalReferenceTable::PopulateTable() {
486
492
  UNCLASSIFIED,
487
493
  36,
488
494
  "LDoubleConstant::one_half");
489
- Add(ExternalReference::address_of_minus_zero().address(),
495
+ Add(ExternalReference::isolate_address().address(),
490
496
  UNCLASSIFIED,
491
497
  37,
498
+ "isolate");
499
+ Add(ExternalReference::address_of_minus_zero().address(),
500
+ UNCLASSIFIED,
501
+ 38,
492
502
  "LDoubleConstant::minus_zero");
493
503
  Add(ExternalReference::address_of_negative_infinity().address(),
494
504
  UNCLASSIFIED,
495
- 38,
505
+ 39,
496
506
  "LDoubleConstant::negative_infinity");
497
- Add(ExternalReference::power_double_double_function().address(),
507
+ Add(ExternalReference::power_double_double_function(isolate).address(),
498
508
  UNCLASSIFIED,
499
- 39,
509
+ 40,
500
510
  "power_double_double_function");
501
- Add(ExternalReference::power_double_int_function().address(),
511
+ Add(ExternalReference::power_double_int_function(isolate).address(),
502
512
  UNCLASSIFIED,
503
- 40,
513
+ 41,
504
514
  "power_double_int_function");
505
- Add(ExternalReference::arguments_marker_location().address(),
515
+ Add(ExternalReference::arguments_marker_location(isolate).address(),
506
516
  UNCLASSIFIED,
507
- 41,
517
+ 42,
508
518
  "Factory::arguments_marker().location()");
509
519
  }
510
520
 
511
521
 
512
522
  ExternalReferenceEncoder::ExternalReferenceEncoder()
513
- : encodings_(Match) {
523
+ : encodings_(Match),
524
+ isolate_(Isolate::Current()) {
514
525
  ExternalReferenceTable* external_references =
515
- ExternalReferenceTable::instance();
526
+ ExternalReferenceTable::instance(isolate_);
516
527
  for (int i = 0; i < external_references->size(); ++i) {
517
528
  Put(external_references->address(i), i);
518
529
  }
@@ -522,20 +533,22 @@ ExternalReferenceEncoder::ExternalReferenceEncoder()
522
533
  uint32_t ExternalReferenceEncoder::Encode(Address key) const {
523
534
  int index = IndexOf(key);
524
535
  ASSERT(key == NULL || index >= 0);
525
- return index >=0 ? ExternalReferenceTable::instance()->code(index) : 0;
536
+ return index >=0 ?
537
+ ExternalReferenceTable::instance(isolate_)->code(index) : 0;
526
538
  }
527
539
 
528
540
 
529
541
  const char* ExternalReferenceEncoder::NameOfAddress(Address key) const {
530
542
  int index = IndexOf(key);
531
- return index >=0 ? ExternalReferenceTable::instance()->name(index) : NULL;
543
+ return index >= 0 ?
544
+ ExternalReferenceTable::instance(isolate_)->name(index) : NULL;
532
545
  }
533
546
 
534
547
 
535
548
  int ExternalReferenceEncoder::IndexOf(Address key) const {
536
549
  if (key == NULL) return -1;
537
550
  HashMap::Entry* entry =
538
- const_cast<HashMap &>(encodings_).Lookup(key, Hash(key), false);
551
+ const_cast<HashMap&>(encodings_).Lookup(key, Hash(key), false);
539
552
  return entry == NULL
540
553
  ? -1
541
554
  : static_cast<int>(reinterpret_cast<intptr_t>(entry->value));
@@ -549,9 +562,10 @@ void ExternalReferenceEncoder::Put(Address key, int index) {
549
562
 
550
563
 
551
564
  ExternalReferenceDecoder::ExternalReferenceDecoder()
552
- : encodings_(NewArray<Address*>(kTypeCodeCount)) {
565
+ : encodings_(NewArray<Address*>(kTypeCodeCount)),
566
+ isolate_(Isolate::Current()) {
553
567
  ExternalReferenceTable* external_references =
554
- ExternalReferenceTable::instance();
568
+ ExternalReferenceTable::instance(isolate_);
555
569
  for (int type = kFirstTypeCode; type < kTypeCodeCount; ++type) {
556
570
  int max = external_references->max_id(type) + 1;
557
571
  encodings_[type] = NewArray<Address>(max + 1);
@@ -572,10 +586,12 @@ ExternalReferenceDecoder::~ExternalReferenceDecoder() {
572
586
 
573
587
  bool Serializer::serialization_enabled_ = false;
574
588
  bool Serializer::too_late_to_enable_now_ = false;
575
- ExternalReferenceDecoder* Deserializer::external_reference_decoder_ = NULL;
576
589
 
577
590
 
578
- Deserializer::Deserializer(SnapshotByteSource* source) : source_(source) {
591
+ Deserializer::Deserializer(SnapshotByteSource* source)
592
+ : isolate_(NULL),
593
+ source_(source),
594
+ external_reference_decoder_(NULL) {
579
595
  }
580
596
 
581
597
 
@@ -601,7 +617,6 @@ Address Deserializer::Allocate(int space_index, Space* space, int size) {
601
617
  high_water_[space_index] = address + size;
602
618
  } else {
603
619
  ASSERT(SpaceIsLarge(space_index));
604
- ASSERT(size > Page::kPageSize - Page::kObjectStartOffset);
605
620
  LargeObjectSpace* lo_space = reinterpret_cast<LargeObjectSpace*>(space);
606
621
  Object* new_allocation;
607
622
  if (space_index == kLargeData) {
@@ -655,27 +670,31 @@ HeapObject* Deserializer::GetAddressFromStart(int space) {
655
670
 
656
671
 
657
672
  void Deserializer::Deserialize() {
673
+ isolate_ = Isolate::Current();
658
674
  // Don't GC while deserializing - just expand the heap.
659
675
  AlwaysAllocateScope always_allocate;
660
676
  // Don't use the free lists while deserializing.
661
677
  LinearAllocationScope allocate_linearly;
662
678
  // No active threads.
663
- ASSERT_EQ(NULL, ThreadState::FirstInUse());
679
+ ASSERT_EQ(NULL, isolate_->thread_manager()->FirstThreadStateInUse());
664
680
  // No active handles.
665
- ASSERT(HandleScopeImplementer::instance()->blocks()->is_empty());
681
+ ASSERT(isolate_->handle_scope_implementer()->blocks()->is_empty());
666
682
  // Make sure the entire partial snapshot cache is traversed, filling it with
667
683
  // valid object pointers.
668
- partial_snapshot_cache_length_ = kPartialSnapshotCacheCapacity;
684
+ isolate_->set_serialize_partial_snapshot_cache_length(
685
+ Isolate::kPartialSnapshotCacheCapacity);
669
686
  ASSERT_EQ(NULL, external_reference_decoder_);
670
687
  external_reference_decoder_ = new ExternalReferenceDecoder();
671
- Heap::IterateStrongRoots(this, VISIT_ONLY_STRONG);
672
- Heap::IterateWeakRoots(this, VISIT_ALL);
688
+ isolate_->heap()->IterateStrongRoots(this, VISIT_ONLY_STRONG);
689
+ isolate_->heap()->IterateWeakRoots(this, VISIT_ALL);
673
690
 
674
- Heap::set_global_contexts_list(Heap::undefined_value());
691
+ isolate_->heap()->set_global_contexts_list(
692
+ isolate_->heap()->undefined_value());
675
693
  }
676
694
 
677
695
 
678
696
  void Deserializer::DeserializePartial(Object** root) {
697
+ isolate_ = Isolate::Current();
679
698
  // Don't GC while deserializing - just expand the heap.
680
699
  AlwaysAllocateScope always_allocate;
681
700
  // Don't use the free lists while deserializing.
@@ -689,7 +708,7 @@ void Deserializer::DeserializePartial(Object** root) {
689
708
 
690
709
  Deserializer::~Deserializer() {
691
710
  ASSERT(source_->AtEOF());
692
- if (external_reference_decoder_ != NULL) {
711
+ if (external_reference_decoder_) {
693
712
  delete external_reference_decoder_;
694
713
  external_reference_decoder_ = NULL;
695
714
  }
@@ -720,9 +739,14 @@ void Deserializer::ReadObject(int space_number,
720
739
  Object** current = reinterpret_cast<Object**>(address);
721
740
  Object** limit = current + (size >> kPointerSizeLog2);
722
741
  if (FLAG_log_snapshot_positions) {
723
- LOG(SnapshotPositionEvent(address, source_->position()));
742
+ LOG(isolate_, SnapshotPositionEvent(address, source_->position()));
724
743
  }
725
744
  ReadChunk(current, limit, space_number, address);
745
+ #ifdef DEBUG
746
+ bool is_codespace = (space == HEAP->code_space()) ||
747
+ ((space == HEAP->lo_space()) && (space_number == kLargeCode));
748
+ ASSERT(HeapObject::FromAddress(address)->IsCode() == is_codespace);
749
+ #endif
726
750
  }
727
751
 
728
752
 
@@ -732,20 +756,20 @@ void Deserializer::ReadObject(int space_number,
732
756
  #define ASSIGN_DEST_SPACE(space_number) \
733
757
  Space* dest_space; \
734
758
  if (space_number == NEW_SPACE) { \
735
- dest_space = Heap::new_space(); \
759
+ dest_space = isolate->heap()->new_space(); \
736
760
  } else if (space_number == OLD_POINTER_SPACE) { \
737
- dest_space = Heap::old_pointer_space(); \
761
+ dest_space = isolate->heap()->old_pointer_space(); \
738
762
  } else if (space_number == OLD_DATA_SPACE) { \
739
- dest_space = Heap::old_data_space(); \
763
+ dest_space = isolate->heap()->old_data_space(); \
740
764
  } else if (space_number == CODE_SPACE) { \
741
- dest_space = Heap::code_space(); \
765
+ dest_space = isolate->heap()->code_space(); \
742
766
  } else if (space_number == MAP_SPACE) { \
743
- dest_space = Heap::map_space(); \
767
+ dest_space = isolate->heap()->map_space(); \
744
768
  } else if (space_number == CELL_SPACE) { \
745
- dest_space = Heap::cell_space(); \
769
+ dest_space = isolate->heap()->cell_space(); \
746
770
  } else { \
747
771
  ASSERT(space_number >= LO_SPACE); \
748
- dest_space = Heap::lo_space(); \
772
+ dest_space = isolate->heap()->lo_space(); \
749
773
  }
750
774
 
751
775
 
@@ -756,6 +780,7 @@ void Deserializer::ReadChunk(Object** current,
756
780
  Object** limit,
757
781
  int source_space,
758
782
  Address address) {
783
+ Isolate* const isolate = isolate_;
759
784
  while (current < limit) {
760
785
  int data = source_->Get();
761
786
  switch (data) {
@@ -784,14 +809,15 @@ void Deserializer::ReadChunk(Object** current,
784
809
  ReadObject(space_number, dest_space, &new_object); \
785
810
  } else if (where == kRootArray) { \
786
811
  int root_id = source_->GetInt(); \
787
- new_object = Heap::roots_address()[root_id]; \
812
+ new_object = isolate->heap()->roots_address()[root_id]; \
788
813
  } else if (where == kPartialSnapshotCache) { \
789
814
  int cache_index = source_->GetInt(); \
790
- new_object = partial_snapshot_cache_[cache_index]; \
815
+ new_object = isolate->serialize_partial_snapshot_cache() \
816
+ [cache_index]; \
791
817
  } else if (where == kExternalReference) { \
792
818
  int reference_id = source_->GetInt(); \
793
- Address address = \
794
- external_reference_decoder_->Decode(reference_id); \
819
+ Address address = external_reference_decoder_-> \
820
+ Decode(reference_id); \
795
821
  new_object = reinterpret_cast<Object*>(address); \
796
822
  } else if (where == kBackref) { \
797
823
  emit_write_barrier = \
@@ -829,7 +855,7 @@ void Deserializer::ReadChunk(Object** current,
829
855
  } \
830
856
  } \
831
857
  if (emit_write_barrier) { \
832
- Heap::RecordWrite(address, static_cast<int>( \
858
+ isolate->heap()->RecordWrite(address, static_cast<int>( \
833
859
  reinterpret_cast<Address>(current) - address)); \
834
860
  } \
835
861
  if (!current_was_incremented) { \
@@ -878,7 +904,7 @@ void Deserializer::ReadChunk(Object** current,
878
904
  CASE_STATEMENT(where, how, within, CODE_SPACE) \
879
905
  CASE_BODY(where, how, within, CODE_SPACE, kUnknownOffsetFromStart) \
880
906
  CASE_STATEMENT(where, how, within, kLargeCode) \
881
- CASE_BODY(where, how, within, LO_SPACE, kUnknownOffsetFromStart)
907
+ CASE_BODY(where, how, within, kLargeCode, kUnknownOffsetFromStart)
882
908
 
883
909
  #define EMIT_COMMON_REFERENCE_PATTERNS(pseudo_space_number, \
884
910
  space_number, \
@@ -993,7 +1019,8 @@ void Deserializer::ReadChunk(Object** current,
993
1019
  int index = source_->Get();
994
1020
  Vector<const char> source_vector = Natives::GetScriptSource(index);
995
1021
  NativesExternalStringResource* resource =
996
- new NativesExternalStringResource(source_vector.start());
1022
+ new NativesExternalStringResource(
1023
+ isolate->bootstrapper(), source_vector.start());
997
1024
  *current++ = reinterpret_cast<Object*>(resource);
998
1025
  break;
999
1026
  }
@@ -1058,6 +1085,9 @@ Serializer::Serializer(SnapshotByteSink* sink)
1058
1085
  current_root_index_(0),
1059
1086
  external_reference_encoder_(new ExternalReferenceEncoder),
1060
1087
  large_object_total_(0) {
1088
+ // The serializer is meant to be used only to generate initial heap images
1089
+ // from a context in which there is only one isolate.
1090
+ ASSERT(Isolate::Current()->IsDefaultIsolate());
1061
1091
  for (int i = 0; i <= LAST_SPACE; i++) {
1062
1092
  fullness_[i] = 0;
1063
1093
  }
@@ -1070,35 +1100,40 @@ Serializer::~Serializer() {
1070
1100
 
1071
1101
 
1072
1102
  void StartupSerializer::SerializeStrongReferences() {
1103
+ Isolate* isolate = Isolate::Current();
1073
1104
  // No active threads.
1074
- CHECK_EQ(NULL, ThreadState::FirstInUse());
1105
+ CHECK_EQ(NULL, Isolate::Current()->thread_manager()->FirstThreadStateInUse());
1075
1106
  // No active or weak handles.
1076
- CHECK(HandleScopeImplementer::instance()->blocks()->is_empty());
1077
- CHECK_EQ(0, GlobalHandles::NumberOfWeakHandles());
1107
+ CHECK(isolate->handle_scope_implementer()->blocks()->is_empty());
1108
+ CHECK_EQ(0, isolate->global_handles()->NumberOfWeakHandles());
1078
1109
  // We don't support serializing installed extensions.
1079
- for (RegisteredExtension* ext = RegisteredExtension::first_extension();
1110
+ for (RegisteredExtension* ext = v8::RegisteredExtension::first_extension();
1080
1111
  ext != NULL;
1081
1112
  ext = ext->next()) {
1082
1113
  CHECK_NE(v8::INSTALLED, ext->state());
1083
1114
  }
1084
- Heap::IterateStrongRoots(this, VISIT_ONLY_STRONG);
1115
+ HEAP->IterateStrongRoots(this, VISIT_ONLY_STRONG);
1085
1116
  }
1086
1117
 
1087
1118
 
1088
1119
  void PartialSerializer::Serialize(Object** object) {
1089
1120
  this->VisitPointer(object);
1121
+ Isolate* isolate = Isolate::Current();
1090
1122
 
1091
1123
  // After we have done the partial serialization the partial snapshot cache
1092
1124
  // will contain some references needed to decode the partial snapshot. We
1093
1125
  // fill it up with undefineds so it has a predictable length so the
1094
1126
  // deserialization code doesn't need to know the length.
1095
- for (int index = partial_snapshot_cache_length_;
1096
- index < kPartialSnapshotCacheCapacity;
1127
+ for (int index = isolate->serialize_partial_snapshot_cache_length();
1128
+ index < Isolate::kPartialSnapshotCacheCapacity;
1097
1129
  index++) {
1098
- partial_snapshot_cache_[index] = Heap::undefined_value();
1099
- startup_serializer_->VisitPointer(&partial_snapshot_cache_[index]);
1130
+ isolate->serialize_partial_snapshot_cache()[index] =
1131
+ isolate->heap()->undefined_value();
1132
+ startup_serializer_->VisitPointer(
1133
+ &isolate->serialize_partial_snapshot_cache()[index]);
1100
1134
  }
1101
- partial_snapshot_cache_length_ = kPartialSnapshotCacheCapacity;
1135
+ isolate->set_serialize_partial_snapshot_cache_length(
1136
+ Isolate::kPartialSnapshotCacheCapacity);
1102
1137
  }
1103
1138
 
1104
1139
 
@@ -1117,11 +1152,6 @@ void Serializer::VisitPointers(Object** start, Object** end) {
1117
1152
  }
1118
1153
 
1119
1154
 
1120
- Object* SerializerDeserializer::partial_snapshot_cache_[
1121
- kPartialSnapshotCacheCapacity];
1122
- int SerializerDeserializer::partial_snapshot_cache_length_ = 0;
1123
-
1124
-
1125
1155
  // This ensures that the partial snapshot cache keeps things alive during GC and
1126
1156
  // tracks their movement. When it is called during serialization of the startup
1127
1157
  // snapshot the partial snapshot is empty, so nothing happens. When the partial
@@ -1131,9 +1161,11 @@ int SerializerDeserializer::partial_snapshot_cache_length_ = 0;
1131
1161
  // deserialization we therefore need to visit the cache array. This fills it up
1132
1162
  // with pointers to deserialized objects.
1133
1163
  void SerializerDeserializer::Iterate(ObjectVisitor* visitor) {
1164
+ Isolate* isolate = Isolate::Current();
1134
1165
  visitor->VisitPointers(
1135
- &partial_snapshot_cache_[0],
1136
- &partial_snapshot_cache_[partial_snapshot_cache_length_]);
1166
+ isolate->serialize_partial_snapshot_cache(),
1167
+ &isolate->serialize_partial_snapshot_cache()[
1168
+ isolate->serialize_partial_snapshot_cache_length()]);
1137
1169
  }
1138
1170
 
1139
1171
 
@@ -1141,33 +1173,39 @@ void SerializerDeserializer::Iterate(ObjectVisitor* visitor) {
1141
1173
  // the root iteration code (above) will iterate over array elements, writing the
1142
1174
  // references to deserialized objects in them.
1143
1175
  void SerializerDeserializer::SetSnapshotCacheSize(int size) {
1144
- partial_snapshot_cache_length_ = size;
1176
+ Isolate::Current()->set_serialize_partial_snapshot_cache_length(size);
1145
1177
  }
1146
1178
 
1147
1179
 
1148
1180
  int PartialSerializer::PartialSnapshotCacheIndex(HeapObject* heap_object) {
1149
- for (int i = 0; i < partial_snapshot_cache_length_; i++) {
1150
- Object* entry = partial_snapshot_cache_[i];
1181
+ Isolate* isolate = Isolate::Current();
1182
+
1183
+ for (int i = 0;
1184
+ i < isolate->serialize_partial_snapshot_cache_length();
1185
+ i++) {
1186
+ Object* entry = isolate->serialize_partial_snapshot_cache()[i];
1151
1187
  if (entry == heap_object) return i;
1152
1188
  }
1153
1189
 
1154
1190
  // We didn't find the object in the cache. So we add it to the cache and
1155
1191
  // then visit the pointer so that it becomes part of the startup snapshot
1156
1192
  // and we can refer to it from the partial snapshot.
1157
- int length = partial_snapshot_cache_length_;
1158
- CHECK(length < kPartialSnapshotCacheCapacity);
1159
- partial_snapshot_cache_[length] = heap_object;
1160
- startup_serializer_->VisitPointer(&partial_snapshot_cache_[length]);
1193
+ int length = isolate->serialize_partial_snapshot_cache_length();
1194
+ CHECK(length < Isolate::kPartialSnapshotCacheCapacity);
1195
+ isolate->serialize_partial_snapshot_cache()[length] = heap_object;
1196
+ startup_serializer_->VisitPointer(
1197
+ &isolate->serialize_partial_snapshot_cache()[length]);
1161
1198
  // We don't recurse from the startup snapshot generator into the partial
1162
1199
  // snapshot generator.
1163
- ASSERT(length == partial_snapshot_cache_length_);
1164
- return partial_snapshot_cache_length_++;
1200
+ ASSERT(length == isolate->serialize_partial_snapshot_cache_length());
1201
+ isolate->set_serialize_partial_snapshot_cache_length(length + 1);
1202
+ return length;
1165
1203
  }
1166
1204
 
1167
1205
 
1168
1206
  int PartialSerializer::RootIndex(HeapObject* heap_object) {
1169
1207
  for (int i = 0; i < Heap::kRootListLength; i++) {
1170
- Object* root = Heap::roots_address()[i];
1208
+ Object* root = HEAP->roots_address()[i];
1171
1209
  if (root == heap_object) return i;
1172
1210
  }
1173
1211
  return kInvalidRootIndex;
@@ -1250,13 +1288,13 @@ void StartupSerializer::SerializeObject(
1250
1288
 
1251
1289
 
1252
1290
  void StartupSerializer::SerializeWeakReferences() {
1253
- for (int i = partial_snapshot_cache_length_;
1254
- i < kPartialSnapshotCacheCapacity;
1291
+ for (int i = Isolate::Current()->serialize_partial_snapshot_cache_length();
1292
+ i < Isolate::kPartialSnapshotCacheCapacity;
1255
1293
  i++) {
1256
1294
  sink_->Put(kRootArray + kPlain + kStartOfObject, "RootSerialization");
1257
1295
  sink_->PutInt(Heap::kUndefinedValueRootIndex, "root_index");
1258
1296
  }
1259
- Heap::IterateWeakRoots(this, VISIT_ALL);
1297
+ HEAP->IterateWeakRoots(this, VISIT_ALL);
1260
1298
  }
1261
1299
 
1262
1300
 
@@ -1317,7 +1355,8 @@ void Serializer::ObjectSerializer::Serialize() {
1317
1355
  "ObjectSerialization");
1318
1356
  sink_->PutInt(size >> kObjectAlignmentBits, "Size in words");
1319
1357
 
1320
- LOG(SnapshotPositionEvent(object_->address(), sink_->Position()));
1358
+ LOG(i::Isolate::Current(),
1359
+ SnapshotPositionEvent(object_->address(), sink_->Position()));
1321
1360
 
1322
1361
  // Mark this object as already serialized.
1323
1362
  bool start_new_page;
@@ -1418,7 +1457,7 @@ void Serializer::ObjectSerializer::VisitExternalAsciiString(
1418
1457
  Address references_start = reinterpret_cast<Address>(resource_pointer);
1419
1458
  OutputRawData(references_start);
1420
1459
  for (int i = 0; i < Natives::GetBuiltinsCount(); i++) {
1421
- Object* source = Heap::natives_source_cache()->get(i);
1460
+ Object* source = HEAP->natives_source_cache()->get(i);
1422
1461
  if (!source->IsUndefined()) {
1423
1462
  ExternalAsciiString* string = ExternalAsciiString::cast(source);
1424
1463
  typedef v8::String::ExternalAsciiStringResource Resource;
@@ -1468,7 +1507,7 @@ void Serializer::ObjectSerializer::OutputRawData(Address up_to) {
1468
1507
  int Serializer::SpaceOfObject(HeapObject* object) {
1469
1508
  for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
1470
1509
  AllocationSpace s = static_cast<AllocationSpace>(i);
1471
- if (Heap::InSpace(object, s)) {
1510
+ if (HEAP->InSpace(object, s)) {
1472
1511
  if (i == LO_SPACE) {
1473
1512
  if (object->IsCode()) {
1474
1513
  return kLargeCode;
@@ -1489,7 +1528,7 @@ int Serializer::SpaceOfObject(HeapObject* object) {
1489
1528
  int Serializer::SpaceOfAlreadySerializedObject(HeapObject* object) {
1490
1529
  for (int i = FIRST_SPACE; i <= LAST_SPACE; i++) {
1491
1530
  AllocationSpace s = static_cast<AllocationSpace>(i);
1492
- if (Heap::InSpace(object, s)) {
1531
+ if (HEAP->InSpace(object, s)) {
1493
1532
  return i;
1494
1533
  }
1495
1534
  }