'Note: Maybe called multiple times when lowering a function'

def __init__(self, context, builder):

    from numba.targets import boxing
    self.context = context
    self.builder = builder
    self.module = builder.basic_block.function.module
    try:
        self.module.__serialized
    except AttributeError:
        self.module.__serialized = {}
    self.pyobj = self.context.get_argument_type(types.pyobject)
    self.pyobjptr = self.pyobj.as_pointer()
    self.voidptr = Type.pointer(Type.int(8))
    self.long = Type.int((ctypes.sizeof(ctypes.c_long) * 8))
    self.ulong = self.long
    self.longlong = Type.int((ctypes.sizeof(ctypes.c_ulonglong) * 8))
    self.ulonglong = self.longlong
    self.double = Type.double()
    self.py_ssize_t = self.context.get_value_type(types.intp)
    self.cstring = Type.pointer(Type.int(8))
    self.gil_state = Type.int((_helperlib.py_gil_state_size * 8))
    self.py_buffer_t = ir.ArrayType(ir.IntType(8), _helperlib.py_buffer_size)
    if (PYVERSION >= (3, 0)):
        self.py_hash_t = self.py_ssize_t
    else:
        self.py_hash_t = self.long
