bpo-36876: Moved Parser/listnode.c statics to interpreter state. (GH-16328)

This commit is contained in:
Vinay Sajip 2019-11-07 10:08:58 +00:00 committed by GitHub
parent 7f460494d2
commit 9def81aa52
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 10 deletions

View file

@ -125,6 +125,15 @@ struct _is {
struct _warnings_runtime_state warnings;
PyObject *audit_hooks;
/*
* See bpo-36876: miscellaneous ad hoc statics have been moved here.
*/
struct {
struct {
int level;
int atbol;
} listnode;
} parser;
};
PyAPI_FUNC(struct _is*) _PyInterpreterState_LookUpID(PY_INT64_T);

View file

@ -2,6 +2,7 @@
/* List a node on a file */
#include "Python.h"
#include "pycore_pystate.h"
#include "token.h"
#include "node.h"
@ -15,19 +16,21 @@ PyNode_ListTree(node *n)
listnode(stdout, n);
}
static int level, atbol;
static void
listnode(FILE *fp, node *n)
{
level = 0;
atbol = 1;
PyInterpreterState *interp = _PyInterpreterState_GET_UNSAFE();
interp->parser.listnode.level = 0;
interp->parser.listnode.atbol = 1;
list1node(fp, n);
}
static void
list1node(FILE *fp, node *n)
{
PyInterpreterState *interp;
if (n == NULL)
return;
if (ISNONTERMINAL(TYPE(n))) {
@ -36,25 +39,26 @@ list1node(FILE *fp, node *n)
list1node(fp, CHILD(n, i));
}
else if (ISTERMINAL(TYPE(n))) {
interp = _PyInterpreterState_GET_UNSAFE();
switch (TYPE(n)) {
case INDENT:
++level;
interp->parser.listnode.level++;
break;
case DEDENT:
--level;
interp->parser.listnode.level--;
break;
default:
if (atbol) {
if (interp->parser.listnode.atbol) {
int i;
for (i = 0; i < level; ++i)
for (i = 0; i < interp->parser.listnode.level; ++i)
fprintf(fp, "\t");
atbol = 0;
interp->parser.listnode.atbol = 0;
}
if (TYPE(n) == NEWLINE) {
if (STR(n) != NULL)
fprintf(fp, "%s", STR(n));
fprintf(fp, "\n");
atbol = 1;
interp->parser.listnode.atbol = 1;
}
else
fprintf(fp, "%s ", STR(n));