Author: Armin Rigo <[email protected]>
Branch: stmgc-c8-dictstrategy
Changeset: r80928:96251506a7b2
Date: 2015-11-25 09:17 +0100
http://bitbucket.org/pypy/pypy/changeset/96251506a7b2/

Log:    hg merge stmgc-c8

diff too long, truncating to 2000 out of 105631 lines

diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,14 @@
 .hg
 .svn
 
+# VIM
+*.swp
+*.swo
+
 *.pyc
 *.pyo
 *~
+__pycache__/
 
 bin/pypy-c
 include/*.h
@@ -22,4 +27,6 @@
 pypy/translator/goal/pypy-c
 pypy/translator/goal/target*-c
 release/
+!pypy/tool/release/
 rpython/_cache/
+__pycache__/
diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -16,3 +16,4 @@
 e03971291f3a0729ecd3ee7fae7ddb0bb82d476c release-2.6.0
 295ee98b69288471b0fcf2e0ede82ce5209eb90b release-2.6.0
 f3ad1e1e1d6215e20d34bb65ab85ff9188c9f559 release-2.6.1
+850edf14b2c75573720f59e95767335fb1affe55 release-4.0.0
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -56,14 +56,15 @@
   Anders Chrigstrom
   Eric van Riet Paap
   Wim Lavrijsen
+  Richard Plangger
   Richard Emslie
   Alexander Schremmer
   Dan Villiom Podlaski Christiansen
   Lukas Diekmann
   Sven Hager
   Anders Lehmann
+  Remi Meier
   Aurelien Campeas
-  Remi Meier
   Niklaus Haldimann
   Camillo Bruni
   Laura Creighton
@@ -87,7 +88,6 @@
   Ludovic Aubry
   Jacob Hallen
   Jason Creighton
-  Richard Plangger
   Alex Martelli
   Michal Bendowski
   stian
@@ -200,9 +200,12 @@
   Alex Perry
   Vincent Legoll
   Alan McIntyre
+  Spenser Bauman
   Alexander Sedov
   Attila Gobi
   Christopher Pope
+  Devin Jeanpierre
+  Vaibhav Sood
   Christian Tismer 
   Marc Abramowitz
   Dan Stromberg
@@ -234,6 +237,7 @@
   Lutz Paelike
   Lucio Torre
   Lars Wassermann
+  Philipp Rustemeuer
   Henrik Vendelbo
   Dan Buch
   Miguel de Val Borro
@@ -244,6 +248,7 @@
   Martin Blais
   Lene Wagner
   Tomo Cocoa
+  Kim Jin Su
   Toni Mattis
   Lucas Stadler
   Julian Berman
@@ -253,6 +258,7 @@
   Anna Katrina Dominguez
   William Leslie
   Bobby Impollonia
+  Faye Zhao
   [email protected]
   Andrew Thompson
   Yusei Tahara
@@ -283,6 +289,7 @@
   shoma hosaka
   Daniel Neuh&#228;user
   Ben Mather
+  Niclas Olofsson
   halgari
   Boglarka Vezer
   Chris Pressey
@@ -309,13 +316,16 @@
   Stefan Marr
   jiaaro
   Mads Kiilerich
+  Richard Lancaster
   opassembler.py
   Antony Lee
+  Yaroslav Fedevych
   Jim Hunziker
   Markus Unterwaditzer
   Even Wiik Thomassen
   jbs
   squeaky
+  Zearin
   soareschen
   Kurt Griffiths
   Mike Bayer
@@ -327,6 +337,7 @@
   Anna Ravencroft
   Andrey Churin
   Dan Crosta
+  Tobias Diaz
   Julien Phalip
   Roman Podoliaka
   Dan Loewenherz
@@ -430,7 +441,7 @@
 gdbm module, provided in the file lib_pypy/gdbm.py, is redistributed
 under the terms of the GPL license as well.
 
-License for 'pypy/module/_vmprof/src'
+License for 'rpython/rlib/rvmprof/src'
 --------------------------------------
 
 The code is based on gperftools. You may see a copy of the License for it at
diff --git a/dotviewer/graphclient.py b/dotviewer/graphclient.py
--- a/dotviewer/graphclient.py
+++ b/dotviewer/graphclient.py
@@ -127,16 +127,8 @@
         return spawn_graphserver_handler((host, port))
 
 def spawn_local_handler():
-    if hasattr(sys, 'pypy_objspaceclass'):
-        # if 'python' is actually PyPy, e.g. in a virtualenv, then
-        # try hard to find a real CPython
-        try:
-            python = subprocess.check_output(
-                'env -i $SHELL -l -c "which python"', shell=True).strip()
-        except subprocess.CalledProcessError:
-            # did not work, fall back to 'python'
-            python = 'python'
-    else:
+    python = os.getenv('PYPY_PYGAME_PYTHON')
+    if not python:
         python = sys.executable
     args = [python, '-u', GRAPHSERVER, '--stdio']
     p = subprocess.Popen(args,
diff --git a/lib-python/conftest.py b/lib-python/conftest.py
--- a/lib-python/conftest.py
+++ b/lib-python/conftest.py
@@ -158,7 +158,7 @@
     RegrTest('test_codecs.py', core=True, usemodules='_multibytecodec'),
     RegrTest('test_codeop.py', core=True),
     RegrTest('test_coding.py', core=True),
-    RegrTest('test_coercion.py', core=True),
+    RegrTest('test_coercion.py', core=True, usemodules='struct'),
     RegrTest('test_collections.py', usemodules='binascii struct'),
     RegrTest('test_colorsys.py'),
     RegrTest('test_commands.py'),
@@ -303,7 +303,7 @@
     RegrTest('test_memoryio.py'),
     RegrTest('test_memoryview.py'),
     RegrTest('test_md5.py'),
-    RegrTest('test_mhlib.py'),
+    RegrTest('test_mhlib.py', usemodules='binascii struct'),
     RegrTest('test_mimetools.py'),
     RegrTest('test_mimetypes.py'),
     RegrTest('test_MimeWriter.py', core=False, usemodules='binascii'),
diff --git a/lib_pypy/_curses.py b/lib_pypy/_curses.py
--- a/lib_pypy/_curses.py
+++ b/lib_pypy/_curses.py
@@ -1026,16 +1026,22 @@
 
 def tigetflag(capname):
     _ensure_initialised_setupterm()
+    if isinstance(capname, unicode):
+        capname = capname.encode('ascii')
     return lib.tigetflag(capname)
 
 
 def tigetnum(capname):
     _ensure_initialised_setupterm()
+    if isinstance(capname, unicode):
+        capname = capname.encode('ascii')
     return lib.tigetnum(capname)
 
 
 def tigetstr(capname):
     _ensure_initialised_setupterm()
+    if isinstance(capname, unicode):
+        capname = capname.encode('ascii')
     val = lib.tigetstr(capname)
     if int(ffi.cast("intptr_t", val)) in (0, -1):
         return None
diff --git a/lib_pypy/_tkinter/tklib_build.py b/lib_pypy/_tkinter/tklib_build.py
--- a/lib_pypy/_tkinter/tklib_build.py
+++ b/lib_pypy/_tkinter/tklib_build.py
@@ -212,8 +212,8 @@
 #include <tclTomMath.h>
 #endif 
 
-char *get_tk_version() { return TK_VERSION; }
-char *get_tcl_version() { return TCL_VERSION; }
+char *get_tk_version(void) { return TK_VERSION; }
+char *get_tcl_version(void) { return TCL_VERSION; }
 """ % globals(),
 include_dirs=incdirs,
 libraries=linklibs,
diff --git a/lib_pypy/cffi.egg-info/PKG-INFO b/lib_pypy/cffi.egg-info/PKG-INFO
--- a/lib_pypy/cffi.egg-info/PKG-INFO
+++ b/lib_pypy/cffi.egg-info/PKG-INFO
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: cffi
-Version: 1.3.0
+Version: 1.3.1
 Summary: Foreign Function Interface for Python calling C code.
 Home-page: http://cffi.readthedocs.org
 Author: Armin Rigo, Maciej Fijalkowski
diff --git a/lib_pypy/cffi/__init__.py b/lib_pypy/cffi/__init__.py
--- a/lib_pypy/cffi/__init__.py
+++ b/lib_pypy/cffi/__init__.py
@@ -4,8 +4,8 @@
 from .api import FFI, CDefError, FFIError
 from .ffiplatform import VerificationError, VerificationMissing
 
-__version__ = "1.3.0"
-__version_info__ = (1, 3, 0)
+__version__ = "1.3.1"
+__version_info__ = (1, 3, 1)
 
 # The verifier module file names are based on the CRC32 of a string that
 # contains the following version number.  It may be older than __version__
diff --git a/lib_pypy/cffi/_pycparser/__init__.py 
b/lib_pypy/cffi/_pycparser/__init__.py
--- a/lib_pypy/cffi/_pycparser/__init__.py
+++ b/lib_pypy/cffi/_pycparser/__init__.py
@@ -4,11 +4,11 @@
 # This package file exports some convenience functions for
 # interacting with pycparser
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #-----------------------------------------------------------------
 __all__ = ['c_lexer', 'c_parser', 'c_ast']
-__version__ = '2.10'
+__version__ = '2.14'
 
 from subprocess import Popen, PIPE
 from .c_parser import CParser
@@ -91,4 +91,3 @@
     if parser is None:
         parser = CParser()
     return parser.parse(text, filename)
-
diff --git a/lib_pypy/cffi/_pycparser/_ast_gen.py 
b/lib_pypy/cffi/_pycparser/_ast_gen.py
--- a/lib_pypy/cffi/_pycparser/_ast_gen.py
+++ b/lib_pypy/cffi/_pycparser/_ast_gen.py
@@ -1,13 +1,13 @@
 #-----------------------------------------------------------------
 # _ast_gen.py
 #
-# Generates the AST Node classes from a specification given in 
-# a .yaml file
+# Generates the AST Node classes from a specification given in
+# a configuration file
 #
 # The design of this module was inspired by astgen.py from the
 # Python 2.5 code-base.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #-----------------------------------------------------------------
 import pprint
@@ -20,7 +20,7 @@
             file.
         """
         self.cfg_filename = cfg_filename
-        self.node_cfg = [NodeCfg(name, contents) 
+        self.node_cfg = [NodeCfg(name, contents)
             for (name, contents) in self.parse_cfgfile(cfg_filename)]
 
     def generate(self, file=None):
@@ -28,11 +28,11 @@
         """
         src = Template(_PROLOGUE_COMMENT).substitute(
             cfg_filename=self.cfg_filename)
-        
+
         src += _PROLOGUE_CODE
         for node_cfg in self.node_cfg:
             src += node_cfg.generate_source() + '\n\n'
-        
+
         file.write(src)
 
     def parse_cfgfile(self, filename):
@@ -57,10 +57,10 @@
 
 
 class NodeCfg(object):
-    """ Node configuration. 
+    """ Node configuration.
 
         name: node name
-        contents: a list of contents - attributes and child nodes 
+        contents: a list of contents - attributes and child nodes
         See comment at the top of the configuration file for details.
     """
     def __init__(self, name, contents):
@@ -73,7 +73,7 @@
         for entry in contents:
             clean_entry = entry.rstrip('*')
             self.all_entries.append(clean_entry)
-            
+
             if entry.endswith('**'):
                 self.seq_child.append(clean_entry)
             elif entry.endswith('*'):
@@ -86,26 +86,30 @@
         src += '\n' + self._gen_children()
         src += '\n' + self._gen_attr_names()
         return src
-    
+
     def _gen_init(self):
         src = "class %s(Node):\n" % self.name
 
         if self.all_entries:
             args = ', '.join(self.all_entries)
+            slots = ', '.join("'{0}'".format(e) for e in self.all_entries)
+            slots += ", 'coord', '__weakref__'"
             arglist = '(self, %s, coord=None)' % args
         else:
+            slots = "'coord', '__weakref__'"
             arglist = '(self, coord=None)'
-        
+
+        src += "    __slots__ = (%s)\n" % slots
         src += "    def __init__%s:\n" % arglist
-        
+
         for name in self.all_entries + ['coord']:
             src += "        self.%s = %s\n" % (name, name)
-        
+
         return src
 
     def _gen_children(self):
         src = '    def children(self):\n'
-        
+
         if self.all_entries:
             src += '        nodelist = []\n'
 
@@ -114,21 +118,21 @@
                     '        if self.%(child)s is not None:' +
                     ' nodelist.append(("%(child)s", self.%(child)s))\n') % (
                         dict(child=child))
-                
+
             for seq_child in self.seq_child:
                 src += (
                     '        for i, child in enumerate(self.%(child)s or 
[]):\n'
                     '            nodelist.append(("%(child)s[%%d]" %% i, 
child))\n') % (
                         dict(child=seq_child))
-                    
+
             src += '        return tuple(nodelist)\n'
         else:
             src += '        return ()\n'
-            
-        return src        
+
+        return src
 
     def _gen_attr_names(self):
-        src = "    attr_names = (" + ''.join("%r," % nm for nm in self.attr) + 
')' 
+        src = "    attr_names = (" + ''.join("%r, " % nm for nm in self.attr) 
+ ')'
         return src
 
 
@@ -136,7 +140,7 @@
 r'''#-----------------------------------------------------------------
 # ** ATTENTION **
 # This code was automatically generated from the file:
-# $cfg_filename 
+# $cfg_filename
 #
 # Do not modify it directly. Modify the configuration file and
 # run the generator again.
@@ -146,7 +150,7 @@
 #
 # AST Node classes.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #-----------------------------------------------------------------
 
@@ -157,6 +161,7 @@
 
 
 class Node(object):
+    __slots__ = ()
     """ Abstract base class for AST nodes.
     """
     def children(self):
@@ -167,21 +172,21 @@
     def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, 
showcoord=False, _my_node_name=None):
         """ Pretty print the Node and all its attributes and
             children (recursively) to a buffer.
-            
-            buf:   
+
+            buf:
                 Open IO buffer into which the Node is printed.
-            
-            offset: 
-                Initial offset (amount of leading spaces) 
-            
+
+            offset:
+                Initial offset (amount of leading spaces)
+
             attrnames:
                 True if you want to see the attribute names in
                 name=value pairs. False to only see the values.
-                
+
             nodenames:
-                True if you want to see the actual node names 
+                True if you want to see the actual node names
                 within their parents.
-            
+
             showcoord:
                 Do you want the coordinates of each Node to be
                 displayed.
@@ -216,47 +221,47 @@
 
 
 class NodeVisitor(object):
-    """ A base NodeVisitor class for visiting c_ast nodes. 
+    """ A base NodeVisitor class for visiting c_ast nodes.
         Subclass it and define your own visit_XXX methods, where
-        XXX is the class name you want to visit with these 
+        XXX is the class name you want to visit with these
         methods.
-        
+
         For example:
-        
+
         class ConstantVisitor(NodeVisitor):
             def __init__(self):
                 self.values = []
-            
+
             def visit_Constant(self, node):
                 self.values.append(node.value)
 
-        Creates a list of values of all the constant nodes 
+        Creates a list of values of all the constant nodes
         encountered below the given node. To use it:
-        
+
         cv = ConstantVisitor()
         cv.visit(node)
-        
+
         Notes:
-        
-        *   generic_visit() will be called for AST nodes for which 
-            no visit_XXX method was defined. 
-        *   The children of nodes for which a visit_XXX was 
+
+        *   generic_visit() will be called for AST nodes for which
+            no visit_XXX method was defined.
+        *   The children of nodes for which a visit_XXX was
             defined will not be visited - if you need this, call
-            generic_visit() on the node. 
+            generic_visit() on the node.
             You can use:
                 NodeVisitor.generic_visit(self, node)
         *   Modeled after Python's own AST visiting facilities
             (the ast module of Python 3.0)
     """
     def visit(self, node):
-        """ Visit a node. 
+        """ Visit a node.
         """
         method = 'visit_' + node.__class__.__name__
         visitor = getattr(self, method, self.generic_visit)
         return visitor(node)
-        
+
     def generic_visit(self, node):
-        """ Called if no explicit visitor function exists for a 
+        """ Called if no explicit visitor function exists for a
             node. Implements preorder visiting of the node.
         """
         for c_name, c in node.children():
diff --git a/lib_pypy/cffi/_pycparser/_build_tables.py 
b/lib_pypy/cffi/_pycparser/_build_tables.py
--- a/lib_pypy/cffi/_pycparser/_build_tables.py
+++ b/lib_pypy/cffi/_pycparser/_build_tables.py
@@ -6,12 +6,11 @@
 # Also generates AST code from the configuration file.
 # Should be called from the pycparser directory.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #-----------------------------------------------------------------
 
 # Generate c_ast.py
-#
 from _ast_gen import ASTCodeGenerator
 ast_gen = ASTCodeGenerator('_c_ast.cfg')
 ast_gen.generate(open('c_ast.py', 'w'))
diff --git a/lib_pypy/cffi/_pycparser/_c_ast.cfg 
b/lib_pypy/cffi/_pycparser/_c_ast.cfg
--- a/lib_pypy/cffi/_pycparser/_c_ast.cfg
+++ b/lib_pypy/cffi/_pycparser/_c_ast.cfg
@@ -1,188 +1,189 @@
-#-----------------------------------------------------------------
-# pycparser: _c_ast_gen.cfg
-#
-# Defines the AST Node classes used in pycparser.
-# 
-# Each entry is a Node sub-class name, listing the attributes
-# and child nodes of the class:
-#   <name>*     - a child node
-#   <name>**    - a sequence of child nodes
-#   <name>      - an attribute
-#
-# Copyright (C) 2008-2012, Eli Bendersky
-# License: BSD
-#-----------------------------------------------------------------
-
-ArrayDecl: [type*, dim*]
-
-ArrayRef: [name*, subscript*]
-
-# op: =, +=, /= etc.
-#
-Assignment: [op, lvalue*, rvalue*]
-
-BinaryOp: [op, left*, right*]
-
-Break: []
-
-Case: [expr*, stmts**]
-
-Cast: [to_type*, expr*]
-
-# Compound statement in C99 is a list of block items (declarations or
-# statements).
-#
-Compound: [block_items**]
-
-# Compound literal (anonymous aggregate) for C99.
-# (type-name) {initializer_list}
-# type: the typename
-# init: InitList for the initializer list
-#
-CompoundLiteral: [type*, init*]
-
-# type: int, char, float, etc. see CLexer for constant token types
-#
-Constant: [type, value]
-
-Continue: []
-
-# name: the variable being declared
-# quals: list of qualifiers (const, volatile)
-# funcspec: list function specifiers (i.e. inline in C99)
-# storage: list of storage specifiers (extern, register, etc.)
-# type: declaration type (probably nested with all the modifiers)
-# init: initialization value, or None
-# bitsize: bit field size, or None
-#
-Decl: [name, quals, storage, funcspec, type*, init*, bitsize*]
-
-DeclList: [decls**]
-
-Default: [stmts**]
-
-DoWhile: [cond*, stmt*]
-
-# Represents the ellipsis (...) parameter in a function 
-# declaration
-#
-EllipsisParam: []
-
-# An empty statement (a semicolon ';' on its own)
-#
-EmptyStatement: []
-
-# Enumeration type specifier
-# name: an optional ID
-# values: an EnumeratorList
-#
-Enum: [name, values*]
-
-# A name/value pair for enumeration values
-#
-Enumerator: [name, value*]
-
-# A list of enumerators
-#
-EnumeratorList: [enumerators**]
-
-# A list of expressions separated by the comma operator.
-#
-ExprList: [exprs**]
-
-# This is the top of the AST, representing a single C file (a 
-# translation unit in K&R jargon). It contains a list of 
-# "external-declaration"s, which is either declarations (Decl),
-# Typedef or function definitions (FuncDef).
-# 
-FileAST: [ext**]
-
-# for (init; cond; next) stmt
-#
-For: [init*, cond*, next*, stmt*]
-
-# name: Id
-# args: ExprList
-#
-FuncCall: [name*, args*]
-
-# type <decl>(args)
-#
-FuncDecl: [args*, type*]
-
-# Function definition: a declarator for the function name and
-# a body, which is a compound statement. 
-# There's an optional list of parameter declarations for old
-# K&R-style definitions
-#
-FuncDef: [decl*, param_decls**, body*]
-
-Goto: [name]
-
-ID: [name]
-
-# Holder for types that are a simple identifier (e.g. the built
-# ins void, char etc. and typedef-defined types)
-#
-IdentifierType: [names]
-
-If: [cond*, iftrue*, iffalse*]
-
-# An initialization list used for compound literals.
-#
-InitList: [exprs**]
-
-Label: [name, stmt*]
-
-# A named initializer for C99.
-# The name of a NamedInitializer is a sequence of Nodes, because
-# names can be hierarchical and contain constant expressions.
-#
-NamedInitializer: [name**, expr*]
-
-# a list of comma separated function parameter declarations
-#
-ParamList: [params**]
-
-PtrDecl: [quals, type*]
-
-Return: [expr*]
-
-# name: struct tag name
-# decls: declaration of members
-#
-Struct: [name, decls**]
-
-# type: . or ->
-# name.field or name->field
-#
-StructRef: [name*, type, field*]
-
-Switch: [cond*, stmt*]
-
-# cond ? iftrue : iffalse
-#
-TernaryOp: [cond*, iftrue*, iffalse*]
-
-# A base type declaration
-#
-TypeDecl: [declname, quals, type*]
-
-# A typedef declaration.
-# Very similar to Decl, but without some attributes
-#
-Typedef: [name, quals, storage, type*]
-
-Typename: [quals, type*]
-
-UnaryOp: [op, expr*]
-
-# name: union tag name
-# decls: declaration of members
-#
-Union: [name, decls**]
-
-While: [cond*, stmt*]
-
-
-
+#-----------------------------------------------------------------
+# pycparser: _c_ast.cfg
+#
+# Defines the AST Node classes used in pycparser.
+#
+# Each entry is a Node sub-class name, listing the attributes
+# and child nodes of the class:
+#   <name>*     - a child node
+#   <name>**    - a sequence of child nodes
+#   <name>      - an attribute
+#
+# Copyright (C) 2008-2015, Eli Bendersky
+# License: BSD
+#-----------------------------------------------------------------
+
+# ArrayDecl is a nested declaration of an array with the given type.
+# dim: the dimension (for example, constant 42)
+# dim_quals: list of dimension qualifiers, to support C99's allowing 'const'
+#            and 'static' within the array dimension in function declarations.
+ArrayDecl: [type*, dim*, dim_quals]
+
+ArrayRef: [name*, subscript*]
+
+# op: =, +=, /= etc.
+#
+Assignment: [op, lvalue*, rvalue*]
+
+BinaryOp: [op, left*, right*]
+
+Break: []
+
+Case: [expr*, stmts**]
+
+Cast: [to_type*, expr*]
+
+# Compound statement in C99 is a list of block items (declarations or
+# statements).
+#
+Compound: [block_items**]
+
+# Compound literal (anonymous aggregate) for C99.
+# (type-name) {initializer_list}
+# type: the typename
+# init: InitList for the initializer list
+#
+CompoundLiteral: [type*, init*]
+
+# type: int, char, float, etc. see CLexer for constant token types
+#
+Constant: [type, value]
+
+Continue: []
+
+# name: the variable being declared
+# quals: list of qualifiers (const, volatile)
+# funcspec: list function specifiers (i.e. inline in C99)
+# storage: list of storage specifiers (extern, register, etc.)
+# type: declaration type (probably nested with all the modifiers)
+# init: initialization value, or None
+# bitsize: bit field size, or None
+#
+Decl: [name, quals, storage, funcspec, type*, init*, bitsize*]
+
+DeclList: [decls**]
+
+Default: [stmts**]
+
+DoWhile: [cond*, stmt*]
+
+# Represents the ellipsis (...) parameter in a function
+# declaration
+#
+EllipsisParam: []
+
+# An empty statement (a semicolon ';' on its own)
+#
+EmptyStatement: []
+
+# Enumeration type specifier
+# name: an optional ID
+# values: an EnumeratorList
+#
+Enum: [name, values*]
+
+# A name/value pair for enumeration values
+#
+Enumerator: [name, value*]
+
+# A list of enumerators
+#
+EnumeratorList: [enumerators**]
+
+# A list of expressions separated by the comma operator.
+#
+ExprList: [exprs**]
+
+# This is the top of the AST, representing a single C file (a
+# translation unit in K&R jargon). It contains a list of
+# "external-declaration"s, which is either declarations (Decl),
+# Typedef or function definitions (FuncDef).
+#
+FileAST: [ext**]
+
+# for (init; cond; next) stmt
+#
+For: [init*, cond*, next*, stmt*]
+
+# name: Id
+# args: ExprList
+#
+FuncCall: [name*, args*]
+
+# type <decl>(args)
+#
+FuncDecl: [args*, type*]
+
+# Function definition: a declarator for the function name and
+# a body, which is a compound statement.
+# There's an optional list of parameter declarations for old
+# K&R-style definitions
+#
+FuncDef: [decl*, param_decls**, body*]
+
+Goto: [name]
+
+ID: [name]
+
+# Holder for types that are a simple identifier (e.g. the built
+# ins void, char etc. and typedef-defined types)
+#
+IdentifierType: [names]
+
+If: [cond*, iftrue*, iffalse*]
+
+# An initialization list used for compound literals.
+#
+InitList: [exprs**]
+
+Label: [name, stmt*]
+
+# A named initializer for C99.
+# The name of a NamedInitializer is a sequence of Nodes, because
+# names can be hierarchical and contain constant expressions.
+#
+NamedInitializer: [name**, expr*]
+
+# a list of comma separated function parameter declarations
+#
+ParamList: [params**]
+
+PtrDecl: [quals, type*]
+
+Return: [expr*]
+
+# name: struct tag name
+# decls: declaration of members
+#
+Struct: [name, decls**]
+
+# type: . or ->
+# name.field or name->field
+#
+StructRef: [name*, type, field*]
+
+Switch: [cond*, stmt*]
+
+# cond ? iftrue : iffalse
+#
+TernaryOp: [cond*, iftrue*, iffalse*]
+
+# A base type declaration
+#
+TypeDecl: [declname, quals, type*]
+
+# A typedef declaration.
+# Very similar to Decl, but without some attributes
+#
+Typedef: [name, quals, storage, type*]
+
+Typename: [name, quals, type*]
+
+UnaryOp: [op, expr*]
+
+# name: union tag name
+# decls: declaration of members
+#
+Union: [name, decls**]
+
+While: [cond*, stmt*]
diff --git a/lib_pypy/cffi/_pycparser/ast_transforms.py 
b/lib_pypy/cffi/_pycparser/ast_transforms.py
--- a/lib_pypy/cffi/_pycparser/ast_transforms.py
+++ b/lib_pypy/cffi/_pycparser/ast_transforms.py
@@ -3,7 +3,7 @@
 #
 # Some utilities used by the parser to create a friendlier AST.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #------------------------------------------------------------------------------
 
@@ -84,7 +84,7 @@
             _extract_nested_case(child, new_compound.block_items)
             last_case = new_compound.block_items[-1]
         else:
-            # Other statements are added as childrent to the last case, if it
+            # Other statements are added as children to the last case, if it
             # exists.
             if last_case is None:
                 new_compound.block_items.append(child)
diff --git a/lib_pypy/cffi/_pycparser/c_ast.py 
b/lib_pypy/cffi/_pycparser/c_ast.py
--- a/lib_pypy/cffi/_pycparser/c_ast.py
+++ b/lib_pypy/cffi/_pycparser/c_ast.py
@@ -1,7 +1,7 @@
 #-----------------------------------------------------------------
 # ** ATTENTION **
 # This code was automatically generated from the file:
-# _c_ast.cfg 
+# _c_ast.cfg
 #
 # Do not modify it directly. Modify the configuration file and
 # run the generator again.
@@ -11,7 +11,7 @@
 #
 # AST Node classes.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #-----------------------------------------------------------------
 
@@ -20,6 +20,7 @@
 
 
 class Node(object):
+    __slots__ = ()
     """ Abstract base class for AST nodes.
     """
     def children(self):
@@ -30,21 +31,21 @@
     def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, 
showcoord=False, _my_node_name=None):
         """ Pretty print the Node and all its attributes and
             children (recursively) to a buffer.
-            
-            buf:   
+
+            buf:
                 Open IO buffer into which the Node is printed.
-            
-            offset: 
-                Initial offset (amount of leading spaces) 
-            
+
+            offset:
+                Initial offset (amount of leading spaces)
+
             attrnames:
                 True if you want to see the attribute names in
                 name=value pairs. False to only see the values.
-                
+
             nodenames:
-                True if you want to see the actual node names 
+                True if you want to see the actual node names
                 within their parents.
-            
+
             showcoord:
                 Do you want the coordinates of each Node to be
                 displayed.
@@ -79,47 +80,47 @@
 
 
 class NodeVisitor(object):
-    """ A base NodeVisitor class for visiting c_ast nodes. 
+    """ A base NodeVisitor class for visiting c_ast nodes.
         Subclass it and define your own visit_XXX methods, where
-        XXX is the class name you want to visit with these 
+        XXX is the class name you want to visit with these
         methods.
-        
+
         For example:
-        
+
         class ConstantVisitor(NodeVisitor):
             def __init__(self):
                 self.values = []
-            
+
             def visit_Constant(self, node):
                 self.values.append(node.value)
 
-        Creates a list of values of all the constant nodes 
+        Creates a list of values of all the constant nodes
         encountered below the given node. To use it:
-        
+
         cv = ConstantVisitor()
         cv.visit(node)
-        
+
         Notes:
-        
-        *   generic_visit() will be called for AST nodes for which 
-            no visit_XXX method was defined. 
-        *   The children of nodes for which a visit_XXX was 
+
+        *   generic_visit() will be called for AST nodes for which
+            no visit_XXX method was defined.
+        *   The children of nodes for which a visit_XXX was
             defined will not be visited - if you need this, call
-            generic_visit() on the node. 
+            generic_visit() on the node.
             You can use:
                 NodeVisitor.generic_visit(self, node)
         *   Modeled after Python's own AST visiting facilities
             (the ast module of Python 3.0)
     """
     def visit(self, node):
-        """ Visit a node. 
+        """ Visit a node.
         """
         method = 'visit_' + node.__class__.__name__
         visitor = getattr(self, method, self.generic_visit)
         return visitor(node)
-        
+
     def generic_visit(self, node):
-        """ Called if no explicit visitor function exists for a 
+        """ Called if no explicit visitor function exists for a
             node. Implements preorder visiting of the node.
         """
         for c_name, c in node.children():
@@ -127,9 +128,11 @@
 
 
 class ArrayDecl(Node):
-    def __init__(self, type, dim, coord=None):
+    __slots__ = ('type', 'dim', 'dim_quals', 'coord', '__weakref__')
+    def __init__(self, type, dim, dim_quals, coord=None):
         self.type = type
         self.dim = dim
+        self.dim_quals = dim_quals
         self.coord = coord
 
     def children(self):
@@ -138,9 +141,10 @@
         if self.dim is not None: nodelist.append(("dim", self.dim))
         return tuple(nodelist)
 
-    attr_names = ()
+    attr_names = ('dim_quals', )
 
 class ArrayRef(Node):
+    __slots__ = ('name', 'subscript', 'coord', '__weakref__')
     def __init__(self, name, subscript, coord=None):
         self.name = name
         self.subscript = subscript
@@ -155,6 +159,7 @@
     attr_names = ()
 
 class Assignment(Node):
+    __slots__ = ('op', 'lvalue', 'rvalue', 'coord', '__weakref__')
     def __init__(self, op, lvalue, rvalue, coord=None):
         self.op = op
         self.lvalue = lvalue
@@ -167,9 +172,10 @@
         if self.rvalue is not None: nodelist.append(("rvalue", self.rvalue))
         return tuple(nodelist)
 
-    attr_names = ('op',)
+    attr_names = ('op', )
 
 class BinaryOp(Node):
+    __slots__ = ('op', 'left', 'right', 'coord', '__weakref__')
     def __init__(self, op, left, right, coord=None):
         self.op = op
         self.left = left
@@ -182,9 +188,10 @@
         if self.right is not None: nodelist.append(("right", self.right))
         return tuple(nodelist)
 
-    attr_names = ('op',)
+    attr_names = ('op', )
 
 class Break(Node):
+    __slots__ = ('coord', '__weakref__')
     def __init__(self, coord=None):
         self.coord = coord
 
@@ -194,6 +201,7 @@
     attr_names = ()
 
 class Case(Node):
+    __slots__ = ('expr', 'stmts', 'coord', '__weakref__')
     def __init__(self, expr, stmts, coord=None):
         self.expr = expr
         self.stmts = stmts
@@ -209,6 +217,7 @@
     attr_names = ()
 
 class Cast(Node):
+    __slots__ = ('to_type', 'expr', 'coord', '__weakref__')
     def __init__(self, to_type, expr, coord=None):
         self.to_type = to_type
         self.expr = expr
@@ -223,6 +232,7 @@
     attr_names = ()
 
 class Compound(Node):
+    __slots__ = ('block_items', 'coord', '__weakref__')
     def __init__(self, block_items, coord=None):
         self.block_items = block_items
         self.coord = coord
@@ -236,6 +246,7 @@
     attr_names = ()
 
 class CompoundLiteral(Node):
+    __slots__ = ('type', 'init', 'coord', '__weakref__')
     def __init__(self, type, init, coord=None):
         self.type = type
         self.init = init
@@ -250,6 +261,7 @@
     attr_names = ()
 
 class Constant(Node):
+    __slots__ = ('type', 'value', 'coord', '__weakref__')
     def __init__(self, type, value, coord=None):
         self.type = type
         self.value = value
@@ -259,9 +271,10 @@
         nodelist = []
         return tuple(nodelist)
 
-    attr_names = ('type','value',)
+    attr_names = ('type', 'value', )
 
 class Continue(Node):
+    __slots__ = ('coord', '__weakref__')
     def __init__(self, coord=None):
         self.coord = coord
 
@@ -271,6 +284,7 @@
     attr_names = ()
 
 class Decl(Node):
+    __slots__ = ('name', 'quals', 'storage', 'funcspec', 'type', 'init', 
'bitsize', 'coord', '__weakref__')
     def __init__(self, name, quals, storage, funcspec, type, init, bitsize, 
coord=None):
         self.name = name
         self.quals = quals
@@ -288,9 +302,10 @@
         if self.bitsize is not None: nodelist.append(("bitsize", self.bitsize))
         return tuple(nodelist)
 
-    attr_names = ('name','quals','storage','funcspec',)
+    attr_names = ('name', 'quals', 'storage', 'funcspec', )
 
 class DeclList(Node):
+    __slots__ = ('decls', 'coord', '__weakref__')
     def __init__(self, decls, coord=None):
         self.decls = decls
         self.coord = coord
@@ -304,6 +319,7 @@
     attr_names = ()
 
 class Default(Node):
+    __slots__ = ('stmts', 'coord', '__weakref__')
     def __init__(self, stmts, coord=None):
         self.stmts = stmts
         self.coord = coord
@@ -317,6 +333,7 @@
     attr_names = ()
 
 class DoWhile(Node):
+    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
     def __init__(self, cond, stmt, coord=None):
         self.cond = cond
         self.stmt = stmt
@@ -331,6 +348,7 @@
     attr_names = ()
 
 class EllipsisParam(Node):
+    __slots__ = ('coord', '__weakref__')
     def __init__(self, coord=None):
         self.coord = coord
 
@@ -340,6 +358,7 @@
     attr_names = ()
 
 class EmptyStatement(Node):
+    __slots__ = ('coord', '__weakref__')
     def __init__(self, coord=None):
         self.coord = coord
 
@@ -349,6 +368,7 @@
     attr_names = ()
 
 class Enum(Node):
+    __slots__ = ('name', 'values', 'coord', '__weakref__')
     def __init__(self, name, values, coord=None):
         self.name = name
         self.values = values
@@ -359,9 +379,10 @@
         if self.values is not None: nodelist.append(("values", self.values))
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class Enumerator(Node):
+    __slots__ = ('name', 'value', 'coord', '__weakref__')
     def __init__(self, name, value, coord=None):
         self.name = name
         self.value = value
@@ -372,9 +393,10 @@
         if self.value is not None: nodelist.append(("value", self.value))
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class EnumeratorList(Node):
+    __slots__ = ('enumerators', 'coord', '__weakref__')
     def __init__(self, enumerators, coord=None):
         self.enumerators = enumerators
         self.coord = coord
@@ -388,6 +410,7 @@
     attr_names = ()
 
 class ExprList(Node):
+    __slots__ = ('exprs', 'coord', '__weakref__')
     def __init__(self, exprs, coord=None):
         self.exprs = exprs
         self.coord = coord
@@ -401,6 +424,7 @@
     attr_names = ()
 
 class FileAST(Node):
+    __slots__ = ('ext', 'coord', '__weakref__')
     def __init__(self, ext, coord=None):
         self.ext = ext
         self.coord = coord
@@ -414,6 +438,7 @@
     attr_names = ()
 
 class For(Node):
+    __slots__ = ('init', 'cond', 'next', 'stmt', 'coord', '__weakref__')
     def __init__(self, init, cond, next, stmt, coord=None):
         self.init = init
         self.cond = cond
@@ -432,6 +457,7 @@
     attr_names = ()
 
 class FuncCall(Node):
+    __slots__ = ('name', 'args', 'coord', '__weakref__')
     def __init__(self, name, args, coord=None):
         self.name = name
         self.args = args
@@ -446,6 +472,7 @@
     attr_names = ()
 
 class FuncDecl(Node):
+    __slots__ = ('args', 'type', 'coord', '__weakref__')
     def __init__(self, args, type, coord=None):
         self.args = args
         self.type = type
@@ -460,6 +487,7 @@
     attr_names = ()
 
 class FuncDef(Node):
+    __slots__ = ('decl', 'param_decls', 'body', 'coord', '__weakref__')
     def __init__(self, decl, param_decls, body, coord=None):
         self.decl = decl
         self.param_decls = param_decls
@@ -477,6 +505,7 @@
     attr_names = ()
 
 class Goto(Node):
+    __slots__ = ('name', 'coord', '__weakref__')
     def __init__(self, name, coord=None):
         self.name = name
         self.coord = coord
@@ -485,9 +514,10 @@
         nodelist = []
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class ID(Node):
+    __slots__ = ('name', 'coord', '__weakref__')
     def __init__(self, name, coord=None):
         self.name = name
         self.coord = coord
@@ -496,9 +526,10 @@
         nodelist = []
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class IdentifierType(Node):
+    __slots__ = ('names', 'coord', '__weakref__')
     def __init__(self, names, coord=None):
         self.names = names
         self.coord = coord
@@ -507,9 +538,10 @@
         nodelist = []
         return tuple(nodelist)
 
-    attr_names = ('names',)
+    attr_names = ('names', )
 
 class If(Node):
+    __slots__ = ('cond', 'iftrue', 'iffalse', 'coord', '__weakref__')
     def __init__(self, cond, iftrue, iffalse, coord=None):
         self.cond = cond
         self.iftrue = iftrue
@@ -526,6 +558,7 @@
     attr_names = ()
 
 class InitList(Node):
+    __slots__ = ('exprs', 'coord', '__weakref__')
     def __init__(self, exprs, coord=None):
         self.exprs = exprs
         self.coord = coord
@@ -539,6 +572,7 @@
     attr_names = ()
 
 class Label(Node):
+    __slots__ = ('name', 'stmt', 'coord', '__weakref__')
     def __init__(self, name, stmt, coord=None):
         self.name = name
         self.stmt = stmt
@@ -549,9 +583,10 @@
         if self.stmt is not None: nodelist.append(("stmt", self.stmt))
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class NamedInitializer(Node):
+    __slots__ = ('name', 'expr', 'coord', '__weakref__')
     def __init__(self, name, expr, coord=None):
         self.name = name
         self.expr = expr
@@ -567,6 +602,7 @@
     attr_names = ()
 
 class ParamList(Node):
+    __slots__ = ('params', 'coord', '__weakref__')
     def __init__(self, params, coord=None):
         self.params = params
         self.coord = coord
@@ -580,6 +616,7 @@
     attr_names = ()
 
 class PtrDecl(Node):
+    __slots__ = ('quals', 'type', 'coord', '__weakref__')
     def __init__(self, quals, type, coord=None):
         self.quals = quals
         self.type = type
@@ -590,9 +627,10 @@
         if self.type is not None: nodelist.append(("type", self.type))
         return tuple(nodelist)
 
-    attr_names = ('quals',)
+    attr_names = ('quals', )
 
 class Return(Node):
+    __slots__ = ('expr', 'coord', '__weakref__')
     def __init__(self, expr, coord=None):
         self.expr = expr
         self.coord = coord
@@ -605,6 +643,7 @@
     attr_names = ()
 
 class Struct(Node):
+    __slots__ = ('name', 'decls', 'coord', '__weakref__')
     def __init__(self, name, decls, coord=None):
         self.name = name
         self.decls = decls
@@ -616,9 +655,10 @@
             nodelist.append(("decls[%d]" % i, child))
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class StructRef(Node):
+    __slots__ = ('name', 'type', 'field', 'coord', '__weakref__')
     def __init__(self, name, type, field, coord=None):
         self.name = name
         self.type = type
@@ -631,9 +671,10 @@
         if self.field is not None: nodelist.append(("field", self.field))
         return tuple(nodelist)
 
-    attr_names = ('type',)
+    attr_names = ('type', )
 
 class Switch(Node):
+    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
     def __init__(self, cond, stmt, coord=None):
         self.cond = cond
         self.stmt = stmt
@@ -648,6 +689,7 @@
     attr_names = ()
 
 class TernaryOp(Node):
+    __slots__ = ('cond', 'iftrue', 'iffalse', 'coord', '__weakref__')
     def __init__(self, cond, iftrue, iffalse, coord=None):
         self.cond = cond
         self.iftrue = iftrue
@@ -664,6 +706,7 @@
     attr_names = ()
 
 class TypeDecl(Node):
+    __slots__ = ('declname', 'quals', 'type', 'coord', '__weakref__')
     def __init__(self, declname, quals, type, coord=None):
         self.declname = declname
         self.quals = quals
@@ -675,9 +718,10 @@
         if self.type is not None: nodelist.append(("type", self.type))
         return tuple(nodelist)
 
-    attr_names = ('declname','quals',)
+    attr_names = ('declname', 'quals', )
 
 class Typedef(Node):
+    __slots__ = ('name', 'quals', 'storage', 'type', 'coord', '__weakref__')
     def __init__(self, name, quals, storage, type, coord=None):
         self.name = name
         self.quals = quals
@@ -690,10 +734,12 @@
         if self.type is not None: nodelist.append(("type", self.type))
         return tuple(nodelist)
 
-    attr_names = ('name','quals','storage',)
+    attr_names = ('name', 'quals', 'storage', )
 
 class Typename(Node):
-    def __init__(self, quals, type, coord=None):
+    __slots__ = ('name', 'quals', 'type', 'coord', '__weakref__')
+    def __init__(self, name, quals, type, coord=None):
+        self.name = name
         self.quals = quals
         self.type = type
         self.coord = coord
@@ -703,9 +749,10 @@
         if self.type is not None: nodelist.append(("type", self.type))
         return tuple(nodelist)
 
-    attr_names = ('quals',)
+    attr_names = ('name', 'quals', )
 
 class UnaryOp(Node):
+    __slots__ = ('op', 'expr', 'coord', '__weakref__')
     def __init__(self, op, expr, coord=None):
         self.op = op
         self.expr = expr
@@ -716,9 +763,10 @@
         if self.expr is not None: nodelist.append(("expr", self.expr))
         return tuple(nodelist)
 
-    attr_names = ('op',)
+    attr_names = ('op', )
 
 class Union(Node):
+    __slots__ = ('name', 'decls', 'coord', '__weakref__')
     def __init__(self, name, decls, coord=None):
         self.name = name
         self.decls = decls
@@ -730,9 +778,10 @@
             nodelist.append(("decls[%d]" % i, child))
         return tuple(nodelist)
 
-    attr_names = ('name',)
+    attr_names = ('name', )
 
 class While(Node):
+    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
     def __init__(self, cond, stmt, coord=None):
         self.cond = cond
         self.stmt = stmt
diff --git a/lib_pypy/cffi/_pycparser/c_generator.py 
b/lib_pypy/cffi/_pycparser/c_generator.py
--- a/lib_pypy/cffi/_pycparser/c_generator.py
+++ b/lib_pypy/cffi/_pycparser/c_generator.py
@@ -3,7 +3,7 @@
 #
 # C code generator from pycparser AST nodes.
 #
-# Copyright (C) 2008-2012, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #------------------------------------------------------------------------------
 from . import c_ast
@@ -15,8 +15,6 @@
         generic_visit.
     """
     def __init__(self):
-        self.output = ''
-
         # Statements start with indentation of self.indent_level spaces, using
         # the _make_indent method
         #
@@ -34,7 +32,7 @@
         if node is None:
             return ''
         else:
-            return ''.join(self.visit(c) for c in node.children())
+            return ''.join(self.visit(c) for c_name, c in node.children())
 
     def visit_Constant(self, n):
         return n.value
@@ -83,19 +81,22 @@
     def visit_IdentifierType(self, n):
         return ' '.join(n.names)
 
+    def _visit_expr(self, n):
+        if isinstance(n, c_ast.InitList):
+            return '{' + self.visit(n) + '}'
+        elif isinstance(n, c_ast.ExprList):
+            return '(' + self.visit(n) + ')'
+        else:
+            return self.visit(n)
+
     def visit_Decl(self, n, no_type=False):
         # no_type is used when a Decl is part of a DeclList, where the type is
-        # explicitly only for the first delaration in a list.
+        # explicitly only for the first declaration in a list.
         #
         s = n.name if no_type else self._generate_decl(n)
         if n.bitsize: s += ' : ' + self.visit(n.bitsize)
         if n.init:
-            if isinstance(n.init, c_ast.InitList):
-                s += ' = {' + self.visit(n.init) + '}'
-            elif isinstance(n.init, c_ast.ExprList):
-                s += ' = (' + self.visit(n.init) + ')'
-            else:
-                s += ' = ' + self.visit(n.init)
+            s += ' = ' + self._visit_expr(n.init)
         return s
 
     def visit_DeclList(self, n):
@@ -118,21 +119,13 @@
     def visit_ExprList(self, n):
         visited_subexprs = []
         for expr in n.exprs:
-            if isinstance(expr, c_ast.ExprList):
-                visited_subexprs.append('{' + self.visit(expr) + '}')
-            else:
-                visited_subexprs.append(self.visit(expr))
+            visited_subexprs.append(self._visit_expr(expr))
         return ', '.join(visited_subexprs)
 
     def visit_InitList(self, n):
         visited_subexprs = []
         for expr in n.exprs:
-            if isinstance(expr, c_ast.ExprList):
-                visited_subexprs.append('(' + self.visit(expr) + ')')
-            elif isinstance(expr, c_ast.InitList):
-                visited_subexprs.append('{' + self.visit(expr) + '}')
-            else:
-                visited_subexprs.append(self.visit(expr))
+            visited_subexprs.append(self._visit_expr(expr))
         return ', '.join(visited_subexprs)
 
     def visit_Enum(self, n):
@@ -195,9 +188,9 @@
         return 'continue;'
 
     def visit_TernaryOp(self, n):
-        s = self.visit(n.cond) + ' ? '
-        s += self.visit(n.iftrue) + ' : '
-        s += self.visit(n.iffalse)
+        s = self._visit_expr(n.cond) + ' ? '
+        s += self._visit_expr(n.iftrue) + ' : '
+        s += self._visit_expr(n.iffalse)
         return s
 
     def visit_If(self, n):
@@ -281,6 +274,9 @@
         s += ' = ' + self.visit(n.expr)
         return s
 
+    def visit_FuncDecl(self, n):
+        return self._generate_type(n)
+
     def _generate_struct_union(self, n, name):
         """ Generates code for structs and unions. name should be either
             'struct' or union.
@@ -384,7 +380,7 @@
         """ Visits 'n' and returns its string representation, parenthesized
             if the condition function applied to the node returns True.
         """
-        s = self.visit(n)
+        s = self._visit_expr(n)
         if condition(n):
             return '(' + s + ')'
         else:
@@ -401,5 +397,3 @@
         """
         return isinstance(n,(   c_ast.Constant, c_ast.ID, c_ast.ArrayRef,
                                 c_ast.StructRef, c_ast.FuncCall))
-
-
diff --git a/lib_pypy/cffi/_pycparser/c_lexer.py 
b/lib_pypy/cffi/_pycparser/c_lexer.py
--- a/lib_pypy/cffi/_pycparser/c_lexer.py
+++ b/lib_pypy/cffi/_pycparser/c_lexer.py
@@ -3,7 +3,7 @@
 #
 # CLexer class: lexer for the C language
 #
-# Copyright (C) 2008-2013, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #------------------------------------------------------------------------------
 import re
@@ -102,7 +102,8 @@
     keywords = (
         '_BOOL', '_COMPLEX', 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST',
         'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN',
-        'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', 'REGISTER',
+        'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG', 
+        'REGISTER', 'OFFSETOF',
         'RESTRICT', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT',
         'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID',
         'VOLATILE', 'WHILE',
@@ -129,7 +130,7 @@
         'TYPEID',
 
         # constants
-        'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX',
+        'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX', 'INT_CONST_BIN',
         'FLOAT_CONST', 'HEX_FLOAT_CONST',
         'CHAR_CONST',
         'WCHAR_CONST',
@@ -183,12 +184,15 @@
 
     hex_prefix = '0[xX]'
     hex_digits = '[0-9a-fA-F]+'
+    bin_prefix = '0[bB]'
+    bin_digits = '[01]+'
 
     # integer constants (K&R2: A.2.5.1)
     integer_suffix_opt = 
r'(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?'
     decimal_constant = 
'(0'+integer_suffix_opt+')|([1-9][0-9]*'+integer_suffix_opt+')'
     octal_constant = '0[0-7]*'+integer_suffix_opt
     hex_constant = hex_prefix+hex_digits+integer_suffix_opt
+    bin_constant = bin_prefix+bin_digits+integer_suffix_opt
 
     bad_octal_constant = '0[0-7]*[89]'
 
@@ -302,7 +306,7 @@
         r'pragma'
         pass
 
-    t_pppragma_ignore = ' \t<>.-{}();+-*/$%@&^~!?:,0123456789'
+    t_pppragma_ignore = ' \t<>.-{}();=+-*/$%@&^~!?:,0123456789'
 
     @TOKEN(string_literal)
     def t_pppragma_STR(self, t): pass
