Repository: numpy/numpy
File: numpy/_core/src/umath/ufunc_object.c (C)

Code before:
    else if (PyComplex_CheckExact(obj)) {
        Py_complex oop = PyComplex_AsCComplex(obj);
        if (error_converting(oop.real)) {
            return -1;  // should never happen; pass on it if does.
        }
        *(double *)in = oop.real;
        *(double *)(in+sizeof(double)) = oop.imag;
        dt = PyArray_DescrFromType(NPY_COMPLEX128);
    }
    else if (is_anyscalar_exact(obj)) {
        dt = PyArray_DescrFromScalar(obj);
        if (!PyDataType_ISNUMBER(dt)) {
            goto bail;
        }
        data[0] = scalar_value(obj, dt);
    }
    else {
        return -2;
    }
    /*
     * Check the ufunc supports our descriptor, bailing (return -2) if not.
     */
    // Try getting info from the (private) cache.  Fall back if not found,
    // so that the the dtype gets registered and things will work next time.
    PyArray_DTypeMeta *op_dtypes[2] = {NPY_DTYPE(dt), NULL};
    PyObject *info = PyArrayIdentityHash_GetItem(  // borrowed reference.
        (PyArrayIdentityHash *)ufunc->_dispatch_cache,
        (PyObject **)op_dtypes);
    if (info == NULL) {
        goto bail;
    }
    // Check actual dtype is correct (can be wrong with promotion).
    PyObject *all_dtypes = PyTuple_GET_ITEM(info, 0);
    if ((PyTuple_GET_ITEM(all_dtypes, 0) != (PyObject *)NPY_DTYPE(dt)) ||
        (PyTuple_GET_ITEM(all_dtypes, 1) != (PyObject *)NPY_DTYPE(dt))) {
        goto bail;
    }
    // Get method, balling if not an arraymethod (e.g., a promotor).
    PyArrayMethodObject *method = (PyArrayMethodObject *)PyTuple_GET_ITEM(info, 1);
    if (!PyObject_TypeCheck(method, &PyArrayMethod_Type)) {
        goto bail;
    }
    // Get loop, requiring that the output and input dtype are the same.
    PyArrayMethod_Context context;
    PyArray_Descr *descrs[2] = {dt, dt};
    NPY_context_init(&context, descrs);
    context.caller = (PyObject *)ufunc;
    context.method = method;
    npy_intp strides[2] = {0, 0};  // 0 ensures scalar math, not SIMD for half.
    PyArrayMethod_StridedLoop *strided_loop;
    NpyAuxData *auxdata = NULL;

Review comment (suggestion):
I suspect we may need locking here for free-threading.  (Maybe should change this to not use borrowed references to make it more robust about that.)

Code after:
    else if (PyComplex_CheckExact(obj)) {
        Py_complex oop = PyComplex_AsCComplex(obj);
        if (error_converting(oop.real)) {
            return -1;  // should never happen; pass on it if does.
        }
        *(double *)in = oop.real;
        *(double *)(in+sizeof(double)) = oop.imag;
        dt = PyArray_DescrFromType(NPY_COMPLEX128);
    }
    else if (is_anyscalar_exact(obj)) {
        dt = PyArray_DescrFromScalar(obj);
        if (!PyDataType_ISNUMBER(dt)) {
            goto bail;
        }
        data[0] = scalar_value(obj, dt);
    }
    else {
        return -2;
    }
    /*
     * Check the ufunc supports our descriptor, bailing (return -2) if not.
     */
    // Try getting info from the (private) cache.  Fall back if not found,
    // so that the the dtype gets registered and things will work next time.
    PyArray_DTypeMeta *op_dtypes[2] = {NPY_DTYPE(dt), NULL};
    PyObject *info = PyArrayIdentityHash_GetItem(  // borrowed reference.
        (PyArrayIdentityHash *)ufunc->_dispatch_cache,
        (PyObject **)op_dtypes);
    if (info == NULL) {
        goto bail;
    }
    // Check actual dtype is correct (can be wrong with promotion).
    PyObject *all_dtypes = PyTuple_GET_ITEM(info, 0);
    if ((PyTuple_GET_ITEM(all_dtypes, 0) != (PyObject *)NPY_DTYPE(dt)) ||
        (PyTuple_GET_ITEM(all_dtypes, 1) != (PyObject *)NPY_DTYPE(dt))) {
        goto bail;
    }
    // Get method, bailing if not an arraymethod (e.g., a promotor).
    PyArrayMethodObject *method = (PyArrayMethodObject *)PyTuple_GET_ITEM(info, 1);
    if (!PyObject_TypeCheck(method, &PyArrayMethod_Type)) {
        goto bail;
    }
    // Get loop, requiring that the output and input dtype are the same.
    PyArrayMethod_Context context;
    PyArray_Descr *descrs[2] = {dt, dt};
    NPY_context_init(&context, descrs);
    context.caller = (PyObject *)ufunc;
    context.method = method;
    npy_intp strides[2] = {0, 0};  // 0 ensures scalar math, not SIMD for half.
    PyArrayMethod_StridedLoop *strided_loop;
    NpyAuxData *auxdata = NULL;