From 6eda1b9b82e2593a65fb63a93f5572b45e026f39 Mon Sep 17 00:00:00 2001 From: Kuang Rufan Date: Tue, 5 Mar 2019 17:47:20 +0800 Subject: [PATCH] Fix incorrrect python wrapper object for tree codes defined after END_OF_BASE_TREE_CODES in 'all-tree.def'. Signed-off-by: Kuang Rufan --- generate-tree-c.py | 25 ++++++++++++++++--------- maketreetypes.py | 3 ++- tree-types.txt.in | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) diff --git a/generate-tree-c.py b/generate-tree-c.py index 7a0a92bd..800340cc 100644 --- a/generate-tree-c.py +++ b/generate-tree-c.py @@ -55,7 +55,7 @@ def generate_tree(): # global modinit_preinit global modinit_postinit - + cu.add_defn(""" static PyObject * PyGccTree_get_type(struct PyGccTree *self, void *closure) @@ -82,7 +82,7 @@ def generate_tree(): typename='PyGccTree') cu.add_defn(getsettable.c_defn()) - + pytype = PyGccWrapperTypeObject(identifier = 'PyGccTree_TypeObj', localname = 'Tree', tp_name = 'gcc.Tree', @@ -115,7 +115,7 @@ def generate_tree(): cu.add_defn(pytype.c_defn()) modinit_preinit += pytype.c_invoke_type_ready() modinit_postinit += pytype.c_invoke_add_to_module() - + generate_tree() type_for_code_class = { @@ -140,7 +140,7 @@ def generate_intermediate_tree_classes(): global modinit_preinit global modinit_postinit - + for code_type in type_for_code_class.values(): # We've already built the base class: if code_type == 'PyGccTree_TypeObj': @@ -311,7 +311,7 @@ def add_type(c_expr_for_node, typename): "FIXME") cu.add_defn(methods.c_defn()) - cu.add_defn(getsettable.c_defn()) + cu.add_defn(getsettable.c_defn()) cu.add_defn(pytype.c_defn()) modinit_preinit += pytype.c_invoke_type_ready() modinit_postinit += pytype.c_invoke_add_to_module() @@ -325,8 +325,10 @@ def generate_tree_code_classes(): # as subclasses of the above layer: global modinit_preinit global modinit_postinit - + for tree_type in tree_types: + if tree_type.TYPE is None: + continue base_type = type_for_code_class[tree_type.TYPE] cc = tree_type.camel_cased_string() @@ -388,7 +390,7 @@ def add_complex_getter(name, doc): tp_repr = '(reprfunc)PyGccRealCst_repr' # TYPE_QUALS for various foo_TYPE classes: - if tree_type.SYM in ('VOID_TYPE', 'INTEGER_TYPE', 'REAL_TYPE', + if tree_type.SYM in ('VOID_TYPE', 'INTEGER_TYPE', 'REAL_TYPE', 'FIXED_POINT_TYPE', 'COMPLEX_TYPE', 'VECTOR_TYPE', 'ENUMERAL_TYPE', 'BOOLEAN_TYPE'): for qual in ('const', 'volatile', 'restrict'): @@ -639,12 +641,15 @@ def add_complex_getter(name, doc): cu.add_defn(pytype.c_defn()) modinit_preinit += pytype.c_invoke_type_ready() modinit_postinit += pytype.c_invoke_add_to_module() - + cu.add_defn('\n/* Map from GCC tree codes to PyGccWrapperTypeObject* */\n') cu.add_defn('PyGccWrapperTypeObject *pytype_for_tree_code[] = {\n') for tree_type in tree_types: - cu.add_defn(' &PyGcc%s_TypeObj, /* %s */\n' % (tree_type.camel_cased_string(), tree_type.SYM)) + if tree_type.TYPE is None: + cu.add_defn(' NULL, /* %s */\n' % (tree_type.SYM)) + else: + cu.add_defn(' &PyGcc%s_TypeObj, /* %s */\n' % (tree_type.camel_cased_string(), tree_type.SYM)) cu.add_defn('};\n\n') cu.add_defn('\n/* Map from PyGccWrapperTypeObject* to GCC tree codes*/\n') @@ -652,6 +657,8 @@ def add_complex_getter(name, doc): cu.add_defn('PyGcc_tree_type_object_as_tree_code(PyObject *cls, enum tree_code *out)\n') cu.add_defn('{\n') for tree_type in tree_types: + if tree_type.TYPE is None: + continue cu.add_defn(' if (cls == (PyObject*)&PyGcc%s_TypeObj) {\n' ' *out = %s; return 0;\n' ' }\n' diff --git a/maketreetypes.py b/maketreetypes.py index d29f46df..4e0024f0 100644 --- a/maketreetypes.py +++ b/maketreetypes.py @@ -36,8 +36,9 @@ def iter_tree_types(): STRING=m.group(2)[1:-1], TYPE=m.group(3), NARGS=int(m.group(4))) + elif line == "LAST_AND_UNUSED_TREE_CODE,\n": + yield TreeType('LAST_AND_UNUSED_TREE_CODE', None, None, 0) else: - # print 'UNMATCHED: ', line assert(line.startswith('#') or line.strip() == '') f.close() diff --git a/tree-types.txt.in b/tree-types.txt.in index 3a1d4779..bbcf237b 100644 --- a/tree-types.txt.in +++ b/tree-types.txt.in @@ -1,5 +1,5 @@ #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \ SYM, STRING, TYPE, NARGS -#define END_OF_BASE_TREE_CODES +#define END_OF_BASE_TREE_CODES LAST_AND_UNUSED_TREE_CODE, #include "all-tree.def" #undef DEFTREECODE