make bytes(o) respect __bytes__ #2415

This adds two new C-API functions: PyObject_Bytes and PyBytes_FromObject.

Reviewer: Barry
diff --git a/Objects/bytesobject.c b/Objects/bytesobject.c
index d59e79a..3bda6d9 100644
--- a/Objects/bytesobject.c
+++ b/Objects/bytesobject.c
@@ -2882,11 +2882,10 @@
 static PyObject *
 string_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
 {
-	PyObject *x = NULL, *it;
+	PyObject *x = NULL;
 	const char *encoding = NULL;
 	const char *errors = NULL;
 	PyObject *new = NULL;
-	Py_ssize_t i, size;
 	static char *kwlist[] = {"source", "encoding", "errors", 0};
 
 	if (type != &PyBytes_Type)
@@ -2924,6 +2923,14 @@
 			"encoding or errors without a string argument");
 		return NULL;
 	}
+        return PyObject_Bytes(x);
+}
+
+PyObject *
+PyBytes_FromObject(PyObject *x)
+{
+	PyObject *new, *it;
+	Py_ssize_t i, size;
 
 	/* Is it an int? */
 	size = PyNumber_AsSsize_t(x, PyExc_ValueError);