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
@@ -227,7 +227,7 @@ class EXPORT Debug {
227
227
  * Debug message callback function.
228
228
  *
229
229
  * \param message the debug message handler message object
230
-
230
+ *
231
231
  * A MessageHandler does not take possession of the message data,
232
232
  * and must not rely on the data persisting after the handler returns.
233
233
  */
@@ -253,25 +253,35 @@ class EXPORT Debug {
253
253
  static bool SetDebugEventListener(v8::Handle<v8::Object> that,
254
254
  Handle<Value> data = Handle<Value>());
255
255
 
256
- // Schedule a debugger break to happen when JavaScript code is run.
257
- static void DebugBreak();
256
+ // Schedule a debugger break to happen when JavaScript code is run
257
+ // in the given isolate. If no isolate is provided the default
258
+ // isolate is used.
259
+ static void DebugBreak(Isolate* isolate = NULL);
258
260
 
259
- // Remove scheduled debugger break if it has not happened yet.
260
- static void CancelDebugBreak();
261
+ // Remove scheduled debugger break in given isolate if it has not
262
+ // happened yet. If no isolate is provided the default isolate is
263
+ // used.
264
+ static void CancelDebugBreak(Isolate* isolate = NULL);
261
265
 
262
- // Break execution of JavaScript (this method can be invoked from a
263
- // non-VM thread) for further client command execution on a VM
264
- // thread. Client data is then passed in EventDetails to
265
- // EventCallback at the moment when the VM actually stops.
266
- static void DebugBreakForCommand(ClientData* data = NULL);
266
+ // Break execution of JavaScript in the given isolate (this method
267
+ // can be invoked from a non-VM thread) for further client command
268
+ // execution on a VM thread. Client data is then passed in
269
+ // EventDetails to EventCallback at the moment when the VM actually
270
+ // stops. If no isolate is provided the default isolate is used.
271
+ static void DebugBreakForCommand(ClientData* data = NULL,
272
+ Isolate* isolate = NULL);
267
273
 
268
274
  // Message based interface. The message protocol is JSON. NOTE the message
269
275
  // handler thread is not supported any more parameter must be false.
270
276
  static void SetMessageHandler(MessageHandler handler,
271
277
  bool message_handler_thread = false);
272
278
  static void SetMessageHandler2(MessageHandler2 handler);
279
+
280
+ // If no isolate is provided the default isolate is
281
+ // used.
273
282
  static void SendCommand(const uint16_t* command, int length,
274
- ClientData* client_data = NULL);
283
+ ClientData* client_data = NULL,
284
+ Isolate* isolate = NULL);
275
285
 
276
286
  // Dispatch interface.
277
287
  static void SetHostDispatchHandler(HostDispatchHandler handler,
@@ -73,7 +73,7 @@ class PreParserData {
73
73
  : data_(data), size_(size) { }
74
74
 
75
75
  // Create a PreParserData value where stack_overflow reports true.
76
- static PreParserData StackOverflow() { return PreParserData(NULL, 0); }
76
+ static PreParserData StackOverflow() { return PreParserData(0, NULL); }
77
77
  // Whether the pre-parser stopped due to a stack overflow.
78
78
  // If this is the case, size() and data() should not be used.
79
79
 
@@ -131,6 +131,16 @@ class V8EXPORT CpuProfile {
131
131
 
132
132
  /** Returns the root node of the top down call tree. */
133
133
  const CpuProfileNode* GetTopDownRoot() const;
134
+
135
+ /**
136
+ * Deletes the profile and removes it from CpuProfiler's list.
137
+ * All pointers to nodes previously returned become invalid.
138
+ * Profiles with the same uid but obtained using different
139
+ * security token are not deleted, but become inaccessible
140
+ * using FindProfile method. It is embedder's responsibility
141
+ * to call Delete on these profiles.
142
+ */
143
+ void Delete();
134
144
  };
135
145
 
136
146
 
@@ -181,6 +191,13 @@ class V8EXPORT CpuProfiler {
181
191
  static const CpuProfile* StopProfiling(
182
192
  Handle<String> title,
183
193
  Handle<Value> security_token = Handle<Value>());
194
+
195
+ /**
196
+ * Deletes all existing profiles, also cancelling all profiling
197
+ * activity. All previously returned pointers to profiles and their
198
+ * contents become invalid after this call.
199
+ */
200
+ static void DeleteAllProfiles();
184
201
  };
185
202
 
186
203
 
@@ -223,36 +240,21 @@ class V8EXPORT HeapGraphEdge {
223
240
  };
224
241
 
225
242
 
226
- class V8EXPORT HeapGraphPath {
227
- public:
228
- /** Returns the number of edges in the path. */
229
- int GetEdgesCount() const;
230
-
231
- /** Returns an edge from the path. */
232
- const HeapGraphEdge* GetEdge(int index) const;
233
-
234
- /** Returns origin node. */
235
- const HeapGraphNode* GetFromNode() const;
236
-
237
- /** Returns destination node. */
238
- const HeapGraphNode* GetToNode() const;
239
- };
240
-
241
-
242
243
  /**
243
244
  * HeapGraphNode represents a node in a heap graph.
244
245
  */
245
246
  class V8EXPORT HeapGraphNode {
246
247
  public:
247
248
  enum Type {
248
- kHidden = 0, // Hidden node, may be filtered when shown to user.
249
- kArray = 1, // An array of elements.
250
- kString = 2, // A string.
251
- kObject = 3, // A JS object (except for arrays and strings).
252
- kCode = 4, // Compiled code.
253
- kClosure = 5, // Function closure.
254
- kRegExp = 6, // RegExp.
255
- kHeapNumber = 7 // Number stored in the heap.
249
+ kHidden = 0, // Hidden node, may be filtered when shown to user.
250
+ kArray = 1, // An array of elements.
251
+ kString = 2, // A string.
252
+ kObject = 3, // A JS object (except for arrays and strings).
253
+ kCode = 4, // Compiled code.
254
+ kClosure = 5, // Function closure.
255
+ kRegExp = 6, // RegExp.
256
+ kHeapNumber = 7, // Number stored in the heap.
257
+ kNative = 8 // Native object (not from V8 heap).
256
258
  };
257
259
 
258
260
  /** Returns node type (see HeapGraphNode::Type). */
@@ -307,12 +309,6 @@ class V8EXPORT HeapGraphNode {
307
309
  /** Returns a retainer by index. */
308
310
  const HeapGraphEdge* GetRetainer(int index) const;
309
311
 
310
- /** Returns the number of simple retaining paths from the root to the node. */
311
- int GetRetainingPathsCount() const;
312
-
313
- /** Returns a retaining path by index. */
314
- const HeapGraphPath* GetRetainingPath(int index) const;
315
-
316
312
  /**
317
313
  * Returns a dominator node. This is the node that participates in every
318
314
  * path from the snapshot root to the current node.
@@ -321,16 +317,6 @@ class V8EXPORT HeapGraphNode {
321
317
  };
322
318
 
323
319
 
324
- class V8EXPORT HeapSnapshotsDiff {
325
- public:
326
- /** Returns the root node for added nodes. */
327
- const HeapGraphNode* GetAdditionsRoot() const;
328
-
329
- /** Returns the root node for deleted nodes. */
330
- const HeapGraphNode* GetDeletionsRoot() const;
331
- };
332
-
333
-
334
320
  /**
335
321
  * HeapSnapshots record the state of the JS heap at some moment.
336
322
  */
@@ -361,10 +347,11 @@ class V8EXPORT HeapSnapshot {
361
347
  const HeapGraphNode* GetNodeById(uint64_t id) const;
362
348
 
363
349
  /**
364
- * Returns a diff between this snapshot and another one. Only snapshots
365
- * of the same type can be compared.
350
+ * Deletes the snapshot and removes it from HeapProfiler's list.
351
+ * All pointers to nodes, edges and paths previously returned become
352
+ * invalid.
366
353
  */
367
- const HeapSnapshotsDiff* CompareWith(const HeapSnapshot* snapshot) const;
354
+ void Delete();
368
355
 
369
356
  /**
370
357
  * Prepare a serialized representation of the snapshot. The result
@@ -392,11 +379,22 @@ class V8EXPORT HeapSnapshot {
392
379
  };
393
380
 
394
381
 
382
+ class RetainedObjectInfo;
383
+
395
384
  /**
396
385
  * Interface for controlling heap profiling.
397
386
  */
398
387
  class V8EXPORT HeapProfiler {
399
388
  public:
389
+ /**
390
+ * Callback function invoked for obtaining RetainedObjectInfo for
391
+ * the given JavaScript wrapper object. It is prohibited to enter V8
392
+ * while the callback is running: only getters on the handle and
393
+ * GetPointerFromInternalField on the objects are allowed.
394
+ */
395
+ typedef RetainedObjectInfo* (*WrapperInfoCallback)
396
+ (uint16_t class_id, Handle<Value> wrapper);
397
+
400
398
  /** Returns the number of snapshots taken. */
401
399
  static int GetSnapshotsCount();
402
400
 
@@ -414,6 +412,87 @@ class V8EXPORT HeapProfiler {
414
412
  Handle<String> title,
415
413
  HeapSnapshot::Type type = HeapSnapshot::kFull,
416
414
  ActivityControl* control = NULL);
415
+
416
+ /**
417
+ * Deletes all snapshots taken. All previously returned pointers to
418
+ * snapshots and their contents become invalid after this call.
419
+ */
420
+ static void DeleteAllSnapshots();
421
+
422
+ /** Binds a callback to embedder's class ID. */
423
+ static void DefineWrapperClass(
424
+ uint16_t class_id,
425
+ WrapperInfoCallback callback);
426
+
427
+ /**
428
+ * Default value of persistent handle class ID. Must not be used to
429
+ * define a class. Can be used to reset a class of a persistent
430
+ * handle.
431
+ */
432
+ static const uint16_t kPersistentHandleNoClassId = 0;
433
+ };
434
+
435
+
436
+ /**
437
+ * Interface for providing information about embedder's objects
438
+ * held by global handles. This information is reported in two ways:
439
+ *
440
+ * 1. When calling AddObjectGroup, an embedder may pass
441
+ * RetainedObjectInfo instance describing the group. To collect
442
+ * this information while taking a heap snapshot, V8 calls GC
443
+ * prologue and epilogue callbacks.
444
+ *
445
+ * 2. When a heap snapshot is collected, V8 additionally
446
+ * requests RetainedObjectInfos for persistent handles that
447
+ * were not previously reported via AddObjectGroup.
448
+ *
449
+ * Thus, if an embedder wants to provide information about native
450
+ * objects for heap snapshots, he can do it in a GC prologue
451
+ * handler, and / or by assigning wrapper class ids in the following way:
452
+ *
453
+ * 1. Bind a callback to class id by calling DefineWrapperClass.
454
+ * 2. Call SetWrapperClassId on certain persistent handles.
455
+ *
456
+ * V8 takes ownership of RetainedObjectInfo instances passed to it and
457
+ * keeps them alive only during snapshot collection. Afterwards, they
458
+ * are freed by calling the Dispose class function.
459
+ */
460
+ class V8EXPORT RetainedObjectInfo { // NOLINT
461
+ public:
462
+ /** Called by V8 when it no longer needs an instance. */
463
+ virtual void Dispose() = 0;
464
+
465
+ /** Returns whether two instances are equivalent. */
466
+ virtual bool IsEquivalent(RetainedObjectInfo* other) = 0;
467
+
468
+ /**
469
+ * Returns hash value for the instance. Equivalent instances
470
+ * must have the same hash value.
471
+ */
472
+ virtual intptr_t GetHash() = 0;
473
+
474
+ /**
475
+ * Returns human-readable label. It must be a NUL-terminated UTF-8
476
+ * encoded string. V8 copies its contents during a call to GetLabel.
477
+ */
478
+ virtual const char* GetLabel() = 0;
479
+
480
+ /**
481
+ * Returns element count in case if a global handle retains
482
+ * a subgraph by holding one of its nodes.
483
+ */
484
+ virtual intptr_t GetElementCount() { return -1; }
485
+
486
+ /** Returns embedder's object size in bytes. */
487
+ virtual intptr_t GetSizeInBytes() { return -1; }
488
+
489
+ protected:
490
+ RetainedObjectInfo() {}
491
+ virtual ~RetainedObjectInfo() {}
492
+
493
+ private:
494
+ RetainedObjectInfo(const RetainedObjectInfo&);
495
+ RetainedObjectInfo& operator=(const RetainedObjectInfo&);
417
496
  };
418
497
 
419
498
 
@@ -87,6 +87,11 @@ class V8EXPORT Testing {
87
87
  * should be between 0 and one less than the result from GetStressRuns()
88
88
  */
89
89
  static void PrepareStressRun(int run);
90
+
91
+ /**
92
+ * Force deoptimization of all functions.
93
+ */
94
+ static void DeoptimizeAll();
90
95
  };
91
96
 
92
97
 
@@ -110,7 +110,8 @@ namespace internal {
110
110
  class Arguments;
111
111
  class Object;
112
112
  class Heap;
113
- class Top;
113
+ class HeapObject;
114
+ class Isolate;
114
115
  }
115
116
 
116
117
 
@@ -396,6 +397,12 @@ template <class T> class Persistent : public Handle<T> {
396
397
  */
397
398
  inline bool IsWeak() const;
398
399
 
400
+ /**
401
+ * Assigns a wrapper class ID to the handle. See RetainedObjectInfo
402
+ * interface description in v8-profiler.h for details.
403
+ */
404
+ inline void SetWrapperClassId(uint16_t class_id);
405
+
399
406
  private:
400
407
  friend class ImplementationUtilities;
401
408
  friend class ObjectTemplate;
@@ -437,6 +444,8 @@ class V8EXPORT HandleScope {
437
444
  * Creates a new handle with the given value.
438
445
  */
439
446
  static internal::Object** CreateHandle(internal::Object* value);
447
+ // Faster version, uses HeapObject to obtain the current Isolate.
448
+ static internal::Object** CreateHandle(internal::HeapObject* value);
440
449
 
441
450
  private:
442
451
  // Make it impossible to create heap-allocated or illegal handle
@@ -453,7 +462,6 @@ class V8EXPORT HandleScope {
453
462
  internal::Object** next;
454
463
  internal::Object** limit;
455
464
  int level;
456
-
457
465
  inline void Initialize() {
458
466
  next = limit = NULL;
459
467
  level = 0;
@@ -462,6 +470,7 @@ class V8EXPORT HandleScope {
462
470
 
463
471
  void Leave();
464
472
 
473
+ internal::Isolate* isolate_;
465
474
  internal::Object** prev_next_;
466
475
  internal::Object** prev_limit_;
467
476
 
@@ -1435,7 +1444,8 @@ enum ExternalArrayType {
1435
1444
  kExternalUnsignedShortArray,
1436
1445
  kExternalIntArray,
1437
1446
  kExternalUnsignedIntArray,
1438
- kExternalFloatArray
1447
+ kExternalFloatArray,
1448
+ kExternalPixelArray
1439
1449
  };
1440
1450
 
1441
1451
  /**
@@ -1642,6 +1652,11 @@ class Object : public Value {
1642
1652
  */
1643
1653
  V8EXPORT Local<Object> Clone();
1644
1654
 
1655
+ /**
1656
+ * Returns the context in which the object was created.
1657
+ */
1658
+ V8EXPORT Local<Context> CreationContext();
1659
+
1645
1660
  /**
1646
1661
  * Set the backing store of the indexed properties to be managed by the
1647
1662
  * embedding layer. Access to the indexed properties will follow the rules
@@ -1699,7 +1714,12 @@ class Array : public Object {
1699
1714
  */
1700
1715
  V8EXPORT Local<Object> CloneElementAt(uint32_t index);
1701
1716
 
1717
+ /**
1718
+ * Creates a JavaScript array with the given length. If the length
1719
+ * is negative the returned array will have length 0.
1720
+ */
1702
1721
  V8EXPORT static Local<Array> New(int length = 0);
1722
+
1703
1723
  static inline Array* Cast(Value* obj);
1704
1724
  private:
1705
1725
  V8EXPORT Array();
@@ -2533,6 +2553,92 @@ class V8EXPORT HeapStatistics {
2533
2553
  };
2534
2554
 
2535
2555
 
2556
+ class RetainedObjectInfo;
2557
+
2558
+ /**
2559
+ * Isolate represents an isolated instance of the V8 engine. V8
2560
+ * isolates have completely separate states. Objects from one isolate
2561
+ * must not be used in other isolates. When V8 is initialized a
2562
+ * default isolate is implicitly created and entered. The embedder
2563
+ * can create additional isolates and use them in parallel in multiple
2564
+ * threads. An isolate can be entered by at most one thread at any
2565
+ * given time. The Locker/Unlocker API can be used to synchronize.
2566
+ */
2567
+ class V8EXPORT Isolate {
2568
+ public:
2569
+ /**
2570
+ * Stack-allocated class which sets the isolate for all operations
2571
+ * executed within a local scope.
2572
+ */
2573
+ class V8EXPORT Scope {
2574
+ public:
2575
+ explicit Scope(Isolate* isolate) : isolate_(isolate) {
2576
+ isolate->Enter();
2577
+ }
2578
+
2579
+ ~Scope() { isolate_->Exit(); }
2580
+
2581
+ private:
2582
+ Isolate* const isolate_;
2583
+
2584
+ // Prevent copying of Scope objects.
2585
+ Scope(const Scope&);
2586
+ Scope& operator=(const Scope&);
2587
+ };
2588
+
2589
+ /**
2590
+ * Creates a new isolate. Does not change the currently entered
2591
+ * isolate.
2592
+ *
2593
+ * When an isolate is no longer used its resources should be freed
2594
+ * by calling Dispose(). Using the delete operator is not allowed.
2595
+ */
2596
+ static Isolate* New();
2597
+
2598
+ /**
2599
+ * Returns the entered isolate for the current thread or NULL in
2600
+ * case there is no current isolate.
2601
+ */
2602
+ static Isolate* GetCurrent();
2603
+
2604
+ /**
2605
+ * Methods below this point require holding a lock (using Locker) in
2606
+ * a multi-threaded environment.
2607
+ */
2608
+
2609
+ /**
2610
+ * Sets this isolate as the entered one for the current thread.
2611
+ * Saves the previously entered one (if any), so that it can be
2612
+ * restored when exiting. Re-entering an isolate is allowed.
2613
+ */
2614
+ void Enter();
2615
+
2616
+ /**
2617
+ * Exits this isolate by restoring the previously entered one in the
2618
+ * current thread. The isolate may still stay the same, if it was
2619
+ * entered more than once.
2620
+ *
2621
+ * Requires: this == Isolate::GetCurrent().
2622
+ */
2623
+ void Exit();
2624
+
2625
+ /**
2626
+ * Disposes the isolate. The isolate must not be entered by any
2627
+ * thread to be disposable.
2628
+ */
2629
+ void Dispose();
2630
+
2631
+ private:
2632
+
2633
+ Isolate();
2634
+ Isolate(const Isolate&);
2635
+ ~Isolate();
2636
+ Isolate& operator=(const Isolate&);
2637
+ void* operator new(size_t size);
2638
+ void operator delete(void*, size_t);
2639
+ };
2640
+
2641
+
2536
2642
  /**
2537
2643
  * Container class for static utility functions.
2538
2644
  */
@@ -2702,8 +2808,22 @@ class V8EXPORT V8 {
2702
2808
  * intended to be used in the before-garbage-collection callback
2703
2809
  * function, for instance to simulate DOM tree connections among JS
2704
2810
  * wrapper objects.
2811
+ * See v8-profiler.h for RetainedObjectInfo interface description.
2812
+ */
2813
+ static void AddObjectGroup(Persistent<Value>* objects,
2814
+ size_t length,
2815
+ RetainedObjectInfo* info = NULL);
2816
+
2817
+ /**
2818
+ * Allows the host application to declare implicit references between
2819
+ * the objects: if |parent| is alive, all |children| are alive too.
2820
+ * After each garbage collection, all implicit references
2821
+ * are removed. It is intended to be used in the before-garbage-collection
2822
+ * callback function.
2705
2823
  */
2706
- static void AddObjectGroup(Persistent<Value>* objects, size_t length);
2824
+ static void AddImplicitReferences(Persistent<Object> parent,
2825
+ Persistent<Value>* children,
2826
+ size_t length);
2707
2827
 
2708
2828
  /**
2709
2829
  * Initializes from snapshot if possible. Otherwise, attempts to
@@ -2844,12 +2964,16 @@ class V8EXPORT V8 {
2844
2964
  static void TerminateExecution(int thread_id);
2845
2965
 
2846
2966
  /**
2847
- * Forcefully terminate the current thread of JavaScript execution.
2967
+ * Forcefully terminate the current thread of JavaScript execution
2968
+ * in the given isolate. If no isolate is provided, the default
2969
+ * isolate is used.
2848
2970
  *
2849
2971
  * This method can be used by any thread even if that thread has not
2850
2972
  * acquired the V8 lock with a Locker object.
2973
+ *
2974
+ * \param isolate The isolate in which to terminate the current JS execution.
2851
2975
  */
2852
- static void TerminateExecution();
2976
+ static void TerminateExecution(Isolate* isolate = NULL);
2853
2977
 
2854
2978
  /**
2855
2979
  * Is V8 terminating JavaScript execution.
@@ -2912,6 +3036,8 @@ class V8EXPORT V8 {
2912
3036
  static void ClearWeak(internal::Object** global_handle);
2913
3037
  static bool IsGlobalNearDeath(internal::Object** global_handle);
2914
3038
  static bool IsGlobalWeak(internal::Object** global_handle);
3039
+ static void SetWrapperClassId(internal::Object** global_handle,
3040
+ uint16_t class_id);
2915
3041
 
2916
3042
  template <class T> friend class Handle;
2917
3043
  template <class T> friend class Local;
@@ -3025,7 +3151,7 @@ class V8EXPORT TryCatch {
3025
3151
  bool capture_message_ : 1;
3026
3152
  bool rethrow_ : 1;
3027
3153
 
3028
- friend class v8::internal::Top;
3154
+ friend class v8::internal::Isolate;
3029
3155
  };
3030
3156
 
3031
3157
 
@@ -3188,15 +3314,26 @@ class V8EXPORT Context {
3188
3314
 
3189
3315
  /**
3190
3316
  * Multiple threads in V8 are allowed, but only one thread at a time
3191
- * is allowed to use V8. The definition of 'using V8' includes
3192
- * accessing handles or holding onto object pointers obtained from V8
3193
- * handles. It is up to the user of V8 to ensure (perhaps with
3194
- * locking) that this constraint is not violated.
3317
+ * is allowed to use any given V8 isolate. See Isolate class
3318
+ * comments. The definition of 'using V8 isolate' includes
3319
+ * accessing handles or holding onto object pointers obtained
3320
+ * from V8 handles while in the particular V8 isolate. It is up
3321
+ * to the user of V8 to ensure (perhaps with locking) that this
3322
+ * constraint is not violated.
3323
+ *
3324
+ * More then one thread and multiple V8 isolates can be used
3325
+ * without any locking if each isolate is created and accessed
3326
+ * by a single thread only. For example, one thread can use
3327
+ * multiple isolates or multiple threads can each create and run
3328
+ * their own isolate.
3195
3329
  *
3196
- * If you wish to start using V8 in a thread you can do this by constructing
3197
- * a v8::Locker object. After the code using V8 has completed for the
3198
- * current thread you can call the destructor. This can be combined
3199
- * with C++ scope-based construction as follows:
3330
+ * If you wish to start using V8 isolate in more then one thread
3331
+ * you can do this by constructing a v8::Locker object to guard
3332
+ * access to the isolate. After the code using V8 has completed
3333
+ * for the current thread you can call the destructor. This can
3334
+ * be combined with C++ scope-based construction as follows
3335
+ * (assumes the default isolate that is used if not specified as
3336
+ * a parameter for the Locker):
3200
3337
  *
3201
3338
  * \code
3202
3339
  * ...
@@ -3438,7 +3575,7 @@ class Internals {
3438
3575
  // These values match non-compiler-dependent values defined within
3439
3576
  // the implementation of v8.
3440
3577
  static const int kHeapObjectMapOffset = 0;
3441
- static const int kMapInstanceTypeOffset = kApiPointerSize + kApiIntSize;
3578
+ static const int kMapInstanceTypeOffset = 1 * kApiPointerSize + kApiIntSize;
3442
3579
  static const int kStringResourceOffset =
3443
3580
  InternalConstants<kApiPointerSize>::kStringResourceOffset;
3444
3581
 
@@ -3495,6 +3632,14 @@ class Internals {
3495
3632
  uint8_t* addr = reinterpret_cast<uint8_t*>(ptr) + offset - kHeapObjectTag;
3496
3633
  return *reinterpret_cast<T*>(addr);
3497
3634
  }
3635
+
3636
+ static inline bool CanCastToHeapObject(void* o) { return false; }
3637
+ static inline bool CanCastToHeapObject(Context* o) { return true; }
3638
+ static inline bool CanCastToHeapObject(String* o) { return true; }
3639
+ static inline bool CanCastToHeapObject(Object* o) { return true; }
3640
+ static inline bool CanCastToHeapObject(Message* o) { return true; }
3641
+ static inline bool CanCastToHeapObject(StackTrace* o) { return true; }
3642
+ static inline bool CanCastToHeapObject(StackFrame* o) { return true; }
3498
3643
  };
3499
3644
 
3500
3645
  } // namespace internal
@@ -3511,7 +3656,12 @@ Local<T>::Local() : Handle<T>() { }
3511
3656
  template <class T>
3512
3657
  Local<T> Local<T>::New(Handle<T> that) {
3513
3658
  if (that.IsEmpty()) return Local<T>();
3514
- internal::Object** p = reinterpret_cast<internal::Object**>(*that);
3659
+ T* that_ptr = *that;
3660
+ internal::Object** p = reinterpret_cast<internal::Object**>(that_ptr);
3661
+ if (internal::Internals::CanCastToHeapObject(that_ptr)) {
3662
+ return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(
3663
+ reinterpret_cast<internal::HeapObject*>(*p))));
3664
+ }
3515
3665
  return Local<T>(reinterpret_cast<T*>(HandleScope::CreateHandle(*p)));
3516
3666
  }
3517
3667
 
@@ -3560,6 +3710,10 @@ void Persistent<T>::ClearWeak() {
3560
3710
  V8::ClearWeak(reinterpret_cast<internal::Object**>(**this));
3561
3711
  }
3562
3712
 
3713
+ template <class T>
3714
+ void Persistent<T>::SetWrapperClassId(uint16_t class_id) {
3715
+ V8::SetWrapperClassId(reinterpret_cast<internal::Object**>(**this), class_id);
3716
+ }
3563
3717
 
3564
3718
  Arguments::Arguments(internal::Object** implicit_args,
3565
3719
  internal::Object** values, int length,