SF bug 665835: filter() treatment of str and tuple inconsistent

As a side issue on this bug, it was noted that list and tuple iterators
used macros to directly access containers and would not recognize
__getitem__ overrides.  If the method is overridden, the patch returns
a generic sequence iterator which calls the __getitem__ method; otherwise,
it returns a high custom iterator with direct access to container elements.
diff --git a/Lib/test/test_types.py b/Lib/test/test_types.py
index 4adbb40..7e238df 100644
--- a/Lib/test/test_types.py
+++ b/Lib/test/test_types.py
@@ -256,6 +256,12 @@
         yield i
 vereq(list(tuple(f())), range(1000))
 
+# Verify that __getitem__ overrides are recognized by __iter__
+class T(tuple):
+  def __getitem__(self, key):
+     return str(key) + '!!!'
+vereq(iter(T()).next(), '0!!!')
+
 print '6.5.3 Lists'
 # calling built-in types without argument must return empty
 if list() != []: raise TestFailed,'list() does not return []'
@@ -447,6 +453,12 @@
 a[::2] = tuple(range(5))
 vereq(a, [0, 1, 1, 3, 2, 5, 3, 7, 4, 9])
 
+# Verify that __getitem__ overrides are recognized by __iter__
+class L(list):
+  def __getitem__(self, key):
+     return str(key) + '!!!'
+vereq(iter(L()).next(), '0!!!')
+
 
 print '6.6 Mappings == Dictionaries'
 # calling built-in types without argument must return empty