Skip to content

Commit 738fc6c

Browse files
fixes
1 parent 53123f6 commit 738fc6c

File tree

4 files changed

+232
-241
lines changed

4 files changed

+232
-241
lines changed

Include/internal/pycore_crossinterp.h

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -322,23 +322,20 @@ typedef enum error_code {
322322
_PyXI_ERR_NOT_SHAREABLE = -9,
323323
} _PyXI_errcode;
324324

325-
typedef struct error_override _PyXI_error_override;
326-
327-
PyAPI_FUNC(_PyXI_error_override *) _PyXI_NewErrorOverride(void);
328-
PyAPI_FUNC(void) _PyXI_FreeErrorOverride(_PyXI_error_override *);
329-
PyAPI_FUNC(_PyXI_errcode) _PyXI_GetErrorOverrideCode(_PyXI_error_override *);
330-
PyAPI_FUNC(int) _PyXI_SetErrorOverride(
331-
_PyXI_error_override *,
332-
_PyXI_errcode,
333-
PyObject *);
334-
PyAPI_FUNC(void) _PyXI_SetErrorOverrideUTF8(
335-
_PyXI_error_override *,
325+
typedef struct xi_failure _PyXI_failure;
326+
327+
PyAPI_FUNC(_PyXI_failure *) _PyXI_NewFailure(void);
328+
PyAPI_FUNC(void) _PyXI_FreeFailure(_PyXI_failure *);
329+
PyAPI_FUNC(_PyXI_errcode) _PyXI_GetFailureCode(_PyXI_failure *);
330+
PyAPI_FUNC(int) _PyXI_InitFailure(_PyXI_failure *, _PyXI_errcode, PyObject *);
331+
PyAPI_FUNC(void) _PyXI_InitFailureUTF8(
332+
_PyXI_failure *,
336333
_PyXI_errcode,
337334
const char *);
338335

339336
PyAPI_FUNC(int) _PyXI_UnwrapNotShareableError(
340337
PyThreadState *,
341-
_PyXI_error_override *);
338+
_PyXI_failure *);
342339

343340

344341
// A cross-interpreter session involves entering an interpreter
@@ -370,19 +367,21 @@ PyAPI_FUNC(int) _PyXI_Enter(
370367
_PyXI_session_result *);
371368
PyAPI_FUNC(int) _PyXI_Exit(
372369
_PyXI_session *,
373-
_PyXI_error_override *,
370+
_PyXI_failure *,
374371
_PyXI_session_result *);
375372

376373
PyAPI_FUNC(PyObject *) _PyXI_GetMainNamespace(
377374
_PyXI_session *,
378-
_PyXI_error_override *);
375+
_PyXI_failure *);
379376

380377
PyAPI_FUNC(int) _PyXI_Preserve(
381378
_PyXI_session *,
382379
const char *,
383380
PyObject *,
384-
_PyXI_error_override *);
385-
PyAPI_FUNC(PyObject *) _PyXI_GetPreserved(_PyXI_session_result *, const char *);
381+
_PyXI_failure *);
382+
PyAPI_FUNC(PyObject *) _PyXI_GetPreserved(
383+
_PyXI_session_result *,
384+
const char *);
386385

387386

388387
/*************/

Modules/_interpretersmodule.c

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,9 @@ is_notshareable_raised(PyThreadState *tstate)
8080
}
8181