@@ -419,6 +423,10 @@
     def t_INT_CONST_HEX(self, t):
         return t
 
+    @TOKEN(bin_constant)
+    def t_INT_CONST_BIN(self, t):
+        return t
+
     @TOKEN(bad_octal_constant)
     def t_BAD_CONST_OCT(self, t):
         msg = "Invalid octal constant"
diff --git a/lib_pypy/cffi/_pycparser/c_parser.py 
b/lib_pypy/cffi/_pycparser/c_parser.py
--- a/lib_pypy/cffi/_pycparser/c_parser.py
+++ b/lib_pypy/cffi/_pycparser/c_parser.py
@@ -3,7 +3,7 @@
 #
 # CParser class: Parser and AST builder for the C language
 #
-# Copyright (C) 2008-2013, Eli Bendersky
+# Copyright (C) 2008-2015, Eli Bendersky
 # License: BSD
 #------------------------------------------------------------------------------
 import re
@@ -23,7 +23,8 @@
             lextab='cffi._pycparser.lextab',
             yacc_optimize=True,
             yacctab='cffi._pycparser.yacctab',
-            yacc_debug=False):
+            yacc_debug=False,
+            taboutputdir=''):
         """ Create a new CParser.
 
             Some arguments for controlling the debug/optimization
@@ -64,6 +65,10 @@
             yacc_debug:
                 Generate a parser.out file that explains how yacc
                 built the parsing table from the grammar.
+
+            taboutputdir:
+                Set this parameter to control the location of generated
+                lextab and yacctab files.
         """
         self.clex = CLexer(
             error_func=self._lex_error_func,
@@ -73,7 +78,8 @@
 
         self.clex.build(
             optimize=lex_optimize,
-            lextab=lextab)
+            lextab=lextab,
+            outputdir=taboutputdir)
         self.tokens = self.clex.tokens
 
         rules_with_opt = [
@@ -85,6 +91,7 @@
             'expression',
             'identifier_list',
             'init_declarator_list',
+            'initializer_list',
             'parameter_type_list',
             'specifier_qualifier_list',
             'block_item_list',
@@ -100,7 +107,8 @@
             start='translation_unit_or_empty',
             debug=yacc_debug,
             optimize=yacc_optimize,
-            tabmodule=yacctab)
+            tabmodule=yacctab,
+            outputdir=taboutputdir)
 
         # Stack of scopes for keeping track of symbols. _scope_stack[-1] is
         # the current (topmost) scope. Each scope is a dictionary that
