]> granicus.if.org Git - python/commitdiff
add PyErr_SyntaxLocationEx, to support adding a column offset
authorBenjamin Peterson <benjamin@python.org>
Mon, 20 Sep 2010 22:42:10 +0000 (22:42 +0000)
committerBenjamin Peterson <benjamin@python.org>
Mon, 20 Sep 2010 22:42:10 +0000 (22:42 +0000)
Doc/c-api/exceptions.rst
Include/pyerrors.h
Python/errors.c

index f969b967aeef7e4430c790fb11731c850915c7e9..899666f1f865a668c06581b7c14749b86e84653d 100644 (file)
@@ -294,6 +294,20 @@ in various ways.  There is a separate error indicator for each thread.
    parameter specifying the exception type to be raised. Availability: Windows.
 
 
+.. cfunction:: void PyErr_SyntaxLocationEx(char *filename, int lineno, int col_offset)
+
+   Set file, line, and offset information for the current exception.  If the
+   current exception is not a :exc:`SyntaxError`, then it sets additional
+   attributes, which make the exception printing subsystem think the exception
+   is a :exc:`SyntaxError`.
+
+
+.. cfunction:: void PyErr_SyntaxLocation(char *filename, int lineno)
+
+   Like :cfunc:`PyErr_SyntaxLocationExc`, but the col_offset parameter is
+   omitted.
+
+
 .. cfunction:: void PyErr_BadInternalCall()
 
    This is a shorthand for ``PyErr_SetString(PyExc_SystemError, message)``,
index 243bc018daafd367a8fabf275743f7e47bbf31d5..fb9ce91a84ea3bf6ab75dc25eeda825432da76e0 100644 (file)
@@ -229,6 +229,7 @@ int PySignal_SetWakeupFd(int fd);
 
 /* Support for adding program text to SyntaxErrors */
 PyAPI_FUNC(void) PyErr_SyntaxLocation(const char *, int);
+PyAPI_FUNC(void) PyErr_SyntaxLocationEx(const char *, int, int);
 PyAPI_FUNC(PyObject *) PyErr_ProgramText(const char *, int);
 
 /* The following functions are used to create and modify unicode
index 4ae661a16f38f2426b27779be4e06e19c5f4cdac..a24095dff9f062711f2bcaf5dcd8c32e6ebf878b 100644 (file)
@@ -780,12 +780,18 @@ PyErr_WriteUnraisable(PyObject *obj)
 extern PyObject *PyModule_GetWarningsModule(void);
 
 
+void
+PyErr_SyntaxLocation(const char *filename, int lineno) {
+    PyErr_SyntaxLocationEx(filename, lineno, -1);
+}
+
+
 /* Set file and line information for the current exception.
    If the exception is not a SyntaxError, also sets additional attributes
    to make printing of exceptions believe it is a syntax error. */
 
 void
-PyErr_SyntaxLocation(const char *filename, int lineno)
+PyErr_SyntaxLocationEx(const char *filename, int lineno, int col_offset)
 {
     PyObject *exc, *v, *tb, *tmp;
 
@@ -802,6 +808,16 @@ PyErr_SyntaxLocation(const char *filename, int lineno)
             PyErr_Clear();
         Py_DECREF(tmp);
     }
+    if (col_offset >= 0) {
+        tmp = PyLong_FromLong(col_offset);
+        if (tmp == NULL)
+            PyErr_Clear();
+        else {
+            if (PyObject_SetAttrString(v, "offset", tmp))
+                PyErr_Clear();
+            Py_DECREF(tmp);
+        }
+    }
     if (filename != NULL) {
         tmp = PyUnicode_FromString(filename);
         if (tmp == NULL)