8282
static void
83-
unwrap_not_shareable(PyThreadState *tstate, _PyXI_error_override *err)
83+
unwrap_not_shareable(PyThreadState *tstate, _PyXI_failure *failure)
8484
{
85-
if (_PyXI_UnwrapNotShareableError(tstate, err) < 0) {
85+
if (_PyXI_UnwrapNotShareableError(tstate, failure) < 0) {
8686
_PyErr_Clear(tstate);
8787
}
8888
}
@@ -586,7 +586,7 @@ _interp_call_unpack(struct interp_call *call,
586586

587587
static int
588588
_make_call(struct interp_call *call,
589-
PyObject **p_result, _PyXI_error_override *err)
589+
PyObject **p_result, _PyXI_failure *failure)
590590
{
591591
assert(call != NULL && call->func != NULL);
592592
PyThreadState *tstate = _PyThreadState_GET();
@@ -597,8 +597,8 @@ _make_call(struct interp_call *call,
597597
assert(func == NULL);
598598
assert(args == NULL);
599599
assert(kwargs == NULL);
600-
_PyXI_SetErrorOverride(err, _PyXI_ERR_OTHER, NULL);
601-
unwrap_not_shareable(tstate, err);
600+
_PyXI_InitFailure(failure, _PyXI_ERR_OTHER, NULL);
601+
unwrap_not_shareable(tstate, failure);
602602
return -1;
603603
}
604604

@@ -615,17 +615,17 @@ _make_call(struct interp_call *call,
615615
}
616616

617617
static int
618-
_run_script(_PyXIData_t *script, PyObject *ns, _PyXI_error_override *err)
618+
_run_script(_PyXIData_t *script, PyObject *ns, _PyXI_failure *failure)
619619
{
620620
PyObject *code = _PyXIData_NewObject(script);
621621
if (code == NULL) {
622-
_PyXI_SetErrorOverride(err, _PyXI_ERR_NOT_SHAREABLE, NULL);
622+
_PyXI_InitFailure(failure, _PyXI_ERR_NOT_SHAREABLE, NULL);
623623
return -1;
624624
}
625625
PyObject *result = PyEval_EvalCode(code, ns, ns);
626626
Py_DECREF(code);
627627
if (result == NULL) {
628-
_PyXI_SetErrorOverride(err, _PyXI_ERR_UNCAUGHT_EXCEPTION, NULL);
628+
_PyXI_InitFailure(failure, _PyXI_ERR_UNCAUGHT_EXCEPTION, NULL);
629629
return -1;
630630
}
631631
assert(result == Py_None);
@@ -652,13 +652,13 @@ _run_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp,
652652
{
653653
assert(!_PyErr_Occurred(tstate));
654654
int res = -1;
655-
_PyXI_error_override *override = _PyXI_NewErrorOverride();
656-
if (override == NULL) {
655+
_PyXI_failure *failure = _PyXI_NewFailure();
656+
if (failure == NULL) {
657657
return -1;
658658
}
659659
_PyXI_session *session = _PyXI_NewSession();
660660
if (session == NULL) {
661-
_PyXI_FreeErrorOverride(override);
661+
_PyXI_FreeFailure(failure);
662662
return -1;
663663
}
664664
_PyXI_session_result result = {0};
@@ -668,26 +668,26 @@ _run_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp,
668668
// If an error occured at this step, it means that interp
669669
// was not prepared and switched.
670670
_PyXI_FreeSession(session);
671-
_PyXI_FreeErrorOverride(override);
671+
_PyXI_FreeFailure(failure);
672672
assert(result.excinfo == NULL);
673673
return -1;
674674
}
675675

676676
// Run in the interpreter.
677677
if (script != NULL) {
678678
assert(call == NULL);
679-
PyObject *mainns = _PyXI_GetMainNamespace(session, override);
679+
PyObject *mainns = _PyXI_GetMainNamespace(session, failure);
680680
if (mainns == NULL) {
681681
goto finally;
682682
}
683-
res = _run_script(script, mainns, override);
683+
res = _run_script(script, mainns, failure);
684684
}
685685
else {
686686
assert(call != NULL);
687687
PyObject *resobj;
688-
res = _make_call(call, &resobj, override);
688+
res = _make_call(call, &resobj, failure);
689689
if (res == 0) {
690-
res = _PyXI_Preserve(session, "resobj", resobj, override);
690+
res = _PyXI_Preserve(session, "resobj", resobj, failure);
691691
Py_DECREF(resobj);
692692
if (res < 0) {
693693
goto finally;
@@ -698,10 +698,10 @@ _run_in_interpreter(PyThreadState *tstate, PyInterpreterState *interp,
698698
finally:
699699
// Clean up and switch back.
700700
(void)res;
701-
int exitres = _PyXI_Exit(session, override, &result);
701+
int exitres = _PyXI_Exit(session, failure, &result);
702702
assert(res == 0 || exitres != 0);
703703
_PyXI_FreeSession(session);
704-
_PyXI_FreeErrorOverride(override);
704+
_PyXI_FreeFailure(failure);
705705

706706
res = exitres;
707707
if (_PyErr_Occurred(tstate)) {

0 commit comments

Comments
 (0)