@@ -211,13 +219,11 @@
     # The basic declaration here is 'int c', and the pointer and
     # the array are the modifiers.
     #
-    # Basic declarations are represented by TypeDecl (from module
-    # c_ast) and the modifiers are FuncDecl, PtrDecl and
-    # ArrayDecl.
+    # Basic declarations are represented by TypeDecl (from module c_ast) and 
the
+    # modifiers are FuncDecl, PtrDecl and ArrayDecl.
     #
-    # The standard states that whenever a new modifier is parsed,
-    # it should be added to the end of the list of modifiers. For
-    # example:
+    # The standard states that whenever a new modifier is parsed, it should be
+    # added to the end of the list of modifiers. For example:
     #
     # K&R2 A.8.6.2: Array Declarators
     #
@@ -236,7 +242,6 @@
     # useful for pointers, that can come as a chain from the rule
     # p_pointer. In this case, the whole modifier list is spliced
     # into the new location.
-    #
     def _type_modify_decl(self, decl, modifier):
         """ Tacks a type modifier on a declarator, and returns
             the modified declarator.
@@ -983,28 +988,52 @@
         p[0] = p[2]
 
     def p_direct_declarator_3(self, p):
-        """ direct_declarator   : direct_declarator LBRACKET 
assignment_expression_opt RBRACKET
+        """ direct_declarator   : direct_declarator LBRACKET 
type_qualifier_list_opt assignment_expression_opt RBRACKET
         """
