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 35assert(loadfile "gccauses")() 36 37local P = ... 38 39local T = {} 40 41local 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 55end 56 57for name, _ in pairs(GC) do 58 if name:match(P) then 59 T = {} 60 TrackCause(name) 61 end 62end 63