1 -- Copyright 2011 the V8 project authors. All rights reserved. 2 -- Redistribution and use in source and binary forms, with or without 3 -- modification, are permitted provided that the following conditions are 4 -- met: 5 -- 6 -- * Redistributions of source code must retain the above copyright 7 -- notice, this list of conditions and the following disclaimer. 8 -- * Redistributions in binary form must reproduce the above 9 -- copyright notice, this list of conditions and the following 10 -- disclaimer in the documentation and/or other materials provided 11 -- with the distribution. 12 -- * Neither the name of Google Inc. nor the names of its 13 -- contributors may be used to endorse or promote products derived 14 -- from this software without specific prior written permission. 15 -- 16 -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 -- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 -- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 -- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 -- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 -- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 -- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 -- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 -- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 -- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 -- This is an auxiliary tool that reads gccauses file generated by 29 -- gcmole.lua and prints tree of the calls that can potentially cause a GC 30 -- inside a given function. 31 -- 32 -- Usage: lua tools/gcmole/gccause.lua <function-name-pattern> 33 -- 34 35 assert(loadfile "gccauses")() 36 37 local P = ... 38 39 local T = {} 40 41 local function TrackCause(name, lvl) 42 io.write((" "):rep(lvl or 0), name, "\n") 43 if GC[name] then 44 local causes = GC[name] 45 for i = 1, #causes do 46 local f = causes[i] 47 if not T[f] then 48 T[f] = true 49 TrackCause(f, (lvl or 0) + 1) 50 end 51 52 if f == '<GC>' then break end 53 end 54 end 55 end 56 57 for name, _ in pairs(GC) do 58 if name:match(P) then 59 T = {} 60 TrackCause(name) 61 end 62 end 63