+        quals = (p[3] if len(p) > 5 else []) or []
+        # Accept dimension qualifiers
+        # Per C99 6.7.5.3 p7
         arr = c_ast.ArrayDecl(
             type=None,
-            dim=p[3],
+            dim=p[4] if len(p) > 5 else p[3],
+            dim_quals=quals,
+            coord=p[1].coord)
+
+        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
+
+    def p_direct_declarator_4(self, p):
+        """ direct_declarator   : direct_declarator LBRACKET STATIC 
type_qualifier_list_opt assignment_expression RBRACKET
+                                | direct_declarator LBRACKET 
type_qualifier_list STATIC assignment_expression RBRACKET
+        """
+        # Using slice notation for PLY objects doesn't work in Python 3 for the
+        # version of PLY embedded with pycparser; see PLY Google Code issue 30.
+        # Work around that here by listing the two elements separately.
+        listed_quals = [item if isinstance(item, list) else [item]
+            for item in [p[3],p[4]]]
+        dim_quals = [qual for sublist in listed_quals for qual in sublist
+            if qual is not None]
+        arr = c_ast.ArrayDecl(
+            type=None,
+            dim=p[5],
+            dim_quals=dim_quals,
             coord=p[1].coord)
 
         p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
 
     # Special for VLAs
     #
