83 lines
2.4 KiB
Python
83 lines
2.4 KiB
Python
"""
|
|
This file implements print functionality for the CPU.
|
|
"""
|
|
from numba.core import types, typing, cgutils
|
|
from numba.core.imputils import Registry, impl_ret_untracked
|
|
|
|
registry = Registry('printimpl')
|
|
lower = registry.lower
|
|
|
|
|
|
# NOTE: the current implementation relies on CPython API even in
|
|
# nopython mode.
|
|
|
|
|
|
@lower("print_item", types.Literal)
|
|
def print_item_impl(context, builder, sig, args):
|
|
"""
|
|
Print a single constant value.
|
|
"""
|
|
ty, = sig.args
|
|
val = ty.literal_value
|
|
|
|
pyapi = context.get_python_api(builder)
|
|
|
|
strobj = pyapi.unserialize(pyapi.serialize_object(val))
|
|
pyapi.print_object(strobj)
|
|
pyapi.decref(strobj)
|
|
|
|
res = context.get_dummy_value()
|
|
return impl_ret_untracked(context, builder, sig.return_type, res)
|
|
|
|
|
|
@lower("print_item", types.Any)
|
|
def print_item_impl(context, builder, sig, args):
|
|
"""
|
|
Print a single native value by boxing it in a Python object and
|
|
invoking the Python interpreter's print routine.
|
|
"""
|
|
ty, = sig.args
|
|
val, = args
|
|
|
|
pyapi = context.get_python_api(builder)
|
|
env_manager = context.get_env_manager(builder)
|
|
|
|
if context.enable_nrt:
|
|
context.nrt.incref(builder, ty, val)
|
|
|
|
obj = pyapi.from_native_value(ty, val, env_manager)
|
|
with builder.if_else(cgutils.is_not_null(builder, obj), likely=True) as (if_ok, if_error):
|
|
with if_ok:
|
|
pyapi.print_object(obj)
|
|
pyapi.decref(obj)
|
|
with if_error:
|
|
cstr = context.insert_const_string(builder.module,
|
|
"the print() function")
|
|
strobj = pyapi.string_from_string(cstr)
|
|
pyapi.err_write_unraisable(strobj)
|
|
pyapi.decref(strobj)
|
|
|
|
res = context.get_dummy_value()
|
|
return impl_ret_untracked(context, builder, sig.return_type, res)
|
|
|
|
|
|
@lower(print, types.VarArg(types.Any))
|
|
def print_varargs_impl(context, builder, sig, args):
|
|
"""
|
|
A entire print() call.
|
|
"""
|
|
pyapi = context.get_python_api(builder)
|
|
gil = pyapi.gil_ensure()
|
|
|
|
for i, (argtype, argval) in enumerate(zip(sig.args, args)):
|
|
signature = typing.signature(types.none, argtype)
|
|
imp = context.get_function("print_item", signature)
|
|
imp(builder, [argval])
|
|
if i < len(args) - 1:
|
|
pyapi.print_string(' ')
|
|
pyapi.print_string('\n')
|
|
|
|
pyapi.gil_release(gil)
|
|
res = context.get_dummy_value()
|
|
return impl_ret_untracked(context, builder, sig.return_type, res)
|