[Python-checkins] bpo-41215: Don't use NULL by default in the PEG parser keyword list (GH-21355)
Pablo Galindo
webhook-mailer at python.org
Mon Jul 6 15:31:20 EDT 2020
https://github.com/python/cpython/commit/1ac0cbca369f16f9191833dd54536482fb141a98
commit: 1ac0cbca369f16f9191833dd54536482fb141a98
branch: master
author: Pablo Galindo <Pablogsal at gmail.com>
committer: GitHub <noreply at github.com>
date: 2020-07-06T12:31:16-07:00
summary:
bpo-41215: Don't use NULL by default in the PEG parser keyword list (GH-21355)
Automerge-Triggered-By: @lysnikolaou
files:
A Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst
M Parser/parser.c
M Parser/pegen.c
M Tools/peg_generator/pegen/c_generator.py
diff --git a/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst b/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst
new file mode 100644
index 0000000000000..7343da31e94f7
--- /dev/null
+++ b/Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst
@@ -0,0 +1,2 @@
+Use non-NULL default values in the PEG parser keyword list to overcome a bug that was preventing
+Python from being properly compiled when using the XLC compiler. Patch by Pablo Galindo.
diff --git a/Parser/parser.c b/Parser/parser.c
index bfd5c47caf07e..75dc7176a5e75 100644
--- a/Parser/parser.c
+++ b/Parser/parser.c
@@ -9,8 +9,8 @@ extern int Py_DebugFlag;
#endif
static const int n_keyword_lists = 9;
static KeywordToken *reserved_keywords[] = {
- NULL,
- NULL,
+ (KeywordToken[]) {{NULL, -1}},
+ (KeywordToken[]) {{NULL, -1}},
(KeywordToken[]) {
{"if", 510},
{"in", 518},
diff --git a/Parser/pegen.c b/Parser/pegen.c
index 53e3d49138306..42f9e0c41bf49 100644
--- a/Parser/pegen.c
+++ b/Parser/pegen.c
@@ -525,10 +525,13 @@ _PyPegen_dummy_name(Parser *p, ...)
static int
_get_keyword_or_name_type(Parser *p, const char *name, int name_len)
{
- if (name_len >= p->n_keyword_lists || p->keywords[name_len] == NULL) {
+ assert(name_len != 0);
+ if (name_len >= p->n_keyword_lists ||
+ p->keywords[name_len] == NULL ||
+ p->keywords[name_len]->type == -1) {
return NAME;
}
- for (KeywordToken *k = p->keywords[name_len]; k->type != -1; k++) {
+ for (KeywordToken *k = p->keywords[name_len]; k != NULL && k->type != -1; k++) {
if (strncmp(k->str, name, name_len) == 0) {
return k->type;
}
diff --git a/Tools/peg_generator/pegen/c_generator.py b/Tools/peg_generator/pegen/c_generator.py
index 58a44fbe67e8b..aee668c3f329a 100644
--- a/Tools/peg_generator/pegen/c_generator.py
+++ b/Tools/peg_generator/pegen/c_generator.py
@@ -440,7 +440,7 @@ def _setup_keywords(self) -> None:
num_groups = max(groups) + 1 if groups else 1
for keywords_length in range(num_groups):
if keywords_length not in groups.keys():
- self.print("NULL,")
+ self.print("(KeywordToken[]) {{NULL, -1}},")
else:
self.print("(KeywordToken[]) {")
with self.indent():
More information about the Python-checkins
mailing list