#!/usr/bin/python
import sys
import gc

# import guppy-pe heapy
# go to below link for svn co the source, be instructed to build/install it
# http://guppy-pe.sourceforge.net 
heapy = None
try:
    from guppy import hpy
    heapy = hpy()
except ImportError:
    print "fail to import heapy"
    pass

def initHeapProfiling():
    if True:
        gc.collect(2)
        gc.collect(1)
        gc.collect(0)
    if heapy:
        heapy.setref()

# refer to below links for api reference
# http://guppy-pe.sourceforge.net/guppy.html
# http://www.pkgcore.org/trac/pkgcore/doc/dev-notes/heapy.rst
def profileHeap():
    if heapy:
        oneheap = heapy.heap()
        print oneheap
        #print dir( oneheap)
        for i in range(0, len(oneheap)):
            print "=============%d=============" % i
            if hasattr(oneheap[i], 'byid') and oneheap[i].byid:
                print "--------------------------------"
                print oneheap[i].byid
                for j in range(0, len(oneheap[i])):
                    print "--------------%d------------------" % j
                    print oneheap[i].byid[j].theone
            #print "+++++++++++++++++++++++++++++++++++"
            #if hasattr(oneheap[i], 'byvia') and oneheap[i].byvia:
            #    print "--------------------------------"
            #    print oneheap[i].byvia
            #    for j in range(0, len(oneheap[i].byvia)):
            #        print "--------------%d------------------" % j
            #        print oneheap[i].byvia[j]
        heapy.setref()


def f (a, b):
    print a
    print b

def g (a= "a", b="b"):
    print a
    print b

def h (*params):
    print str(params)

def i (**params):
    #memory leak either way
    # 1
    print params
    #2
    #pstr = str(params)
    #print pstr

def j (**params):
    for kv in params.iteritems():
        print kv[0], kv[1]

def k (**params):
    pass

def test1():
    params = ["a_value", "b_value"]
    f (*params)
    
def test2():
    params = { "a":"a_value", "b":"b_value" }
    g (*params)
    
def test3():
    params = ["a_value", "b_value"]
    h (*params)
    
def test4():
    params = { "a":"a_value", "b":"b_value" }
    i (**params)

def test5():
    params = { "a":"a_value", "b":"b_value" }
    j (**params)

def test6():
    params = { "a":"a_value", "b":"b_value" }
    k (**params)

#test4() has leak!!!!
def main(*blabla):
    initHeapProfiling()
    print ">>>>>>>>>>>>>>>>>>>>>>>>>TEST4"
    test4()
    profileHeap()
    print ">>>>>>>>>>>>>>>>>>>>>>>>>TEST5"
    test5()
    profileHeap()
    print ">>>>>>>>>>>>>>>>>>>>>>>>>TEST6"
    test6()
    profileHeap()

if __name__=='__main__':
    if len(sys.argv) > 1:
        main(sys.argv[1:])
    else:
        main()
