Index: tools/gcmole/gccause.lua |
diff --git a/tools/gcmole/gccause.lua b/tools/gcmole/gccause.lua |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a6fe5421374a6b4acfc61045cc2a03d493bb404d |
--- /dev/null |
+++ b/tools/gcmole/gccause.lua |
@@ -0,0 +1,60 @@ |
+-- Copyright 2011 the V8 project authors. All rights reserved. |
+-- Redistribution and use in source and binary forms, with or without |
+-- modification, are permitted provided that the following conditions are |
+-- met: |
+-- |
+-- * Redistributions of source code must retain the above copyright |
+-- notice, this list of conditions and the following disclaimer. |
+-- * Redistributions in binary form must reproduce the above |
+-- copyright notice, this list of conditions and the following |
+-- disclaimer in the documentation and/or other materials provided |
+-- with the distribution. |
+-- * Neither the name of Google Inc. nor the names of its |
+-- contributors may be used to endorse or promote products derived |
+-- from this software without specific prior written permission. |
+-- |
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+-- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ |
+-- This is an auxiliary tool that reads gccauses file generated by |
+-- gcmole.lua and prints tree of the calls that can potentially cause a GC |
+-- inside a given function. |
+-- |
+-- Usage: lua tools/gcmole/gccause.lua <function-name-pattern> |
+-- |
+ |
+assert(loadfile "gccauses")() |
+ |
+local P = ... |
+ |
+local T = {} |
+ |
+local function TrackCause(name, lvl) |
+ io.write((" "):rep(lvl or 0), name, "\n") |
+ if GC[name] then |
+ local causes = GC[name] |
+ for i = 1, #causes do |
+ local f = causes[i] |
+ if not T[f] then |
+ T[f] = true |
+ TrackCause(f, (lvl or 0) + 1) |
+ end |
+ end |
+ end |
+end |
+ |
+for name, _ in pairs(GC) do |
+ if name:match(P) then |
+ T = {} |
+ TrackCause(name) |
+ end |
+end |