-    def p_direct_declarator_4(self, p):
-        """ direct_declarator   : direct_declarator LBRACKET TIMES RBRACKET
+    def p_direct_declarator_5(self, p):
+        """ direct_declarator   : direct_declarator LBRACKET 
type_qualifier_list_opt TIMES RBRACKET
         """
         arr = c_ast.ArrayDecl(
             type=None,
-            dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
+            dim=c_ast.ID(p[4], self._coord(p.lineno(4))),
+            dim_quals=p[3] if p[3] != None else [],
             coord=p[1].coord)
 
         p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
 
-    def p_direct_declarator_5(self, p):
+    def p_direct_declarator_6(self, p):
         """ direct_declarator   : direct_declarator LPAREN parameter_type_list 
RPAREN
                                 | direct_declarator LPAREN identifier_list_opt 
RPAREN
         """
@@ -1037,11 +1066,30 @@
                     | TIMES type_qualifier_list_opt pointer
         """
         coord = self._coord(p.lineno(1))
-
-        p[0] = c_ast.PtrDecl(
-            quals=p[2] or [],
-            type=p[3] if len(p) > 3 else None,
-            coord=coord)
+        # Pointer decls nest from inside out. This is important when different
+        # levels have different qualifiers. For example:
+        #
+        #  char * const * p;
+        #
+        # Means "pointer to const pointer to char"
+        #
+        # While: 
+        #
+        #  char ** const p;
+        #
+        # Means "const pointer to pointer to char"
+        #
+        # So when we construct PtrDecl nestings, the leftmost pointer goes in
+        # as the most nested type.
+        nested_type = c_ast.PtrDecl(quals=p[2] or [], type=None, coord=coord)
+        if len(p) > 3:
+            tail_type = p[3]
+            while tail_type.type is not None:
+                tail_type = tail_type.type
+            tail_type.type = nested_type
+            p[0] = p[3]
+        else:
+            p[0] = nested_type
 
     def p_type_qualifier_list(self, p):
         """ type_qualifier_list : type_qualifier
@@ -1101,6 +1149,7 @@
         #
         else:
             decl = c_ast.Typename(
+                name='',
                 quals=spec['qual'],
                 type=p[2] or c_ast.TypeDecl(None, None, None),
                 coord=self._coord(p.lineno(2)))
@@ -1125,10 +1174,13 @@
         p[0] = p[1]
 
     def p_initializer_2(self, p):
-        """ initializer : brace_open initializer_list brace_close
+        """ initializer : brace_open initializer_list_opt brace_close
                         | brace_open initializer_list COMMA brace_close
         """
