コード例 #1
0
ファイル: errors.c プロジェクト: clonly/JyNI
void
PyErr_SyntaxLocation(const char *filename, int lineno)
{
	PyObject *exc, *v, *tb, *tmp;

	/* add attributes for the line number and filename for the error */
	PyErr_Fetch(&exc, &v, &tb);
	PyErr_NormalizeException(&exc, &v, &tb);
	/* XXX check that it is, indeed, a syntax error. It might not
	 * be, though. */
	tmp = PyInt_FromLong(lineno);
	if (tmp == NULL)
		PyErr_Clear();
	else {
		if (PyObject_SetAttrString(v, "lineno", tmp))
			PyErr_Clear();
		Py_DECREF(tmp);
	}
	if (filename != NULL) {
		tmp = PyString_FromString(filename);
		if (tmp == NULL)
			PyErr_Clear();
		else {
			if (PyObject_SetAttrString(v, "filename", tmp))
				PyErr_Clear();
			Py_DECREF(tmp);
		}

		tmp = PyErr_ProgramText(filename, lineno);
		if (tmp) {
			if (PyObject_SetAttrString(v, "text", tmp))
				PyErr_Clear();
			Py_DECREF(tmp);
		}
	}
	if (PyObject_SetAttrString(v, "offset", Py_None)) {
		PyErr_Clear();
	}
	if (exc != PyExc_SyntaxError) {
		if (!PyObject_HasAttrString(v, "msg")) {
			tmp = PyObject_Str(v);
			if (tmp) {
				if (PyObject_SetAttrString(v, "msg", tmp))
					PyErr_Clear();
				Py_DECREF(tmp);
			} else {
				PyErr_Clear();
			}
		}
		if (!PyObject_HasAttrString(v, "print_file_and_line")) {
			if (PyObject_SetAttrString(v, "print_file_and_line",
									   Py_None))
				PyErr_Clear();
		}
	}
	PyErr_Restore(exc, v, tb);
}
コード例 #2
0
ファイル: conflict_def.c プロジェクト: luzhuomi/cpp-obs
static void
ast_error_finish(const char *filename)
{
    PyObject *type, *value, *tback, *errstr, *loc, *tmp;
    long lineno;
    loc = PyErr_ProgramText(filename, lineno);
    if (!loc) {
        Py_INCREF(Py_None);
        loc = Py_None;
    }
    tmp = Py_BuildValue("(zlOO)", filename, lineno, Py_None, loc);
    PyErr_Restore(type, value, tback);
}
コード例 #3
0
std::string format_python_traceback(PyObject *tb) {
  PyTracebackObject *trace = (PyTracebackObject *)tb;
  std::string stack;

  stack = "Traceback:\n";
  while (trace && trace->tb_frame) {
    PyFrameObject *frame = (PyFrameObject *)trace->tb_frame;
    stack += base::strfmt("  File \"%s\", line %i, in %s\n", PyString_AsString(frame->f_code->co_filename),
                          trace->tb_lineno, PyString_AsString(frame->f_code->co_name));
    PyObject *code = PyErr_ProgramText(PyString_AsString(frame->f_code->co_filename), trace->tb_lineno);
    if (code) {
      stack += base::strfmt("    %s", PyString_AsString(code));
      Py_DECREF(code);
    }
    trace = trace->tb_next;
  }
  return stack;
}