Videre
This commit is contained in:
@@ -0,0 +1,82 @@
|
||||
"""
|
||||
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)
|
||||
Reference in New Issue
Block a user