-        p[0] = p[2]
+        if p[2] is None:
+            p[0] = c_ast.InitList([], self._coord(p.lineno(1)))
+        else:
+            p[0] = p[2]
 
     def p_initializer_list(self, p):
         """ initializer_list    : designation_opt initializer
@@ -1172,6 +1224,7 @@
         #~ print '=========='
 
         typename = c_ast.Typename(
+            name='',
             quals=p[1]['qual'],
             type=p[2] or c_ast.TypeDecl(None, None, None),
             coord=self._coord(p.lineno(2)))
@@ -1211,6 +1264,7 @@
         arr = c_ast.ArrayDecl(
             type=None,
             dim=p[3],
+            dim_quals=[],
             coord=p[1].coord)
 
         p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
@@ -1221,6 +1275,7 @@
         p[0] = c_ast.ArrayDecl(
             type=c_ast.TypeDecl(None, None, None),
             dim=p[2],
+            dim_quals=[],
             coord=self._coord(p.lineno(1)))
 
     def p_direct_abstract_declarator_4(self, p):
@@ -1229,6 +1284,7 @@
         arr = c_ast.ArrayDecl(
             type=None,
             dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
+            dim_quals=[],
             coord=p[1].coord)
 
         p[0] = self._type_modify_decl(decl=p[1], modifier=arr)
@@ -1239,6 +1295,7 @@
         p[0] = c_ast.ArrayDecl(
             type=c_ast.TypeDecl(None, None, None),
             dim=c_ast.ID(p[3], self._coord(p.lineno(3))),
+            dim_quals=[],
             coord=self._coord(p.lineno(1)))
 
     def p_direct_abstract_declarator_6(self, p):
@@ -1322,7 +1379,8 @@
 
     def p_iteration_statement_4(self, p):
         """ iteration_statement : FOR LPAREN declaration expression_opt SEMI 
