text: # expected: statfail
  # run_args: -n
  # statcheck: stats['slowpath_callattr'] <= 100
  
  # Right now this won't work because callattr involves two calls
  # one call to __get__ and then another call to the returned function.
  # Of course, if the callattr were split up into getattr and a call,
  # each could be re-written separately...
  # Not sure if this is a case worth handling or what is the best way
  # to handle it, but I'm throwing the test in here anyway to remind us.
  
  # Note: difference between DataDescriptor and NonDataDescriptor shouldn't matter
  #  __enter__ is looked up via callattr with class_only set to true
  class DataDescriptor(object):
      def __get__(self, obj, typ):
          print '__get__ called'
          print type(self)
          print type(obj)
          print typ
          def enter():
              print 'enter called (1)'
          return enter
      def __set__(self, obj, value):
          pass
  
  class NonDataDescriptor(object):
      def __get__(self, obj, typ):
          print '__get__ called'
          print type(self)
          print type(obj)
          print typ
          def enter():
              print 'enter called (2)'
          return enter
  
  class C1(object):
      __enter__ = DataDescriptor()
      def __exit__(self, typ, value, traceback):
          pass
  
  class C2(object):
      __enter__ = NonDataDescriptor()
      def __exit__(self, typ, value, traceback):
          pass
  
  class C3(object):
      __enter__ = NonDataDescriptor()
      def __exit__(self, typ, value, traceback):
          pass
  
  class C4(object):
      def __exit__(self, typ, value, traceback):
          pass
  
  c1 = C1()
  c2 = C2()
  c3 = C3()
  c4 = C4()
  
  def enter3(type):
      print 'enter called (3)'
  c3.__enter__ = enter3 # this should not get called
  
  def enter4(type):
      print 'enter called (4)'
  c4.__enter__ = enter4 # this should not get called
  
  C4.__enter__ = DataDescriptor()
  
  def f():
      with c1:
          print 'in with statement (1)'
  
      with c2:
          print 'in with statement (2)'
  
      with c3:
          print 'in with statement (3)'
  
      with c4:
          print 'in with statement (4)'
  
  for i in xrange(1000):
      f()
  