Index: build/ac-macros/swig.m4
===================================================================
--- build/ac-macros/swig.m4	(revision 1819610)
+++ build/ac-macros/swig.m4	(working copy)
@@ -155,7 +155,7 @@
             if test "$ac_cv_python_is_py3" = "yes"; then
                SWIG_PY_OPTS="-python -py3"
             else
-               SWIG_PY_OPTS="-python"
+               SWIG_PY_OPTS="-python -classic"
             fi
 
             dnl Sun Forte adds an extra space before substituting APR_INT64_T_FMT
Index: subversion/bindings/swig/include/proxy.py
===================================================================
--- subversion/bindings/swig/include/proxy.py	(revision 1819610)
+++ subversion/bindings/swig/include/proxy.py	(working copy)
@@ -12,42 +12,68 @@
     if "_is_valid" in self.__dict__:
       assert self.__dict__["_is_valid"](), "Variable has already been deleted"
 
-  def __getattribute__(self, name):
-    """Manage access to all attributes of this object."""
+  def _retrieve_swig_value(self, name, value):
+    # If we got back a different object than we have cached, we need to copy
+    # all our metadata into it, so that it looks identical to the one
+    # originally set.
+    members = self.__dict__.get('_members')
+    if members is not None and name in members:
+      _copy_metadata_deep(value, members[name])
 
-    # Start by mimicing __getattr__ behavior: immediately return __dict__ or
-    # items directly present in __dict__
-    mydict = object.__getattribute__(self, '__dict__')
-    if name == "__dict__":
-      return mydict
+    # Verify that the new object is good
+    _assert_valid_deep(value)
 
-    if name in mydict:
-      return mydict[name]
+    return value
 
-    object.__getattribute__(self, 'assert_valid')()
+  # SWIG classes generated with -classic do not define this variable,
+  # so set it to 0 when it doesn't exist
+  try: _newclass
+  except NameError: _newclass = 0
 
-    try:
-      value = object.__getattribute__(self, name)
-    except AttributeError:
-      value = _swig_getattr(self,
-                            object.__getattribute__(self, '__class__'),
-                            name)
+  # Attribute access must be intercepted in order ensure that objects coming
+  # from read attribute access match those that are set with write
+  # attribute access. Specifically the metadata, such as associated apr_pool
+  # object, should match the originally assigned object.
+  #
+  # For classic classes it is enough to use __getattr__ to intercept swig
+  # derived attributes. However, with new style classes SWIG makes use of
+  # descriptors which mean that __getattr__ is never called. Therefore,
+  # __getattribute__ must be used for the interception.
 
-    # If we got back a different object than we have, we need to copy all our
-    # metadata into it, so that it looks identical
-    try:
-      members = object.__getattribute__(self, '_members')
-      if name in members:
-          _copy_metadata_deep(value, members[name])
-          # Verify that the new object is good
-    except AttributeError:
-      pass
+  if _newclass:
+    def __getattribute__(self, name):
+      """Manage access to all attributes of this object."""
 
-    # Verify that the new object is good
-    _assert_valid_deep(value)
+      # Start by mimicing __getattr__ behavior: immediately return __dict__ or
+      # items directly present in __dict__
+      mydict = object.__getattribute__(self, '__dict__')
 
-    return value
+      if name == "__dict__":
+        return mydict
 
+      if name in mydict:
+        return mydict[name]
+
+      object.__getattribute__(self, 'assert_valid')()
+
+      try:
+        value = object.__getattribute__(self, name)
+      except AttributeError:
+        value = _swig_getattr(self,
+                              object.__getattribute__(self, '__class__'),
+                              name)
+
+      fn = object.__getattribute__(self, '_retrieve_swig_value')
+      return fn(name, value)
+  else:
+    def __getattr__(self, name):
+      """Get an attribute from this object"""
+      self.assert_valid()
+
+      value = _swig_getattr(self, self.__class__, name)
+
+      return self._retrieve_swig_value(name, value)
+
   def __setattr__(self, name, value):
     """Set an attribute on this object"""
     self.assert_valid()