expression_opt RPAREN statement """
-        p[0] = c_ast.For(c_ast.DeclList(p[3]), p[4], p[6], p[8], 
self._coord(p.lineno(1)))
+        p[0] = c_ast.For(c_ast.DeclList(p[3], self._coord(p.lineno(1))),
+                         p[4], p[6], p[8], self._coord(p.lineno(1)))
 
     def p_jump_statement_1(self, p):
         """ jump_statement  : GOTO ID SEMI """
@@ -1525,6 +1583,14 @@
         """ primary_expression  : LPAREN expression RPAREN """
         p[0] = p[2]
 
+    def p_primary_expression_5(self, p):
+        """ primary_expression  : OFFSETOF LPAREN type_name COMMA identifier 
RPAREN
+        """
+        coord = self._coord(p.lineno(1))
+        p[0] = c_ast.FuncCall(c_ast.ID(p[1], coord),
+                              c_ast.ExprList([p[3], p[5]], coord),
+                              coord)
+
     def p_argument_expression_list(self, p):
         """ argument_expression_list    : assignment_expression
                                         | argument_expression_list COMMA 
assignment_expression
@@ -1543,6 +1609,7 @@
         """ constant    : INT_CONST_DEC
                         | INT_CONST_OCT
                         | INT_CONST_HEX
+                        | INT_CONST_BIN
         """
         p[0] = c_ast.Constant(
             'int', p[1], self._coord(p.lineno(1)))
