]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.9] bpo-41215: Don't use NULL by default in the PEG parser keyword list (GH-21355...
authorPablo Galindo <Pablogsal@gmail.com>
Mon, 6 Jul 2020 19:29:59 +0000 (20:29 +0100)
committerGitHub <noreply@github.com>
Mon, 6 Jul 2020 19:29:59 +0000 (12:29 -0700)
(cherry picked from commit 39e76c0fb07e20acad454deb86a0457b279884a9)

Co-authored-by: Pablo Galindo <pablogsal@gmail.com>
Automerge-Triggered-By: @lysnikolaou
Misc/NEWS.d/next/Core and Builtins/2020-07-06-18-36-33.bpo-41215.vFGFIz.rst [new file with mode: 0644]
Parser/pegen/parse.c
Parser/pegen/pegen.c
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 (file)
index 0000000..7343da3
--- /dev/null
@@ -0,0 +1,2 @@
+Use non-NULL default values in the PEG parser keyword list to overcome a bug that was preventing\r
+Python from being properly compiled when using the XLC compiler. Patch by Pablo Galindo.\r
index 9d3ac575df46d973113cc40d49d1cb51a4652146..d9dd23c2d98f4f5210861ae70904469300b86ea6 100644 (file)
@@ -9,8 +9,8 @@ extern int Py_DebugFlag;
 #endif
 static const int n_keyword_lists = 15;
 static KeywordToken *reserved_keywords[] = {
-    NULL,
-    NULL,
+    (KeywordToken[]) {{NULL, -1}},
+    (KeywordToken[]) {{NULL, -1}},
     (KeywordToken[]) {
         {"if", 510},
         {"in", 518},
@@ -65,11 +65,11 @@ static KeywordToken *reserved_keywords[] = {
         {"nonlocal", 509},
         {NULL, -1},
     },
-    NULL,
-    NULL,
-    NULL,
-    NULL,
-    NULL,
+    (KeywordToken[]) {{NULL, -1}},
+    (KeywordToken[]) {{NULL, -1}},
+    (KeywordToken[]) {{NULL, -1}},
+    (KeywordToken[]) {{NULL, -1}},
+    (KeywordToken[]) {{NULL, -1}},
     (KeywordToken[]) {
         {"__peg_parser__", 531},
         {NULL, -1},
index 895677bebfa07f1f57dd792de54e5676ed5e1c11..0f33dcba286adb116e3b7efcd8a92726783b60d9 100644 (file)
@@ -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;
         }
index 58a44fbe67e8badcec2be0baa1a6bc3872c3d040..aee668c3f329ababa04d826c14452786e0752a84 100644 (file)
@@ -440,7 +440,7 @@ class CParserGenerator(ParserGenerator, GrammarVisitor):
             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():