From 1bf517d2adf8c0b88f770ad7c68adc9460940912 Mon Sep 17 00:00:00 2001 From: Robert Bradshaw Date: Tue, 15 Dec 2009 02:13:38 -0800 Subject: [PATCH] C++ parsing simplification, cleanup --- Cython/Compiler/CmdLine.py | 2 +- Cython/Compiler/ExprNodes.py | 2 +- Cython/Compiler/Parsing.py | 29 ++++++++++------------------- Cython/Compiler/Symtab.py | 27 +++++++++++---------------- Cython/Compiler/Visitor.py | 3 ++- 5 files changed, 25 insertions(+), 38 deletions(-) diff --git a/Cython/Compiler/CmdLine.py b/Cython/Compiler/CmdLine.py index 8104e931..d7b2f23a 100644 --- a/Cython/Compiler/CmdLine.py +++ b/Cython/Compiler/CmdLine.py @@ -89,7 +89,7 @@ def parse_command_line(args): options.c_only = 0 options.obj_only = 0 elif option in ("-+", "--cplus"): - Options.cplus = options.cplus = 1 + options.cplus = 1 elif option == "--embed": Options.embed = True elif option.startswith("-I"): diff --git a/Cython/Compiler/ExprNodes.py b/Cython/Compiler/ExprNodes.py index 96c251c4..9ab2b259 100755 --- a/Cython/Compiler/ExprNodes.py +++ b/Cython/Compiler/ExprNodes.py @@ -4280,7 +4280,7 @@ class NumBinopNode(BinopNode): if type2.is_ptr: type2 = type2.base_type entry = env.lookup(type1.name) - function = entry.type.scope.lookup(self.operators[self.operator]) + function = entry.type.scope.lookup("operator%s" % self.operator) if not function: error(self.pos, "'%s' operator not defined for '%s %s %s'" % (self.operator, type1, self.operator, type2)) diff --git a/Cython/Compiler/Parsing.py b/Cython/Compiler/Parsing.py index d5ee2f27..0e9ab6b2 100644 --- a/Cython/Compiler/Parsing.py +++ b/Cython/Compiler/Parsing.py @@ -2593,33 +2593,24 @@ def p_cpp_class_definition(s, pos, ctx): cname = ctx.namespace + "::" + class_name if s.sy == '.': error(pos, "Qualified class name not allowed C++ class") - templates = None if s.sy == '[': s.next() - templates = [] - templates.append(s.systring) - s.next() + templates = [p_ident(s)] while s.sy == ',': s.next() - templates.append(s.systring) - s.next() + templates.append(p_ident(s)) s.expect(']') - base_classes = [] + else: + templates = None if s.sy == '(': - base_class = True - while (base_class): + s.next() + base_classes = [p_dotted_name(s, False)[2]] + while s.sy == ',': s.next() - base_class_path = [p_ident(s)] - base_class = False - while s.sy == '.': - s.next() - base_class_path.append(p_ident(s)) - base_classes.append(base_class_path) - if s.sy == ',': - base_class = True - base_class_path = [] + base_classes.append(p_dotted_name(s, False)[2]) s.expect(')') - base_classes = [".".join(path) for path in base_classes] + else: + base_classes = [] if s.sy == '[': error(s.position(), "Name options not allowed for C++ class") if s.sy == ':': diff --git a/Cython/Compiler/Symtab.py b/Cython/Compiler/Symtab.py index db3eca3f..e26f35c8 100644 --- a/Cython/Compiler/Symtab.py +++ b/Cython/Compiler/Symtab.py @@ -311,8 +311,7 @@ class Scope(object): if visibility == 'extern': warning(pos, "'%s' redeclared " % name, 0) elif visibility != 'ignore': - pass - #error(pos, "'%s' redeclared " % name) + error(pos, "'%s' redeclared " % name) entry = Entry(name, cname, type, pos = pos) entry.in_cinclude = self.in_cinclude if name: @@ -464,14 +463,16 @@ class Scope(object): if visibility != 'private' and visibility != entry.visibility: warning(pos, "Function '%s' previously declared as '%s'" % (name, entry.visibility), 1) if not entry.type.same_as(type): - #if visibility == 'extern' and entry.visibility == 'extern': - #warning(pos, "Function signature does not match previous declaration", 1) - #entry.type = type - temp = self.add_cfunction(name, type, pos, cname, visibility, modifiers) - entry.overloaded_alternatives.append(temp) - entry = temp - #else: - #error(pos, "Function signature does not match previous declaration") + if visibility == 'extern' and entry.visibility == 'extern': + if self.is_cpp(): + temp = self.add_cfunction(name, type, pos, cname, visibility, modifiers) + entry.overloaded_alternatives.append(temp) + entry = temp + else: + warning(pos, "Function signature does not match previous declaration", 1) + entry.type = type + else: + error(pos, "Function signature does not match previous declaration") else: entry = self.add_cfunction(name, type, pos, cname, visibility, modifiers) entry.func_cname = cname @@ -485,12 +486,6 @@ class Scope(object): entry.is_implemented = True if modifiers: entry.func_modifiers = modifiers - #try: - # print entry.name, entry.type, entry.overloaded_alternatives - #except: - # pass - #if len(entry.overloaded_alternatives) > 0: - # print entry.name, entry.type, entry.overloaded_alternatives[0].type return entry def add_cfunction(self, name, type, pos, cname, visibility, modifiers): diff --git a/Cython/Compiler/Visitor.py b/Cython/Compiler/Visitor.py index c7739f8d..c6add7cb 100644 --- a/Cython/Compiler/Visitor.py +++ b/Cython/Compiler/Visitor.py @@ -94,7 +94,8 @@ class TreeVisitor(BasicVisitor): def dump_node(self, node, indent=0): ignored = list(node.child_attrs) + [u'child_attrs', u'pos', - u'gil_message', u'subexprs'] + u'gil_message', u'cpp_message', + u'subexprs'] values = [] pos = node.pos if pos: -- 2.26.2