@@ -487,39 +487,31 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
487487{
488488 PyObject * func , * result ;
489489 long retval ;
490- static PyObject * context ;
491-
492- if (context == NULL )
493- context = PyUnicode_InternFromString ("_ctypes.DllGetClassObject" );
494490
495491 func = PyImport_ImportModuleAttrString ("ctypes" , "DllGetClassObject" );
496492 if (!func ) {
497- PyErr_WriteUnraisable (context ? context : Py_None );
498493 /* There has been a warning before about this already */
499- return E_FAIL ;
494+ goto error ;
500495 }
501496
502497 {
503498 PyObject * py_rclsid = PyLong_FromVoidPtr ((void * )rclsid );
504499 if (py_rclsid == NULL ) {
505500 Py_DECREF (func );
506- PyErr_WriteUnraisable (context ? context : Py_None );
507- return E_FAIL ;
501+ goto error ;
508502 }
509503 PyObject * py_riid = PyLong_FromVoidPtr ((void * )riid );
510504 if (py_riid == NULL ) {
511505 Py_DECREF (func );
512506 Py_DECREF (py_rclsid );
513- PyErr_WriteUnraisable (context ? context : Py_None );
514- return E_FAIL ;
507+ goto error ;
515508 }
516509 PyObject * py_ppv = PyLong_FromVoidPtr (ppv );
517510 if (py_ppv == NULL ) {
518511 Py_DECREF (py_rclsid );
519512 Py_DECREF (py_riid );
520513 Py_DECREF (func );
521- PyErr_WriteUnraisable (context ? context : Py_None );
522- return E_FAIL ;
514+ goto error ;
523515 }
524516 result = PyObject_CallFunctionObjArgs (func ,
525517 py_rclsid ,
@@ -532,17 +524,21 @@ long Call_GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
532524 }
533525 Py_DECREF (func );
534526 if (!result ) {
535- PyErr_WriteUnraisable (context ? context : Py_None );
536- return E_FAIL ;
527+ goto error ;
537528 }
538529
539530 retval = PyLong_AsLong (result );
540531 if (PyErr_Occurred ()) {
541- PyErr_WriteUnraisable ( context ? context : Py_None );
542- retval = E_FAIL ;
532+ Py_DECREF ( result );
533+ goto error ;
543534 }
544535 Py_DECREF (result );
545536 return retval ;
537+
538+ error :
539+ PyErr_FormatUnraisable ("Exception ignored while calling "
540+ "ctypes.DllGetClassObject" );
541+ return E_FAIL ;
546542}
547543
548544STDAPI DllGetClassObject (REFCLSID rclsid ,
@@ -563,10 +559,6 @@ long Call_CanUnloadNow(void)
563559{
564560 PyObject * mod , * func , * result ;
565561 long retval ;
566- static PyObject * context ;
567-
568- if (context == NULL )
569- context = PyUnicode_InternFromString ("_ctypes.DllCanUnloadNow" );
570562
571563 mod = PyImport_ImportModule ("ctypes" );
572564 if (!mod ) {
@@ -580,24 +572,27 @@ long Call_CanUnloadNow(void)
580572 func = PyObject_GetAttrString (mod , "DllCanUnloadNow" );
581573 Py_DECREF (mod );
582574 if (!func ) {
583- PyErr_WriteUnraisable (context ? context : Py_None );
584- return E_FAIL ;
575+ goto error ;
585576 }
586577
587578 result = _PyObject_CallNoArgs (func );
588579 Py_DECREF (func );
589580 if (!result ) {
590- PyErr_WriteUnraisable (context ? context : Py_None );
591- return E_FAIL ;
581+ goto error ;
592582 }
593583
594584 retval = PyLong_AsLong (result );
595585 if (PyErr_Occurred ()) {
596- PyErr_WriteUnraisable ( context ? context : Py_None );
597- retval = E_FAIL ;
586+ Py_DECREF ( result );
587+ goto error ;
598588 }
599589 Py_DECREF (result );
600590 return retval ;
591+
592+ error :
593+ PyErr_FormatUnraisable ("Exception ignored while calling "
594+ "ctypes.DllCanUnloadNow" );
595+ return E_FAIL ;
601596}
602597
603598/*
0 commit comments