[PATCH 2 of 6 foldmap-in-C] parsers._asciitransform: also accept a fallback function

Siddharth Agarwal sid0 at fb.com
Thu Apr 2 23:02:15 CDT 2015


# HG changeset patch
# User Siddharth Agarwal <sid0 at fb.com>
# Date 1427869323 25200
#      Tue Mar 31 23:22:03 2015 -0700
# Node ID e76c0533d7ef1091fa1ac4252f66bbcda3073780
# Parent  a0f05ad01122ba8cd3653af01f4dfd13a839dc02
parsers._asciitransform: also accept a fallback function

This function will be used in upcoming patches to provide a C implementation of
the function to generate the foldmap.

diff --git a/mercurial/parsers.c b/mercurial/parsers.c
--- a/mercurial/parsers.c
+++ b/mercurial/parsers.c
@@ -115,7 +115,8 @@ PyObject *unhexlify(const char *str, int
 }
 
 static inline PyObject *_asciitransform(PyObject *str_obj,
-					const char table[128])
+					const char table[128],
+					PyObject *fallback_fn)
 {
 	char *str, *newstr;
 	Py_ssize_t i, len;
@@ -134,11 +135,16 @@ static inline PyObject *_asciitransform(
 	for (i = 0; i < len; i++) {
 		char c = str[i];
 		if (c & 0x80) {
-			PyObject *err = PyUnicodeDecodeError_Create(
-				"ascii", str, len, i, (i + 1),
-				"unexpected code byte");
-			PyErr_SetObject(PyExc_UnicodeDecodeError, err);
-			Py_XDECREF(err);
+			if (fallback_fn != NULL) {
+				ret = PyObject_CallFunctionObjArgs(fallback_fn,
+					str_obj, NULL);
+			} else {
+				PyObject *err = PyUnicodeDecodeError_Create(
+					"ascii", str, len, i, (i + 1),
+					"unexpected code byte");
+				PyErr_SetObject(PyExc_UnicodeDecodeError, err);
+				Py_XDECREF(err);
+			}
 			goto quit;
 		}
 		newstr[i] = table[(unsigned char)c];
@@ -156,7 +162,7 @@ static PyObject *asciilower(PyObject *se
 	PyObject *str_obj;
 	if (!PyArg_ParseTuple(args, "O!:asciilower", &PyBytes_Type, &str_obj))
 		return NULL;
-	return _asciitransform(str_obj, lowertable);
+	return _asciitransform(str_obj, lowertable, NULL);
 }
 
 static PyObject *asciiupper(PyObject *self, PyObject *args)
@@ -164,7 +170,7 @@ static PyObject *asciiupper(PyObject *se
 	PyObject *str_obj;
 	if (!PyArg_ParseTuple(args, "O!:asciiupper", &PyBytes_Type, &str_obj))
 		return NULL;
-	return _asciitransform(str_obj, uppertable);
+	return _asciitransform(str_obj, uppertable, NULL);
 }
 
 /*


More information about the Mercurial-devel mailing list