Improve accuracy of sequence and mapping checks.
diff --git a/Misc/NEWS b/Misc/NEWS
index b1f2043..c51b74b 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -202,6 +202,9 @@
 Extension modules
 -----------------
 
+- operator.isMappingType() and operator.isSequenceType() now give
+  fewer false positives.
+
 - socket.sslerror is now a subclass of socket.error .  Also added
   socket.error to the socket module's C API.
 
diff --git a/Objects/abstract.c b/Objects/abstract.c
index bf60c75..307ef86 100644
--- a/Objects/abstract.c
+++ b/Objects/abstract.c
@@ -1058,6 +1058,8 @@
 int
 PySequence_Check(PyObject *s)
 {
+	if (PyInstance_Check(s))
+		return PyObject_HasAttrString(s, "__getitem__");
 	return s != NULL && s->ob_type->tp_as_sequence &&
 		s->ob_type->tp_as_sequence->sq_item != NULL;
 }
@@ -1600,8 +1602,12 @@
 int
 PyMapping_Check(PyObject *o)
 {
-	return o && o->ob_type->tp_as_mapping &&
-		o->ob_type->tp_as_mapping->mp_subscript;
+	if (PyInstance_Check(o))
+		return PyObject_HasAttrString(o, "__getitem__");
+
+	return  o && o->ob_type->tp_as_mapping &&
+		o->ob_type->tp_as_mapping->mp_subscript &&
+		!PyObject_HasAttrString(o, "__getslice__");
 }
 
 int