@@ -1585,7 +1652,7 @@
             p[0] = c_ast.Constant(
                 'string', p[1], self._coord(p.lineno(1)))
         else:
-            p[1].value = p[1].value.rstrip[:-1] + p[2][1:]
+            p[1].value = p[1].value.rstrip()[:-1] + p[2][2:]
             p[0] = p[1]
 
     def p_brace_open(self, p):
diff --git a/lib_pypy/cffi/_pycparser/lextab.py 
b/lib_pypy/cffi/_pycparser/lextab.py
--- a/lib_pypy/cffi/_pycparser/lextab.py
+++ b/lib_pypy/cffi/_pycparser/lextab.py
@@ -1,9 +1,9 @@
 # pycparser.lextab.py. This file automatically created by PLY (version 3.4). 
Don't edit!
 _tabversion   = '3.4'
-_lextokens    = {'VOID': 1, 'LBRACKET': 1, 'WCHAR_CONST': 1, 'FLOAT_CONST': 1, 
'MINUS': 1, 'RPAREN': 1, 'LONG': 1, 'PLUS': 1, 'ELLIPSIS': 1, 'GT': 1, 'GOTO': 
1, 'ENUM': 1, 'PERIOD': 1, 'GE': 1, 'INT_CONST_DEC': 1, 'ARROW': 1, 
'HEX_FLOAT_CONST': 1, 'DOUBLE': 1, 'MINUSEQUAL': 1, 'INT_CONST_OCT': 1, 
'TIMESEQUAL': 1, 'OR': 1, 'SHORT': 1, 'RETURN': 1, 'RSHIFTEQUAL': 1, 
'RESTRICT': 1, 'STATIC': 1, 'SIZEOF': 1, 'UNSIGNED': 1, 'UNION': 1, 'COLON': 1, 
'WSTRING_LITERAL': 1, 'DIVIDE': 1, 'FOR': 1, 'PLUSPLUS': 1, 'EQUALS': 1, 
'ELSE': 1, 'INLINE': 1, 'EQ': 1, 'AND': 1, 'TYPEID': 1, 'LBRACE': 1, 'PPHASH': 
1, 'INT': 1, 'SIGNED': 1, 'CONTINUE': 1, 'NOT': 1, 'OREQUAL': 1, 'MOD': 1, 
'RSHIFT': 1, 'DEFAULT': 1, 'CHAR': 1, 'WHILE': 1, 'DIVEQUAL': 1, 'EXTERN': 1, 
'CASE': 1, 'LAND': 1, 'REGISTER': 1, 'MODEQUAL': 1, 'NE': 1, 'SWITCH': 1, 
'INT_CONST_HEX': 1, '_COMPLEX': 1, 'PLUSEQUAL': 1, 'STRUCT': 1, 'CONDOP': 1, 
'BREAK': 1, 'VOLATILE': 1, 'ANDEQUAL': 1, 'DO': 1, 'LNOT': 1, 'CONST': 1, 
'LOR': 1, 'CHAR_CONS
 T': 1, 'LSHIFT': 1, 'RBRACE': 1, '_BOOL': 1, 'LE': 1, 'SEMI': 1, 'LT': 1, 
'COMMA': 1, 'TYPEDEF': 1, 'XOR': 1, 'AUTO': 1, 'TIMES': 1, 'LPAREN': 1, 
'MINUSMINUS': 1, 'ID': 1, 'IF': 1, 'STRING_LITERAL': 1, 'FLOAT': 1, 'XOREQUAL': 
1, 'LSHIFTEQUAL': 1, 'RBRACKET': 1}
+_lextokens    = {'VOID': 1, 'LBRACKET': 1, 'WCHAR_CONST': 1, 'FLOAT_CONST': 1, 
'MINUS': 1, 'RPAREN': 1, 'LONG': 1, 'PLUS': 1, 'ELLIPSIS': 1, 'GT': 1, 'GOTO': 
1, 'ENUM': 1, 'PERIOD': 1, 'GE': 1, 'INT_CONST_DEC': 1, 'ARROW': 1, 
'HEX_FLOAT_CONST': 1, 'DOUBLE': 1, 'MINUSEQUAL': 1, 'INT_CONST_OCT': 1, 
'TIMESEQUAL': 1, 'OR': 1, 'SHORT': 1, 'RETURN': 1, 'RSHIFTEQUAL': 1, 
'RESTRICT': 1, 'STATIC': 1, 'SIZEOF': 1, 'UNSIGNED': 1, 'UNION': 1, 'COLON': 1, 
'WSTRING_LITERAL': 1, 'DIVIDE': 1, 'FOR': 1, 'PLUSPLUS': 1, 'EQUALS': 1, 
'ELSE': 1, 'INLINE': 1, 'EQ': 1, 'AND': 1, 'TYPEID': 1, 'LBRACE': 1, 'PPHASH': 
1, 'INT': 1, 'SIGNED': 1, 'CONTINUE': 1, 'NOT': 1, 'OREQUAL': 1, 'MOD': 1, 
'RSHIFT': 1, 'DEFAULT': 1, 'CHAR': 1, 'WHILE': 1, 'DIVEQUAL': 1, 'EXTERN': 1, 
'CASE': 1, 'LAND': 1, 'REGISTER': 1, 'MODEQUAL': 1, 'NE': 1, 'SWITCH': 1, 
'INT_CONST_HEX': 1, '_COMPLEX': 1, 'PLUSEQUAL': 1, 'STRUCT': 1, 'CONDOP': 1, 
'BREAK': 1, 'VOLATILE': 1, 'ANDEQUAL': 1, 'INT_CONST_BIN': 1, 'DO': 1, 'LNOT': 
1, 'CONST': 1, 
 'LOR': 1, 'CHAR_CONST': 1, 'LSHIFT': 1, 'RBRACE': 1, '_BOOL': 1, 'LE': 1, 
'SEMI': 1, 'LT': 1, 'COMMA': 1, 'OFFSETOF': 1, 'TYPEDEF': 1, 'XOR': 1, 'AUTO': 
1, 'TIMES': 1, 'LPAREN': 1, 'MINUSMINUS': 1, 'ID': 1, 'IF': 1, 
'STRING_LITERAL': 1, 'FLOAT': 1, 'XOREQUAL': 1, 'LSHIFTEQUAL': 1, 'RBRACKET': 1}
 _lexreflags   = 0
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to