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
@@ -42,7 +42,7 @@ class FuncNameInferrer;
42
42
  class ParserLog;
43
43
  class PositionStack;
44
44
  class Target;
45
- class TemporaryScope;
45
+ class LexicalScope;
46
46
 
47
47
  template <typename T> class ZoneListWrapper;
48
48
 
@@ -280,6 +280,9 @@ class RegExpBuilder: public ZoneObject {
280
280
  void FlushCharacters();
281
281
  void FlushText();
282
282
  void FlushTerms();
283
+ Zone* zone() { return zone_; }
284
+
285
+ Zone* zone_;
283
286
  bool pending_empty_;
284
287
  ZoneList<uc16>* characters_;
285
288
  BufferedZoneList<RegExpTree, 2> terms_;
@@ -388,6 +391,9 @@ class RegExpParser {
388
391
  int disjunction_capture_index_;
389
392
  };
390
393
 
394
+ Isolate* isolate() { return isolate_; }
395
+ Zone* zone() { return isolate_->zone(); }
396
+
391
397
  uc32 current() { return current_; }
392
398
  bool has_more() { return has_more_; }
393
399
  bool has_next() { return next_pos_ < in()->length(); }
@@ -395,6 +401,7 @@ class RegExpParser {
395
401
  FlatStringReader* in() { return in_; }
396
402
  void ScanForCaptures();
397
403
 
404
+ Isolate* isolate_;
398
405
  Handle<String>* error_;
399
406
  ZoneList<RegExpCapture*>* captures_;
400
407
  FlatStringReader* in_;
@@ -426,7 +433,7 @@ class Parser {
426
433
  bool in_global_context,
427
434
  StrictModeFlag strict_mode);
428
435
 
429
- FunctionLiteral* ParseLazy(Handle<SharedFunctionInfo> info);
436
+ FunctionLiteral* ParseLazy(CompilationInfo* info);
430
437
 
431
438
  void ReportMessageAt(Scanner::Location loc,
432
439
  const char* message,
@@ -441,7 +448,7 @@ class Parser {
441
448
  // construct a hashable id, so if more than 2^17 are allowed, this
442
449
  // should be checked.
443
450
  static const int kMaxNumFunctionParameters = 32766;
444
- FunctionLiteral* ParseLazy(Handle<SharedFunctionInfo> info,
451
+ FunctionLiteral* ParseLazy(CompilationInfo* info,
445
452
  UC16CharacterStream* source,
446
453
  ZoneScope* zone_scope);
447
454
  enum Mode {
@@ -449,6 +456,9 @@ class Parser {
449
456
  PARSE_EAGERLY
450
457
  };
451
458
 
459
+ Isolate* isolate() { return isolate_; }
460
+ Zone* zone() { return isolate_->zone(); }
461
+
452
462
  // Called by ParseProgram after setting up the scanner.
453
463
  FunctionLiteral* DoParseProgram(Handle<String> source,
454
464
  bool in_global_context,
@@ -465,6 +475,9 @@ class Parser {
465
475
  Mode mode() const { return mode_; }
466
476
  ScriptDataImpl* pre_data() const { return pre_data_; }
467
477
 
478
+ // Check if the given string is 'eval' or 'arguments'.
479
+ bool IsEvalOrArguments(Handle<String> string);
480
+
468
481
  // All ParseXXX functions take as the last argument an *ok parameter
469
482
  // which is set to false if parsing failed; it is unchanged otherwise.
470
483
  // By making the 'exception handling' explicit, we are forced to check
@@ -574,7 +587,7 @@ class Parser {
574
587
  if (stack_overflow_) {
575
588
  return Token::ILLEGAL;
576
589
  }
577
- if (StackLimitCheck().HasOverflowed()) {
590
+ if (StackLimitCheck(isolate()).HasOverflowed()) {
578
591
  // Any further calls to Next or peek will return the illegal token.
579
592
  // The current call must return the next token, which might already
580
593
  // have been peek'ed.
@@ -592,21 +605,21 @@ class Parser {
592
605
 
593
606
  Handle<String> LiteralString(PretenureFlag tenured) {
594
607
  if (scanner().is_literal_ascii()) {
595
- return Factory::NewStringFromAscii(scanner().literal_ascii_string(),
596
- tenured);
608
+ return isolate_->factory()->NewStringFromAscii(
609
+ scanner().literal_ascii_string(), tenured);
597
610
  } else {
598
- return Factory::NewStringFromTwoByte(scanner().literal_uc16_string(),
599
- tenured);
611
+ return isolate_->factory()->NewStringFromTwoByte(
612
+ scanner().literal_uc16_string(), tenured);
600
613
  }
601
614
  }
602
615
 
603
616
  Handle<String> NextLiteralString(PretenureFlag tenured) {
604
617
  if (scanner().is_next_literal_ascii()) {
605
- return Factory::NewStringFromAscii(scanner().next_literal_ascii_string(),
606
- tenured);
618
+ return isolate_->factory()->NewStringFromAscii(
619
+ scanner().next_literal_ascii_string(), tenured);
607
620
  } else {
608
- return Factory::NewStringFromTwoByte(scanner().next_literal_uc16_string(),
609
- tenured);
621
+ return isolate_->factory()->NewStringFromTwoByte(
622
+ scanner().next_literal_uc16_string(), tenured);
610
623
  }
611
624
  }
612
625
 
@@ -686,6 +699,7 @@ class Parser {
686
699
  Handle<String> type,
687
700
  Vector< Handle<Object> > arguments);
688
701
 
702
+ Isolate* isolate_;
689
703
  ZoneList<Handle<String> > symbol_cache_;
690
704
 
691
705
  Handle<Script> script_;
@@ -694,7 +708,7 @@ class Parser {
694
708
  Scope* top_scope_;
695
709
  int with_nesting_level_;
696
710
 
697
- TemporaryScope* temp_scope_;
711
+ LexicalScope* lexical_scope_;
698
712
  Mode mode_;
699
713
 
700
714
  Target* target_stack_; // for break, continue statements
@@ -709,6 +723,8 @@ class Parser {
709
723
  // Heuristically that means that the function will be called immediately,
710
724
  // so never lazily compile it.
711
725
  bool parenthesized_function_;
726
+
727
+ friend class LexicalScope;
712
728
  };
713
729
 
714
730
 
@@ -765,9 +781,13 @@ class JsonParser BASE_EMBEDDED {
765
781
  }
766
782
 
767
783
  private:
768
- JsonParser() { }
784
+ JsonParser()
785
+ : isolate_(Isolate::Current()),
786
+ scanner_(isolate_->scanner_constants()) { }
769
787
  ~JsonParser() { }
770
788
 
789
+ Isolate* isolate() { return isolate_; }
790
+
771
791
  // Parse a string containing a single JSON value.
772
792
  Handle<Object> ParseJson(Handle<String> script, UC16CharacterStream* source);
773
793
  // Parse a single JSON value from input (grammar production JSONValue).
@@ -794,6 +814,7 @@ class JsonParser BASE_EMBEDDED {
794
814
  // Converts the currently parsed literal to a JavaScript String.
795
815
  Handle<String> GetString();
796
816
 
817
+ Isolate* isolate_;
797
818
  JsonScanner scanner_;
798
819
  bool stack_overflow_;
799
820
  };
@@ -42,7 +42,6 @@
42
42
  #include "v8.h"
43
43
 
44
44
  #include "platform.h"
45
- #include "top.h"
46
45
  #include "v8threads.h"
47
46
  #include "vm-state-inl.h"
48
47
  #include "win32-headers.h"
@@ -59,6 +58,9 @@ double ceiling(double x) {
59
58
  }
60
59
 
61
60
 
61
+ static Mutex* limit_mutex = NULL;
62
+
63
+
62
64
  void OS::Setup() {
63
65
  // Seed the random number generator.
64
66
  // Convert the current time to a 64-bit integer first, before converting it
@@ -67,6 +69,7 @@ void OS::Setup() {
67
69
  // call this setup code within the same millisecond.
68
70
  uint64_t seed = static_cast<uint64_t>(TimeCurrentMillis());
69
71
  srandom(static_cast<unsigned int>(seed));
72
+ limit_mutex = CreateMutex();
70
73
  }
71
74
 
72
75
 
@@ -119,6 +122,9 @@ static void* highest_ever_allocated = reinterpret_cast<void*>(0);
119
122
 
120
123
 
121
124
  static void UpdateAllocatedSpaceLimits(void* address, int size) {
125
+ ASSERT(limit_mutex != NULL);
126
+ ScopedLock lock(limit_mutex);
127
+
122
128
  lowest_ever_allocated = Min(lowest_ever_allocated, address);
123
129
  highest_ever_allocated =
124
130
  Max(highest_ever_allocated,
@@ -143,7 +149,7 @@ void* OS::Allocate(const size_t requested,
143
149
  int prot = PROT_READ | PROT_WRITE | (is_executable ? PROT_EXEC : 0);
144
150
  void* mbase = mmap(NULL, msize, prot, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
145
151
  if (mbase == MAP_FAILED) {
146
- LOG(StringEvent("OS::Allocate", "mmap failed"));
152
+ LOG(ISOLATE, StringEvent("OS::Allocate", "mmap failed"));
147
153
  return NULL;
148
154
  }
149
155
  *allocated = msize;
@@ -254,6 +260,7 @@ void OS::LogSharedLibraryAddresses() {
254
260
  const int kLibNameLen = FILENAME_MAX + 1;
255
261
  char* lib_name = reinterpret_cast<char*>(malloc(kLibNameLen));
256
262
 
263
+ i::Isolate* isolate = ISOLATE;
257
264
  // This loop will terminate once the scanning hits an EOF.
258
265
  while (true) {
259
266
  uintptr_t start, end;
@@ -287,7 +294,7 @@ void OS::LogSharedLibraryAddresses() {
287
294
  snprintf(lib_name, kLibNameLen,
288
295
  "%08" V8PRIxPTR "-%08" V8PRIxPTR, start, end);
289
296
  }
290
- LOG(SharedLibraryEvent(lib_name, start, end));
297
+ LOG(isolate, SharedLibraryEvent(lib_name, start, end));
291
298
  } else {
292
299
  // Entry not describing executable data. Skip to end of line to setup
293
300
  // reading the next entry.
@@ -314,47 +321,44 @@ int OS::StackWalk(Vector<OS::StackFrame> frames) {
314
321
  }
315
322
 
316
323
 
317
- // Constants used for mmap.
318
- static const int kMmapFd = -1;
319
- static const int kMmapFdOffset = 0;
324
+ // The VirtualMemory implementation is taken from platform-win32.cc.
325
+ // The mmap-based virtual memory implementation as it is used on most posix
326
+ // platforms does not work well because Cygwin does not support MAP_FIXED.
327
+ // This causes VirtualMemory::Commit to not always commit the memory region
328
+ // specified.
329
+
330
+ bool VirtualMemory::IsReserved() {
331
+ return address_ != NULL;
332
+ }
320
333
 
321
334
 
322
335
  VirtualMemory::VirtualMemory(size_t size) {
323
- address_ = mmap(NULL, size, PROT_NONE,
324
- MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
325
- kMmapFd, kMmapFdOffset);
336
+ address_ = VirtualAlloc(NULL, size, MEM_RESERVE, PAGE_NOACCESS);
326
337
  size_ = size;
327
338
  }
328
339
 
329
340
 
330
341
  VirtualMemory::~VirtualMemory() {
331
342
  if (IsReserved()) {
332
- if (0 == munmap(address(), size())) address_ = MAP_FAILED;
343
+ if (0 == VirtualFree(address(), 0, MEM_RELEASE)) address_ = NULL;
333
344
  }
334
345
  }
335
346
 
336
347
 
337
- bool VirtualMemory::IsReserved() {
338
- return address_ != MAP_FAILED;
339
- }
340
-
341
-
342
348
  bool VirtualMemory::Commit(void* address, size_t size, bool is_executable) {
343
- int prot = PROT_READ | PROT_WRITE | (is_executable ? PROT_EXEC : 0);
344
-
345
- if (mprotect(address, size, prot) != 0) {
349
+ int prot = is_executable ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
350
+ if (NULL == VirtualAlloc(address, size, MEM_COMMIT, prot)) {
346
351
  return false;
347
352
  }
348
353
 
349
- UpdateAllocatedSpaceLimits(address, size);
354
+ UpdateAllocatedSpaceLimits(address, static_cast<int>(size));
350
355
  return true;
351
356
  }
352
357
 
353
358
 
354
359
  bool VirtualMemory::Uncommit(void* address, size_t size) {
355
- return mmap(address, size, PROT_NONE,
356
- MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE,
357
- kMmapFd, kMmapFdOffset) != MAP_FAILED;
360
+ ASSERT(IsReserved());
361
+ return VirtualFree(address, size, MEM_DECOMMIT) != false;
358
362
  }
359
363
 
360
364
 
@@ -400,12 +404,18 @@ bool ThreadHandle::IsValid() const {
400
404
  }
401
405
 
402
406
 
403
- Thread::Thread() : ThreadHandle(ThreadHandle::INVALID) {
404
- set_name("v8:<unknown>");
407
+ Thread::Thread(Isolate* isolate, const Options& options)
408
+ : ThreadHandle(ThreadHandle::INVALID),
409
+ isolate_(isolate),
410
+ stack_size_(options.stack_size) {
411
+ set_name(options.name);
405
412
  }
406
413
 
407
414
 
408
- Thread::Thread(const char* name) : ThreadHandle(ThreadHandle::INVALID) {
415
+ Thread::Thread(Isolate* isolate, const char* name)
416
+ : ThreadHandle(ThreadHandle::INVALID),
417
+ isolate_(isolate),
418
+ stack_size_(0) {
409
419
  set_name(name);
410
420
  }
411
421
 
@@ -421,6 +431,7 @@ static void* ThreadEntry(void* arg) {
421
431
  // one) so we initialize it here too.
422
432
  thread->thread_handle_data()->thread_ = pthread_self();
423
433
  ASSERT(thread->IsValid());
434
+ Thread::SetThreadLocal(Isolate::isolate_key(), thread->isolate());
424
435
  thread->Run();
425
436
  return NULL;
426
437
  }
@@ -433,7 +444,14 @@ void Thread::set_name(const char* name) {
433
444
 
434
445
 
435
446
  void Thread::Start() {
436
- pthread_create(&thread_handle_data()->thread_, NULL, ThreadEntry, this);
447
+ pthread_attr_t* attr_ptr = NULL;
448
+ pthread_attr_t attr;
449
+ if (stack_size_ > 0) {
450
+ pthread_attr_init(&attr);
451
+ pthread_attr_setstacksize(&attr, static_cast<size_t>(stack_size_));
452
+ attr_ptr = &attr;
453
+ }
454
+ pthread_create(&thread_handle_data()->thread_, attr_ptr, ThreadEntry, this);
437
455
  ASSERT(IsValid());
438
456
  }
439
457
 
@@ -617,128 +635,176 @@ Semaphore* OS::CreateSemaphore(int count) {
617
635
 
618
636
  class Sampler::PlatformData : public Malloced {
619
637
  public:
620
- explicit PlatformData(Sampler* sampler) {
621
- sampler_ = sampler;
622
- sampler_thread_ = INVALID_HANDLE_VALUE;
623
- profiled_thread_ = INVALID_HANDLE_VALUE;
638
+ // Get a handle to the calling thread. This is the thread that we are
639
+ // going to profile. We need to make a copy of the handle because we are
640
+ // going to use it in the sampler thread. Using GetThreadHandle() will
641
+ // not work in this case. We're using OpenThread because DuplicateHandle
642
+ // for some reason doesn't work in Chrome's sandbox.
643
+ PlatformData() : profiled_thread_(OpenThread(THREAD_GET_CONTEXT |
644
+ THREAD_SUSPEND_RESUME |
645
+ THREAD_QUERY_INFORMATION,
646
+ false,
647
+ GetCurrentThreadId())) {}
648
+
649
+ ~PlatformData() {
650
+ if (profiled_thread_ != NULL) {
651
+ CloseHandle(profiled_thread_);
652
+ profiled_thread_ = NULL;
653
+ }
624
654
  }
625
655
 
626
- Sampler* sampler_;
627
- HANDLE sampler_thread_;
656
+ HANDLE profiled_thread() { return profiled_thread_; }
657
+
658
+ private:
628
659
  HANDLE profiled_thread_;
629
- RuntimeProfilerRateLimiter rate_limiter_;
660
+ };
661
+
630
662
 
631
- // Sampler thread handler.
632
- void Runner() {
633
- while (sampler_->IsActive()) {
634
- if (rate_limiter_.SuspendIfNecessary()) continue;
635
- Sample();
636
- Sleep(sampler_->interval_);
663
+ class SamplerThread : public Thread {
664
+ public:
665
+ explicit SamplerThread(int interval)
666
+ : Thread(NULL, "SamplerThread"),
667
+ interval_(interval) {}
668
+
669
+ static void AddActiveSampler(Sampler* sampler) {
670
+ ScopedLock lock(mutex_);
671
+ SamplerRegistry::AddActiveSampler(sampler);
672
+ if (instance_ == NULL) {
673
+ instance_ = new SamplerThread(sampler->interval());
674
+ instance_->Start();
675
+ } else {
676
+ ASSERT(instance_->interval_ == sampler->interval());
637
677
  }
638
678
  }
639
679
 
640
- void Sample() {
641
- if (sampler_->IsProfiling()) {
642
- // Context used for sampling the register state of the profiled thread.
643
- CONTEXT context;
644
- memset(&context, 0, sizeof(context));
680
+ static void RemoveActiveSampler(Sampler* sampler) {
681
+ ScopedLock lock(mutex_);
682
+ SamplerRegistry::RemoveActiveSampler(sampler);
683
+ if (SamplerRegistry::GetState() == SamplerRegistry::HAS_NO_SAMPLERS) {
684
+ RuntimeProfiler::WakeUpRuntimeProfilerThreadBeforeShutdown();
685
+ instance_->Join();
686
+ delete instance_;
687
+ instance_ = NULL;
688
+ }
689
+ }
645
690
 
646
- TickSample sample_obj;
647
- TickSample* sample = CpuProfiler::TickSampleEvent();
648
- if (sample == NULL) sample = &sample_obj;
691
+ // Implement Thread::Run().
692
+ virtual void Run() {
693
+ SamplerRegistry::State state;
694
+ while ((state = SamplerRegistry::GetState()) !=
695
+ SamplerRegistry::HAS_NO_SAMPLERS) {
696
+ bool cpu_profiling_enabled =
697
+ (state == SamplerRegistry::HAS_CPU_PROFILING_SAMPLERS);
698
+ bool runtime_profiler_enabled = RuntimeProfiler::IsEnabled();
699
+ // When CPU profiling is enabled both JavaScript and C++ code is
700
+ // profiled. We must not suspend.
701
+ if (!cpu_profiling_enabled) {
702
+ if (rate_limiter_.SuspendIfNecessary()) continue;
703
+ }
704
+ if (cpu_profiling_enabled) {
705
+ if (!SamplerRegistry::IterateActiveSamplers(&DoCpuProfile, this)) {
706
+ return;
707
+ }
708
+ }
709
+ if (runtime_profiler_enabled) {
710
+ if (!SamplerRegistry::IterateActiveSamplers(&DoRuntimeProfile, NULL)) {
711
+ return;
712
+ }
713
+ }
714
+ OS::Sleep(interval_);
715
+ }
716
+ }
717
+
718
+ static void DoCpuProfile(Sampler* sampler, void* raw_sampler_thread) {
719
+ if (!sampler->isolate()->IsInitialized()) return;
720
+ if (!sampler->IsProfiling()) return;
721
+ SamplerThread* sampler_thread =
722
+ reinterpret_cast<SamplerThread*>(raw_sampler_thread);
723
+ sampler_thread->SampleContext(sampler);
724
+ }
725
+
726
+ static void DoRuntimeProfile(Sampler* sampler, void* ignored) {
727
+ if (!sampler->isolate()->IsInitialized()) return;
728
+ sampler->isolate()->runtime_profiler()->NotifyTick();
729
+ }
730
+
731
+ void SampleContext(Sampler* sampler) {
732
+ HANDLE profiled_thread = sampler->platform_data()->profiled_thread();
733
+ if (profiled_thread == NULL) return;
734
+
735
+ // Context used for sampling the register state of the profiled thread.
736
+ CONTEXT context;
737
+ memset(&context, 0, sizeof(context));
738
+
739
+ TickSample sample_obj;
740
+ TickSample* sample = CpuProfiler::TickSampleEvent(sampler->isolate());
741
+ if (sample == NULL) sample = &sample_obj;
649
742
 
650
- static const DWORD kSuspendFailed = static_cast<DWORD>(-1);
651
- if (SuspendThread(profiled_thread_) == kSuspendFailed) return;
652
- sample->state = Top::current_vm_state();
743
+ static const DWORD kSuspendFailed = static_cast<DWORD>(-1);
744
+ if (SuspendThread(profiled_thread) == kSuspendFailed) return;
745
+ sample->state = sampler->isolate()->current_vm_state();
653
746
 
654
- context.ContextFlags = CONTEXT_FULL;
655
- if (GetThreadContext(profiled_thread_, &context) != 0) {
747
+ context.ContextFlags = CONTEXT_FULL;
748
+ if (GetThreadContext(profiled_thread, &context) != 0) {
656
749
  #if V8_HOST_ARCH_X64
657
- sample->pc = reinterpret_cast<Address>(context.Rip);
658
- sample->sp = reinterpret_cast<Address>(context.Rsp);
659
- sample->fp = reinterpret_cast<Address>(context.Rbp);
750
+ sample->pc = reinterpret_cast<Address>(context.Rip);
751
+ sample->sp = reinterpret_cast<Address>(context.Rsp);
752
+ sample->fp = reinterpret_cast<Address>(context.Rbp);
660
753
  #else
661
- sample->pc = reinterpret_cast<Address>(context.Eip);
662
- sample->sp = reinterpret_cast<Address>(context.Esp);
663
- sample->fp = reinterpret_cast<Address>(context.Ebp);
754
+ sample->pc = reinterpret_cast<Address>(context.Eip);
755
+ sample->sp = reinterpret_cast<Address>(context.Esp);
756
+ sample->fp = reinterpret_cast<Address>(context.Ebp);
664
757
  #endif
665
- sampler_->SampleStack(sample);
666
- sampler_->Tick(sample);
667
- }
668
- ResumeThread(profiled_thread_);
758
+ sampler->SampleStack(sample);
759
+ sampler->Tick(sample);
669
760
  }
670
- if (RuntimeProfiler::IsEnabled()) RuntimeProfiler::NotifyTick();
761
+ ResumeThread(profiled_thread);
671
762
  }
763
+
764
+ const int interval_;
765
+ RuntimeProfilerRateLimiter rate_limiter_;
766
+
767
+ // Protects the process wide state below.
768
+ static Mutex* mutex_;
769
+ static SamplerThread* instance_;
770
+
771
+ DISALLOW_COPY_AND_ASSIGN(SamplerThread);
672
772
  };
673
773
 
674
774
 
675
- // Entry point for sampler thread.
676
- static DWORD __stdcall SamplerEntry(void* arg) {
677
- Sampler::PlatformData* data =
678
- reinterpret_cast<Sampler::PlatformData*>(arg);
679
- data->Runner();
680
- return 0;
681
- }
775
+ Mutex* SamplerThread::mutex_ = OS::CreateMutex();
776
+ SamplerThread* SamplerThread::instance_ = NULL;
682
777
 
683
778
 
684
- // Initialize a profile sampler.
685
- Sampler::Sampler(int interval)
686
- : interval_(interval),
779
+ Sampler::Sampler(Isolate* isolate, int interval)
780
+ : isolate_(isolate),
781
+ interval_(interval),
687
782
  profiling_(false),
688
783
  active_(false),
689
784
  samples_taken_(0) {
690
- data_ = new PlatformData(this);
785
+ data_ = new PlatformData;
691
786
  }
692
787
 
693
788
 
694
789
  Sampler::~Sampler() {
790
+ ASSERT(!IsActive());
695
791
  delete data_;
696
792
  }
697
793
 
698
794
 
699
- // Start profiling.
700
795
  void Sampler::Start() {
701
- // Do not start multiple threads for the same sampler.
702
796
  ASSERT(!IsActive());
703
-
704
- // Get a handle to the calling thread. This is the thread that we are
705
- // going to profile. We need to make a copy of the handle because we are
706
- // going to use it in the sampler thread. Using GetThreadHandle() will
707
- // not work in this case. We're using OpenThread because DuplicateHandle
708
- // for some reason doesn't work in Chrome's sandbox.
709
- data_->profiled_thread_ = OpenThread(THREAD_GET_CONTEXT |
710
- THREAD_SUSPEND_RESUME |
711
- THREAD_QUERY_INFORMATION,
712
- false,
713
- GetCurrentThreadId());
714
- BOOL ok = data_->profiled_thread_ != NULL;
715
- if (!ok) return;
716
-
717
- // Start sampler thread.
718
- DWORD tid;
719
797
  SetActive(true);
720
- data_->sampler_thread_ = CreateThread(NULL, 0, SamplerEntry, data_, 0, &tid);
721
- // Set thread to high priority to increase sampling accuracy.
722
- SetThreadPriority(data_->sampler_thread_, THREAD_PRIORITY_TIME_CRITICAL);
798
+ SamplerThread::AddActiveSampler(this);
723
799
  }
724
800
 
725
801
 
726
- // Stop profiling.
727
802
  void Sampler::Stop() {
728
- // Seting active to false triggers termination of the sampler
729
- // thread.
803
+ ASSERT(IsActive());
804
+ SamplerThread::RemoveActiveSampler(this);
730
805
  SetActive(false);
731
-
732
- // Wait for sampler thread to terminate.
733
- Top::WakeUpRuntimeProfilerThreadBeforeShutdown();
734
- WaitForSingleObject(data_->sampler_thread_, INFINITE);
735
-
736
- // Release the thread handles
737
- CloseHandle(data_->sampler_thread_);
738
- CloseHandle(data_->profiled_thread_);
739
806
  }
740
807
 
741
-
742
808
  #endif // ENABLE_LOGGING_AND_PROFILING
743
809
 
744
810
  } } // namespace v8::internal