code: def _get_row_kernel(frame, func, args):
      row_type = _get_frame_row_type(
          np.dtype(list(_all_dtypes_from_frame(frame).items()))
      )
      scalar_return_type = _get_udf_return_type(row_type, func, args)
      # this is the signature for the final full kernel compilation
      sig = _construct_signature(frame, scalar_return_type, args)
      # this row type is used within the kernel to pack up the column and
      # mask data into the dict like data structure the user udf expects
      np_field_types = np.dtype(
          list(_supported_dtypes_from_frame(frame).items())
      )
      row_type = _get_frame_row_type(np_field_types)
  
      # Dict of 'local' variables into which `_kernel` is defined
      global_exec_context = {
          "cuda": cuda,
          "Masked": Masked,
          "_mask_get": _mask_get,
          "pack_return": pack_return,
          "row_type": row_type,
      }
      kernel_string = _row_kernel_string_from_template(
          frame, row_type, args
      )
      kernel = _get_kernel(
          kernel_string, global_exec_context, sig, func
      )
  
      return kernel, scalar_return_type
  
file_path: cudf/python/cudf/cudf/core/udf/row_function.py
imports: import math
  import numpy
  from numba import cuda
  from numba.np import numpy_support
  from cudf.core.udf.api import Masked, pack_return
  from cudf.core.udf.masked_typing import MaskedType
  from cudf.core.udf.strings_typing import string_view
  from cudf.core.udf.templates import masked_input_initializer_template, row_initializer_template, row_kernel_template, unmasked_input_initializer_template
  from cudf.core.udf.utils import Row, _all_dtypes_from_frame, _construct_signature, _get_extensionty_size, _get_kernel, _get_udf_return_type, _mask_get, _supported_cols_from_frame, _supported_dtypes_from_frame
label_desc: Use image node_id 3 for calling a global function with example usage: _get_row_kernel(frame, func, args) and returns: kernel,  scalar_return_type