Index: libstdc++-v3/python/libstdcxx/v6/printers.py
===================================================================
--- libstdc++-v3/python/libstdcxx/v6/printers.py (.../tags/gcc_4_8_3_release) (revision 217117)
+++ libstdc++-v3/python/libstdcxx/v6/printers.py (.../branches/gcc-4_8-branch) (revision 217117)
@@ -1,4 +1,4 @@
-# Pretty-printers for libstc++.
+# Pretty-printers for libstdc++.
# Copyright (C) 2008-2013 Free Software Foundation, Inc.
@@ -18,7 +18,51 @@
import gdb
import itertools
import re
+import sys
+### Python 2 + Python 3 compatibility code
+
+# Resources about compatibility:
+#
+# * : Documentation of the "six" module
+
+# FIXME: The handling of e.g. std::basic_string (at least on char)
+# probably needs updating to work with Python 3's new string rules.
+#
+# In particular, Python 3 has a separate type (called byte) for
+# bytestrings, and a special b"" syntax for the byte literals; the old
+# str() type has been redefined to always store Unicode text.
+#
+# We probably can't do much about this until this GDB PR is addressed:
+#
+
+if sys.version_info[0] > 2:
+ ### Python 3 stuff
+ Iterator = object
+ # Python 3 folds these into the normal functions.
+ imap = map
+ izip = zip
+ # Also, int subsumes long
+ long = int
+else:
+ ### Python 2 stuff
+ class Iterator:
+ """Compatibility mixin for iterators
+
+ Instead of writing next() methods for iterators, write
+ __next__() methods and use this mixin to make them work in
+ Python 2 as well as Python 3.
+
+ Idea stolen from the "six" documentation:
+
+ """
+
+ def next(self):
+ return self.__next__()
+
+ # In Python 2, we still need these from itertools
+ from itertools import imap, izip
+
# Try to use the new-style pretty-printing if available.
_use_gdb_pp = True
try:
@@ -51,7 +95,7 @@
# anything fancier here.
field = typ.fields()[0]
if not field.is_base_class:
- raise ValueError, "Cannot find type %s::%s" % (str(orig), name)
+ raise ValueError("Cannot find type %s::%s" % (str(orig), name))
typ = field.type
class SharedPointerPrinter:
@@ -87,7 +131,7 @@
class StdListPrinter:
"Print a std::list"
- class _iterator:
+ class _iterator(Iterator):
def __init__(self, nodetype, head):
self.nodetype = nodetype
self.base = head['_M_next']
@@ -97,7 +141,7 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
if self.base == self.head:
raise StopIteration
elt = self.base.cast(self.nodetype).dereference()
@@ -135,7 +179,7 @@
class StdSlistPrinter:
"Print a __gnu_cxx::slist"
- class _iterator:
+ class _iterator(Iterator):
def __init__(self, nodetype, head):
self.nodetype = nodetype
self.base = head['_M_head']['_M_next']
@@ -144,7 +188,7 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
if self.base == 0:
raise StopIteration
elt = self.base.cast(self.nodetype).dereference()
@@ -180,7 +224,7 @@
class StdVectorPrinter:
"Print a std::vector"
- class _iterator:
+ class _iterator(Iterator):
def __init__ (self, start, finish, bitvec):
self.bitvec = bitvec
if bitvec:
@@ -198,7 +242,7 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
count = self.count
self.count = self.count + 1
if self.bitvec:
@@ -265,7 +309,7 @@
class StdTuplePrinter:
"Print a std::tuple"
- class _iterator:
+ class _iterator(Iterator):
def __init__ (self, head):
self.head = head
@@ -276,13 +320,13 @@
# Set the actual head to the first pair.
self.head = self.head.cast (nodes[0].type)
elif len (nodes) != 0:
- raise ValueError, "Top of tuple tree does not consist of a single node."
+ raise ValueError("Top of tuple tree does not consist of a single node.")
self.count = 0
def __iter__ (self):
return self
- def next (self):
+ def __next__ (self):
nodes = self.head.type.fields ()
# Check for further recursions in the inheritance tree.
if len (nodes) == 0:
@@ -289,7 +333,7 @@
raise StopIteration
# Check that this iteration has an expected structure.
if len (nodes) != 2:
- raise ValueError, "Cannot parse more than 2 nodes in a tuple tree."
+ raise ValueError("Cannot parse more than 2 nodes in a tuple tree.")
# - Left node is the next recursion parent.
# - Right node is the actual class contained in the tuple.
@@ -341,7 +385,7 @@
return self.visualizer.display_hint ()
return None
-class RbtreeIterator:
+class RbtreeIterator(Iterator):
def __init__(self, rbtree):
self.size = rbtree['_M_t']['_M_impl']['_M_node_count']
self.node = rbtree['_M_t']['_M_impl']['_M_header']['_M_left']
@@ -353,7 +397,7 @@
def __len__(self):
return int (self.size)
- def next(self):
+ def __next__(self):
if self.count == self.size:
raise StopIteration
result = self.node
@@ -405,7 +449,7 @@
"Print a std::map or std::multimap"
# Turn an RbtreeIterator into a pretty-print iterator.
- class _iter:
+ class _iter(Iterator):
def __init__(self, rbiter, type):
self.rbiter = rbiter
self.count = 0
@@ -414,9 +458,9 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
if self.count % 2 == 0:
- n = self.rbiter.next()
+ n = next(self.rbiter)
n = n.cast(self.type).dereference()['_M_value_field']
self.pair = n
item = n['first']
@@ -447,7 +491,7 @@
"Print a std::set or std::multiset"
# Turn an RbtreeIterator into a pretty-print iterator.
- class _iter:
+ class _iter(Iterator):
def __init__(self, rbiter, type):
self.rbiter = rbiter
self.count = 0
@@ -456,8 +500,8 @@
def __iter__(self):
return self
- def next(self):
- item = self.rbiter.next()
+ def __next__(self):
+ item = next(self.rbiter)
item = item.cast(self.type).dereference()['_M_value_field']
# FIXME: this is weird ... what to do?
# Maybe a 'set' display hint?
@@ -522,7 +566,7 @@
class StdDequePrinter:
"Print a std::deque"
- class _iter:
+ class _iter(Iterator):
def __init__(self, node, start, end, last, buffer_size):
self.node = node
self.p = start
@@ -534,7 +578,7 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
if self.p == self.last:
raise StopIteration
@@ -619,7 +663,7 @@
def display_hint (self):
return 'string'
-class Tr1HashtableIterator:
+class Tr1HashtableIterator(Iterator):
def __init__ (self, hash):
self.node = hash['_M_bbegin']['_M_node']['_M_nxt']
self.node_type = find_type(hash.type, '__node_type').pointer()
@@ -627,7 +671,7 @@
def __iter__ (self):
return self
- def next (self):
+ def __next__ (self):
if self.node == 0:
raise StopIteration
node = self.node.cast(self.node_type)
@@ -655,8 +699,8 @@
return '[%d]' % i
def children (self):
- counter = itertools.imap (self.format_count, itertools.count())
- return itertools.izip (counter, Tr1HashtableIterator (self.hashtable()))
+ counter = imap (self.format_count, itertools.count())
+ return izip (counter, Tr1HashtableIterator (self.hashtable()))
class Tr1UnorderedMapPrinter:
"Print a tr1::unordered_map"
@@ -688,11 +732,11 @@
return '[%d]' % i
def children (self):
- counter = itertools.imap (self.format_count, itertools.count())
+ counter = imap (self.format_count, itertools.count())
# Map over the hash table and flatten the result.
- data = self.flatten (itertools.imap (self.format_one, Tr1HashtableIterator (self.hashtable())))
+ data = self.flatten (imap (self.format_one, Tr1HashtableIterator (self.hashtable())))
# Zip the two iterators together.
- return itertools.izip (counter, data)
+ return izip (counter, data)
def display_hint (self):
return 'map'
@@ -700,7 +744,7 @@
class StdForwardListPrinter:
"Print a std::forward_list"
- class _iterator:
+ class _iterator(Iterator):
def __init__(self, nodetype, head):
self.nodetype = nodetype
self.base = head['_M_next']
@@ -709,7 +753,7 @@
def __iter__(self):
return self
- def next(self):
+ def __next__(self):
if self.base == 0:
raise StopIteration
elt = self.base.cast(self.nodetype).dereference()
@@ -764,7 +808,7 @@
# A small sanity check.
# FIXME
if not self.compiled_rx.match(name + '<>'):
- raise ValueError, 'libstdc++ programming error: "%s" does not match' % name
+ raise ValueError('libstdc++ programming error: "%s" does not match' % name)
printer = RxPrinter(name, function)
self.subprinters.append(printer)
self.lookup[name] = printer
Index: libstdc++-v3/scripts/run_doxygen
===================================================================
--- libstdc++-v3/scripts/run_doxygen (.../tags/gcc_4_8_3_release) (revision 217117)
+++ libstdc++-v3/scripts/run_doxygen (.../branches/gcc-4_8-branch) (revision 217117)
@@ -193,8 +193,15 @@
if $do_latex; then
cd ${outdir}/${mode}
- # Also drop in the header file and style sheet
- doxygen -w latex header.tex doxygen.sty
+ # Grrr, Doxygen 1.8.x changed the -w latex options.
+ need_footer=`doxygen -h | sed -n -e '/-w latex/s=.*footer.*=true=p'`
+
+ # Also drop in the header file (maybe footer file) and style sheet
+ if $need_footer; then
+ doxygen -w latex header.tex footer.tex doxygen.sty
+ else
+ doxygen -w latex header.tex doxygen.sty
+ fi
echo ::
echo :: LaTeX pages begin with
Index: libstdc++-v3/doc/xml/manual/containers.xml
===================================================================
--- libstdc++-v3/doc/xml/manual/containers.xml (.../tags/gcc_4_8_3_release) (revision 217117)
+++ libstdc++-v3/doc/xml/manual/containers.xml (.../branches/gcc-4_8-branch) (revision 217117)
@@ -25,8 +25,9 @@
list::size() is O(n)
- Yes it is, and that's okay. This is a decision that we preserved
- when we imported SGI's STL implementation. The following is
+ Yes it is, and that was okay until the 2011 edition of the C++ standard.
+ In future GCC will change it to O(1) but O(N) was a decision that we
+ preserved when we imported SGI's STL implementation. The following is
quoted from their FAQ:
@@ -72,26 +73,6 @@
-vector
-
-
-
-
- Space Overhead Management
-
-
- In this
- message to the list, Daniel Kostecky announced work on an
- alternate form of std::vector that would support
- hints on the number of elements to be over-allocated. The design
- was also described, along with possible implementation choices.
-
-
- The first two alpha releases were announced here
- and here.
-
-
-
Index: libstdc++-v3/doc/xml/manual/status_cxx2011.xml
===================================================================
--- libstdc++-v3/doc/xml/manual/status_cxx2011.xml (.../tags/gcc_4_8_3_release) (revision 217117)
+++ libstdc++-v3/doc/xml/manual/status_cxx2011.xml (.../branches/gcc-4_8-branch) (revision 217117)
@@ -226,10 +226,12 @@
+
18.8.6nested_exception
- Y
-
+ Partial
+ Follows an earlier C++0x draft, not the final specification.
+ 18.9
@@ -612,10 +614,11 @@
+
20.6.12.4uninitialized_fill_n
- Y
-
+ Partial
+ Returns void.20.6.13
@@ -1119,10 +1122,13 @@
+
21.4Class template basic_string
- Y
-
+ Partial
+ Non-conforming Copy-On-Write implementation.
+ Missing getline overloads for rvalue streams.
+ 21.5
@@ -1190,10 +1196,11 @@
+
22.3.3.1Character classification
- Y
-
+ Partial
+ Missing isblank.22.3.3.2
@@ -1272,16 +1279,18 @@
+
22.4.5.1Class template time_get
- Y
-
+ Partial
+ Missing get and do_get
+
22.4.5.2Class template time_get_byname
- Y
-
+ Partial
+ Likewise22.4.5.3
@@ -1434,8 +1443,10 @@
23.3.5Class template listPartial
- insert and erase members do not
- take const_iterator arguments (N2350).
+ O(N) size.
+ insert and erase members do not
+ take const_iterator arguments (N2350).
+
@@ -1650,10 +1661,11 @@
+
25.3Mutating sequence operations
- Y
-
+ Partial
+ rotate returns void.25.4
@@ -2060,10 +2072,13 @@
+
26.8C Library
- Y
-
+ Partial
+ <ctgmath> doesn't include
+ <ccomplex>
+
@@ -2143,6 +2158,7 @@
Missing move and swap operations on basic_ios.
Missing io_errc and iostream_category.
ios_base::failure is not derived from system_error.
+ Missing ios_base::hexfloat.
Index: libstdc++-v3/doc/html/index.html
===================================================================
--- libstdc++-v3/doc/html/index.html (.../tags/gcc_4_8_3_release) (revision 217117)
+++ libstdc++-v3/doc/html/index.html (.../branches/gcc-4_8-branch) (revision 217117)
@@ -43,7 +43,7 @@