Skip to content
Permalink
master
Go to file
 
 
Cannot retrieve contributors at this time
80 lines (67 sloc) 2.64 KB
"""
Helpers to see the refcount information of an object
"""
from llvmlite import ir
from numba.core import types, cgutils
from numba.core.extending import intrinsic
from numba.core.runtime.nrtdynmod import _meminfo_struct_type
@intrinsic
def dump_refcount(typingctx, obj):
"""Dump the refcount of an object to stdout.
Returns True if and only if object is reference-counted and NRT is enabled.
"""
def codegen(context, builder, signature, args):
[obj] = args
[ty] = signature.args
# A sequence of (type, meminfo)
meminfos = []
if context.enable_nrt:
tmp_mis = context.nrt.get_meminfos(builder, ty, obj)
meminfos.extend(tmp_mis)
if meminfos:
pyapi = context.get_python_api(builder)
gil_state = pyapi.gil_ensure()
pyapi.print_string("dump refct of {}".format(ty))
for ty, mi in meminfos:
miptr = builder.bitcast(mi, _meminfo_struct_type.as_pointer())
refctptr = cgutils.gep_inbounds(builder, miptr, 0, 0)
refct = builder.load(refctptr)
pyapi.print_string(" | {} refct=".format(ty))
# "%zu" is not portable. just truncate refcount to 32-bit.
# that's good enough for a debugging util.
refct_32bit = builder.trunc(refct, ir.IntType(32))
printed = cgutils.snprintf_stackbuffer(
builder, 30, "%d [%p]", refct_32bit, miptr
)
pyapi.sys_write_stdout(printed)
pyapi.print_string(";\n")
pyapi.gil_release(gil_state)
return cgutils.true_bit
else:
return cgutils.false_bit
sig = types.bool_(obj)
return sig, codegen
@intrinsic
def get_refcount(typingctx, obj):
"""Get the current refcount of an object.
FIXME: only handles the first object
"""
def codegen(context, builder, signature, args):
[obj] = args
[ty] = signature.args
# A sequence of (type, meminfo)
meminfos = []
if context.enable_nrt:
tmp_mis = context.nrt.get_meminfos(builder, ty, obj)
meminfos.extend(tmp_mis)
refcounts = []
if meminfos:
for ty, mi in meminfos:
miptr = builder.bitcast(mi, _meminfo_struct_type.as_pointer())
refctptr = cgutils.gep_inbounds(builder, miptr, 0, 0)
refct = builder.load(refctptr)
refct_32bit = builder.trunc(refct, ir.IntType(32))
refcounts.append(refct_32bit)
return refcounts[0]
sig = types.int32(obj)
return sig, codegen
You can’t perform that action at this time.