_warnings.c 34.8 KB
Newer Older
Christian Heimes's avatar
Christian Heimes committed
1 2
#include "Python.h"
#include "frameobject.h"
3
#include "clinic/_warnings.c.h"
Christian Heimes's avatar
Christian Heimes committed
4 5 6 7 8 9 10 11 12 13 14

#define MODULE_NAME "_warnings"

PyDoc_STRVAR(warnings__doc__,
MODULE_NAME " provides basic warning filtering support.\n"
"It is a helper module to speed up interpreter start-up.");

/* Both 'filters' and 'onceregistry' can be set in warnings.py;
   get_warnings_attr() will reset these variables accordingly. */
static PyObject *_filters;  /* List */
static PyObject *_once_registry;  /* Dict */
15
static PyObject *_default_action; /* String */
16
static long _filters_version;
Christian Heimes's avatar
Christian Heimes committed
17

18 19
_Py_IDENTIFIER(argv);
_Py_IDENTIFIER(stderr);
Christian Heimes's avatar
Christian Heimes committed
20 21 22 23 24

static int
check_matched(PyObject *obj, PyObject *arg)
{
    PyObject *result;
25
    _Py_IDENTIFIER(match);
Christian Heimes's avatar
Christian Heimes committed
26 27 28 29
    int rc;

    if (obj == Py_None)
        return 1;
30
    result = _PyObject_CallMethodIdObjArgs(obj, &PyId_match, arg, NULL);
Christian Heimes's avatar
Christian Heimes committed
31 32 33 34 35 36 37 38 39 40 41 42 43
    if (result == NULL)
        return -1;

    rc = PyObject_IsTrue(result);
    Py_DECREF(result);
    return rc;
}

/*
   Returns a new reference.
   A NULL return value can mean false or an error.
*/
static PyObject *
44
get_warnings_attr(const char *attr, int try_import)
Christian Heimes's avatar
Christian Heimes committed
45 46 47
{
    static PyObject *warnings_str = NULL;
    PyObject *all_modules;
48
    PyObject *warnings_module, *obj;
Christian Heimes's avatar
Christian Heimes committed
49 50 51 52 53 54 55

    if (warnings_str == NULL) {
        warnings_str = PyUnicode_InternFromString("warnings");
        if (warnings_str == NULL)
            return NULL;
    }

56 57 58 59 60 61 62 63 64 65 66 67 68 69
    /* don't try to import after the start of the Python finallization */
    if (try_import && _Py_Finalizing == NULL) {
        warnings_module = PyImport_Import(warnings_str);
        if (warnings_module == NULL) {
            /* Fallback to the C implementation if we cannot get
               the Python implementation */
            PyErr_Clear();
            return NULL;
        }
    }
    else {
        all_modules = PyImport_GetModuleDict();

        warnings_module = PyDict_GetItem(all_modules, warnings_str);
70 71 72
        if (warnings_module == NULL)
            return NULL;

73 74 75 76 77
        Py_INCREF(warnings_module);
    }

    if (!PyObject_HasAttrString(warnings_module, attr)) {
        Py_DECREF(warnings_module);
Christian Heimes's avatar
Christian Heimes committed
78
        return NULL;
79
    }
Christian Heimes's avatar
Christian Heimes committed
80

81 82 83
    obj = PyObject_GetAttrString(warnings_module, attr);
    Py_DECREF(warnings_module);
    return obj;
Christian Heimes's avatar
Christian Heimes committed
84 85 86
}


Neal Norwitz's avatar
Neal Norwitz committed
87
static PyObject *
Christian Heimes's avatar
Christian Heimes committed
88 89 90 91
get_once_registry(void)
{
    PyObject *registry;

92
    registry = get_warnings_attr("onceregistry", 0);
Christian Heimes's avatar
Christian Heimes committed
93 94 95 96 97 98 99 100 101 102 103
    if (registry == NULL) {
        if (PyErr_Occurred())
            return NULL;
        return _once_registry;
    }
    Py_DECREF(_once_registry);
    _once_registry = registry;
    return registry;
}


104 105 106 107 108
static PyObject *
get_default_action(void)
{
    PyObject *default_action;

109
    default_action = get_warnings_attr("defaultaction", 0);
110
    if (default_action == NULL) {
111 112 113 114
        if (PyErr_Occurred()) {
            return NULL;
        }
        return _default_action;
115 116 117 118 119 120 121 122
    }

    Py_DECREF(_default_action);
    _default_action = default_action;
    return default_action;
}


123
/* The item is a new reference. */
124
static PyObject*
Christian Heimes's avatar
Christian Heimes committed
125 126 127
get_filter(PyObject *category, PyObject *text, Py_ssize_t lineno,
           PyObject *module, PyObject **item)
{
128
    PyObject *action;
Christian Heimes's avatar
Christian Heimes committed
129 130 131
    Py_ssize_t i;
    PyObject *warnings_filters;

132
    warnings_filters = get_warnings_attr("filters", 0);
Christian Heimes's avatar
Christian Heimes committed
133 134 135 136 137 138 139 140 141
    if (warnings_filters == NULL) {
        if (PyErr_Occurred())
            return NULL;
    }
    else {
        Py_DECREF(_filters);
        _filters = warnings_filters;
    }

142
    if (_filters == NULL || !PyList_Check(_filters)) {
Christian Heimes's avatar
Christian Heimes committed
143 144 145 146 147 148 149 150 151 152 153
        PyErr_SetString(PyExc_ValueError,
                        MODULE_NAME ".filters must be a list");
        return NULL;
    }

    /* _filters could change while we are iterating over it. */
    for (i = 0; i < PyList_GET_SIZE(_filters); i++) {
        PyObject *tmp_item, *action, *msg, *cat, *mod, *ln_obj;
        Py_ssize_t ln;
        int is_subclass, good_msg, good_mod;

154 155
        tmp_item = PyList_GET_ITEM(_filters, i);
        if (!PyTuple_Check(tmp_item) || PyTuple_GET_SIZE(tmp_item) != 5) {
Christian Heimes's avatar
Christian Heimes committed
156 157 158 159 160 161
            PyErr_Format(PyExc_ValueError,
                         MODULE_NAME ".filters item %zd isn't a 5-tuple", i);
            return NULL;
        }

        /* Python code: action, msg, cat, mod, ln = item */
162
        Py_INCREF(tmp_item);
Christian Heimes's avatar
Christian Heimes committed
163 164 165 166 167 168 169
        action = PyTuple_GET_ITEM(tmp_item, 0);
        msg = PyTuple_GET_ITEM(tmp_item, 1);
        cat = PyTuple_GET_ITEM(tmp_item, 2);
        mod = PyTuple_GET_ITEM(tmp_item, 3);
        ln_obj = PyTuple_GET_ITEM(tmp_item, 4);

        good_msg = check_matched(msg, text);
Benjamin Peterson's avatar
Benjamin Peterson committed
170 171
        if (good_msg == -1) {
            Py_DECREF(tmp_item);
172
            return NULL;
Benjamin Peterson's avatar
Benjamin Peterson committed
173
        }
174

Christian Heimes's avatar
Christian Heimes committed
175
        good_mod = check_matched(mod, module);
Benjamin Peterson's avatar
Benjamin Peterson committed
176 177
        if (good_mod == -1) {
            Py_DECREF(tmp_item);
178
            return NULL;
Benjamin Peterson's avatar
Benjamin Peterson committed
179
        }
180

Christian Heimes's avatar
Christian Heimes committed
181
        is_subclass = PyObject_IsSubclass(category, cat);
Benjamin Peterson's avatar
Benjamin Peterson committed
182 183
        if (is_subclass == -1) {
            Py_DECREF(tmp_item);
184
            return NULL;
Benjamin Peterson's avatar
Benjamin Peterson committed
185
        }
186

Christian Heimes's avatar
Christian Heimes committed
187
        ln = PyLong_AsSsize_t(ln_obj);
Benjamin Peterson's avatar
Benjamin Peterson committed
188
        if (ln == -1 && PyErr_Occurred()) {
189
            Py_DECREF(tmp_item);
Christian Heimes's avatar
Christian Heimes committed
190
            return NULL;
191
        }
Christian Heimes's avatar
Christian Heimes committed
192

193 194
        if (good_msg && is_subclass && good_mod && (ln == 0 || lineno == ln)) {
            *item = tmp_item;
195
            return action;
196 197 198
        }

        Py_DECREF(tmp_item);
Christian Heimes's avatar
Christian Heimes committed
199 200
    }

201 202
    action = get_default_action();
    if (action != NULL) {
203 204
        Py_INCREF(Py_None);
        *item = Py_None;
205
        return action;
206
    }
Christian Heimes's avatar
Christian Heimes committed
207 208

    PyErr_SetString(PyExc_ValueError,
209
                    MODULE_NAME ".defaultaction not found");
Christian Heimes's avatar
Christian Heimes committed
210 211 212
    return NULL;
}

213

Christian Heimes's avatar
Christian Heimes committed
214 215 216
static int
already_warned(PyObject *registry, PyObject *key, int should_set)
{
217 218
    PyObject *version_obj, *already_warned;
    _Py_IDENTIFIER(version);
Christian Heimes's avatar
Christian Heimes committed
219 220 221 222

    if (key == NULL)
        return -1;

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243
    version_obj = _PyDict_GetItemId(registry, &PyId_version);
    if (version_obj == NULL
        || !PyLong_CheckExact(version_obj)
        || PyLong_AsLong(version_obj) != _filters_version) {
        PyDict_Clear(registry);
        version_obj = PyLong_FromLong(_filters_version);
        if (version_obj == NULL)
            return -1;
        if (_PyDict_SetItemId(registry, &PyId_version, version_obj) < 0) {
            Py_DECREF(version_obj);
            return -1;
        }
        Py_DECREF(version_obj);
    }
    else {
        already_warned = PyDict_GetItem(registry, key);
        if (already_warned != NULL) {
            int rc = PyObject_IsTrue(already_warned);
            if (rc != 0)
                return rc;
        }
Christian Heimes's avatar
Christian Heimes committed
244 245 246 247 248 249 250 251 252 253 254 255 256
    }

    /* This warning wasn't found in the registry, set it. */
    if (should_set)
        return PyDict_SetItem(registry, key, Py_True);
    return 0;
}

/* New reference. */
static PyObject *
normalize_module(PyObject *filename)
{
    PyObject *module;
257 258
    int kind;
    void *data;
Christian Heimes's avatar
Christian Heimes committed
259 260
    Py_ssize_t len;

261
    len = PyUnicode_GetLength(filename);
Christian Heimes's avatar
Christian Heimes committed
262 263
    if (len < 0)
        return NULL;
264 265 266 267 268 269 270 271

    if (len == 0)
        return PyUnicode_FromString("<unknown>");

    kind = PyUnicode_KIND(filename);
    data = PyUnicode_DATA(filename);

    /* if filename.endswith(".py"): */
Christian Heimes's avatar
Christian Heimes committed
272
    if (len >= 3 &&
273 274 275 276
        PyUnicode_READ(kind, data, len-3) == '.' &&
        PyUnicode_READ(kind, data, len-2) == 'p' &&
        PyUnicode_READ(kind, data, len-1) == 'y')
    {
277
        module = PyUnicode_Substring(filename, 0, len-3);
Christian Heimes's avatar
Christian Heimes committed
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
    }
    else {
        module = filename;
        Py_INCREF(module);
    }
    return module;
}

static int
update_registry(PyObject *registry, PyObject *text, PyObject *category,
                int add_zero)
{
    PyObject *altkey, *zero = NULL;
    int rc;

    if (add_zero) {
        zero = PyLong_FromLong(0);
        if (zero == NULL)
            return -1;
        altkey = PyTuple_Pack(3, text, category, zero);
    }
    else
        altkey = PyTuple_Pack(2, text, category);

    rc = already_warned(registry, altkey, 1);
    Py_XDECREF(zero);
    Py_XDECREF(altkey);
    return rc;
}

static void
309 310
show_warning(PyObject *filename, int lineno, PyObject *text,
             PyObject *category, PyObject *sourceline)
Christian Heimes's avatar
Christian Heimes committed
311
{
312 313
    PyObject *f_stderr;
    PyObject *name;
Christian Heimes's avatar
Christian Heimes committed
314
    char lineno_str[128];
315
    _Py_IDENTIFIER(__name__);
Christian Heimes's avatar
Christian Heimes committed
316 317 318

    PyOS_snprintf(lineno_str, sizeof(lineno_str), ":%d: ", lineno);

319
    name = _PyObject_GetAttrId(category, &PyId___name__);
Christian Heimes's avatar
Christian Heimes committed
320
    if (name == NULL)  /* XXX Can an object lack a '__name__' attribute? */
321
        goto error;
Christian Heimes's avatar
Christian Heimes committed
322

323
    f_stderr = _PySys_GetObjectId(&PyId_stderr);
Christian Heimes's avatar
Christian Heimes committed
324 325
    if (f_stderr == NULL) {
        fprintf(stderr, "lost sys.stderr\n");
326
        goto error;
Christian Heimes's avatar
Christian Heimes committed
327 328 329
    }

    /* Print "filename:lineno: category: text\n" */
330 331 332 333 334 335 336 337 338 339 340 341 342
    if (PyFile_WriteObject(filename, f_stderr, Py_PRINT_RAW) < 0)
        goto error;
    if (PyFile_WriteString(lineno_str, f_stderr) < 0)
        goto error;
    if (PyFile_WriteObject(name, f_stderr, Py_PRINT_RAW) < 0)
        goto error;
    if (PyFile_WriteString(": ", f_stderr) < 0)
        goto error;
    if (PyFile_WriteObject(text, f_stderr, Py_PRINT_RAW) < 0)
        goto error;
    if (PyFile_WriteString("\n", f_stderr) < 0)
        goto error;
    Py_CLEAR(name);
Christian Heimes's avatar
Christian Heimes committed
343 344 345

    /* Print "  source_line\n" */
    if (sourceline) {
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
        int kind;
        void *data;
        Py_ssize_t i, len;
        Py_UCS4 ch;
        PyObject *truncated;

        if (PyUnicode_READY(sourceline) < 1)
            goto error;

        kind = PyUnicode_KIND(sourceline);
        data = PyUnicode_DATA(sourceline);
        len = PyUnicode_GET_LENGTH(sourceline);
        for (i=0; i<len; i++) {
            ch = PyUnicode_READ(kind, data, i);
            if (ch != ' ' && ch != '\t' && ch != '\014')
                break;
        }

        truncated = PyUnicode_Substring(sourceline, i, len);
        if (truncated == NULL)
            goto error;

        PyFile_WriteObject(sourceline, f_stderr, Py_PRINT_RAW);
        Py_DECREF(truncated);
Christian Heimes's avatar
Christian Heimes committed
370 371
        PyFile_WriteString("\n", f_stderr);
    }
372 373 374
    else {
        _Py_DisplaySourceLine(f_stderr, filename, lineno, 2);
    }
375 376

error:
377
    Py_XDECREF(name);
Christian Heimes's avatar
Christian Heimes committed
378 379 380
    PyErr_Clear();
}

381 382 383
static int
call_show_warning(PyObject *category, PyObject *text, PyObject *message,
                  PyObject *filename, int lineno, PyObject *lineno_obj,
384
                  PyObject *sourceline, PyObject *source)
385 386 387
{
    PyObject *show_fn, *msg, *res, *warnmsg_cls = NULL;

388 389 390 391
    /* If the source parameter is set, try to get the Python implementation.
       The Python implementation is able to log the traceback where the source
       was allocated, whereas the C implementation doesnt. */
    show_fn = get_warnings_attr("_showwarnmsg", source != NULL);
392 393 394 395 396 397 398 399 400 401 402 403 404
    if (show_fn == NULL) {
        if (PyErr_Occurred())
            return -1;
        show_warning(filename, lineno, text, category, sourceline);
        return 0;
    }

    if (!PyCallable_Check(show_fn)) {
        PyErr_SetString(PyExc_TypeError,
                "warnings._showwarnmsg() must be set to a callable");
        goto error;
    }

405
    warnmsg_cls = get_warnings_attr("WarningMessage", 0);
406 407 408 409 410 411 412
    if (warnmsg_cls == NULL) {
        PyErr_SetString(PyExc_RuntimeError,
                "unable to get warnings.WarningMessage");
        goto error;
    }

    msg = PyObject_CallFunctionObjArgs(warnmsg_cls, message, category,
413
            filename, lineno_obj, Py_None, Py_None, source,
414 415 416 417 418
            NULL);
    Py_DECREF(warnmsg_cls);
    if (msg == NULL)
        goto error;

419
    res = PyObject_CallFunctionObjArgs(show_fn, msg, NULL);
420 421 422 423 424 425 426 427 428 429 430 431 432 433
    Py_DECREF(show_fn);
    Py_DECREF(msg);

    if (res == NULL)
        return -1;

    Py_DECREF(res);
    return 0;

error:
    Py_XDECREF(show_fn);
    return -1;
}

Christian Heimes's avatar
Christian Heimes committed
434
static PyObject *
435
warn_explicit(PyObject *category, PyObject *message,
Christian Heimes's avatar
Christian Heimes committed
436
              PyObject *filename, int lineno,
437 438
              PyObject *module, PyObject *registry, PyObject *sourceline,
              PyObject *source)
Christian Heimes's avatar
Christian Heimes committed
439 440
{
    PyObject *key = NULL, *text = NULL, *result = NULL, *lineno_obj = NULL;
441
    PyObject *item = NULL;
442
    PyObject *action;
Christian Heimes's avatar
Christian Heimes committed
443
    int rc;
444

445 446 447 448 449 450 451
    /* module can be None if a warning is emitted late during Python shutdown.
       In this case, the Python warnings module was probably unloaded, filters
       are no more available to choose as action. It is safer to ignore the
       warning and do nothing. */
    if (module == Py_None)
        Py_RETURN_NONE;

452 453 454 455
    if (registry && !PyDict_Check(registry) && (registry != Py_None)) {
        PyErr_SetString(PyExc_TypeError, "'registry' must be a dict");
        return NULL;
    }
Christian Heimes's avatar
Christian Heimes committed
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473

    /* Normalize module. */
    if (module == NULL) {
        module = normalize_module(filename);
        if (module == NULL)
            return NULL;
    }
    else
        Py_INCREF(module);

    /* Normalize message. */
    Py_INCREF(message);  /* DECREF'ed in cleanup. */
    rc = PyObject_IsInstance(message, PyExc_Warning);
    if (rc == -1) {
        goto cleanup;
    }
    if (rc == 1) {
        text = PyObject_Str(message);
474 475
        if (text == NULL)
            goto cleanup;
Christian Heimes's avatar
Christian Heimes committed
476 477 478 479
        category = (PyObject*)message->ob_type;
    }
    else {
        text = message;
480
        message = PyObject_CallFunctionObjArgs(category, message, NULL);
481 482
        if (message == NULL)
            goto cleanup;
Christian Heimes's avatar
Christian Heimes committed
483 484 485 486 487 488
    }

    lineno_obj = PyLong_FromLong(lineno);
    if (lineno_obj == NULL)
        goto cleanup;

489 490 491 492
    if (source == Py_None) {
        source = NULL;
    }

Christian Heimes's avatar
Christian Heimes committed
493 494 495 496 497
    /* Create key. */
    key = PyTuple_Pack(3, text, category, lineno_obj);
    if (key == NULL)
        goto cleanup;

498
    if ((registry != NULL) && (registry != Py_None)) {
Christian Heimes's avatar
Christian Heimes committed
499 500 501
        rc = already_warned(registry, key, 0);
        if (rc == -1)
            goto cleanup;
502
        else if (rc == 1)
Christian Heimes's avatar
Christian Heimes committed
503 504 505 506 507 508 509 510
            goto return_none;
        /* Else this warning hasn't been generated before. */
    }

    action = get_filter(category, text, lineno, module, &item);
    if (action == NULL)
        goto cleanup;

511
    if (_PyUnicode_EqualToASCIIString(action, "error")) {
Christian Heimes's avatar
Christian Heimes committed
512 513 514 515 516 517 518
        PyErr_SetObject(category, message);
        goto cleanup;
    }

    /* Store in the registry that we've been here, *except* when the action
       is "always". */
    rc = 0;
519
    if (!_PyUnicode_EqualToASCIIString(action, "always")) {
520 521
        if (registry != NULL && registry != Py_None &&
                PyDict_SetItem(registry, key, Py_True) < 0)
Christian Heimes's avatar
Christian Heimes committed
522
            goto cleanup;
523
        else if (_PyUnicode_EqualToASCIIString(action, "ignore"))
Christian Heimes's avatar
Christian Heimes committed
524
            goto return_none;
525
        else if (_PyUnicode_EqualToASCIIString(action, "once")) {
526
            if (registry == NULL || registry == Py_None) {
Christian Heimes's avatar
Christian Heimes committed
527 528 529 530 531
                registry = get_once_registry();
                if (registry == NULL)
                    goto cleanup;
            }
            /* _once_registry[(text, category)] = 1 */
532
            rc = update_registry(registry, text, category, 0);
Christian Heimes's avatar
Christian Heimes committed
533
        }
534
        else if (_PyUnicode_EqualToASCIIString(action, "module")) {
Christian Heimes's avatar
Christian Heimes committed
535
            /* registry[(text, category, 0)] = 1 */
536
            if (registry != NULL && registry != Py_None)
537
                rc = update_registry(registry, text, category, 0);
Christian Heimes's avatar
Christian Heimes committed
538
        }
539
        else if (!_PyUnicode_EqualToASCIIString(action, "default")) {
Christian Heimes's avatar
Christian Heimes committed
540
            PyErr_Format(PyExc_RuntimeError,
541 542
                        "Unrecognized action (%R) in warnings.filters:\n %R",
                        action, item);
Christian Heimes's avatar
Christian Heimes committed
543 544 545 546
            goto cleanup;
        }
    }

547
    if (rc == 1)  /* Already warned for this module. */
Christian Heimes's avatar
Christian Heimes committed
548 549
        goto return_none;
    if (rc == 0) {
550
        if (call_show_warning(category, text, message, filename, lineno,
551
                              lineno_obj, sourceline, source) < 0)
552
            goto cleanup;
Christian Heimes's avatar
Christian Heimes committed
553 554 555 556 557 558 559 560 561
    }
    else /* if (rc == -1) */
        goto cleanup;

 return_none:
    result = Py_None;
    Py_INCREF(result);

 cleanup:
562
    Py_XDECREF(item);
Christian Heimes's avatar
Christian Heimes committed
563 564 565 566
    Py_XDECREF(key);
    Py_XDECREF(text);
    Py_XDECREF(lineno_obj);
    Py_DECREF(module);
567
    Py_XDECREF(message);
Christian Heimes's avatar
Christian Heimes committed
568 569 570
    return result;  /* Py_None or NULL. */
}

571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628
static int
is_internal_frame(PyFrameObject *frame)
{
    static PyObject *importlib_string = NULL;
    static PyObject *bootstrap_string = NULL;
    PyObject *filename;
    int contains;

    if (importlib_string == NULL) {
        importlib_string = PyUnicode_FromString("importlib");
        if (importlib_string == NULL) {
            return 0;
        }

        bootstrap_string = PyUnicode_FromString("_bootstrap");
        if (bootstrap_string == NULL) {
            Py_DECREF(importlib_string);
            return 0;
        }
        Py_INCREF(importlib_string);
        Py_INCREF(bootstrap_string);
    }

    if (frame == NULL || frame->f_code == NULL ||
            frame->f_code->co_filename == NULL) {
        return 0;
    }
    filename = frame->f_code->co_filename;
    if (!PyUnicode_Check(filename)) {
        return 0;
    }
    contains = PyUnicode_Contains(filename, importlib_string);
    if (contains < 0) {
        return 0;
    }
    else if (contains > 0) {
        contains = PyUnicode_Contains(filename, bootstrap_string);
        if (contains < 0) {
            return 0;
        }
        else if (contains > 0) {
            return 1;
        }
    }

    return 0;
}

static PyFrameObject *
next_external_frame(PyFrameObject *frame)
{
    do {
        frame = frame->f_back;
    } while (frame != NULL && is_internal_frame(frame));

    return frame;
}

Christian Heimes's avatar
Christian Heimes committed
629 630 631 632 633 634 635 636 637 638
/* filename, module, and registry are new refs, globals is borrowed */
/* Returns 0 on error (no new refs), 1 on success */
static int
setup_context(Py_ssize_t stack_level, PyObject **filename, int *lineno,
              PyObject **module, PyObject **registry)
{
    PyObject *globals;

    /* Setup globals and lineno. */
    PyFrameObject *f = PyThreadState_GET()->frame;
639 640 641 642 643 644 645 646 647 648 649 650
    // Stack level comparisons to Python code is off by one as there is no
    // warnings-related stack level to avoid.
    if (stack_level <= 0 || is_internal_frame(f)) {
        while (--stack_level > 0 && f != NULL) {
            f = f->f_back;
        }
    }
    else {
        while (--stack_level > 0 && f != NULL) {
            f = next_external_frame(f);
        }
    }
Christian Heimes's avatar
Christian Heimes committed
651 652 653 654 655 656 657

    if (f == NULL) {
        globals = PyThreadState_Get()->interp->sysdict;
        *lineno = 1;
    }
    else {
        globals = f->f_globals;
658
        *lineno = PyFrame_GetLineNumber(f);
Christian Heimes's avatar
Christian Heimes committed
659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692
    }

    *module = NULL;

    /* Setup registry. */
    assert(globals != NULL);
    assert(PyDict_Check(globals));
    *registry = PyDict_GetItemString(globals, "__warningregistry__");
    if (*registry == NULL) {
        int rc;

        *registry = PyDict_New();
        if (*registry == NULL)
            return 0;

         rc = PyDict_SetItemString(globals, "__warningregistry__", *registry);
         if (rc < 0)
            goto handle_error;
    }
    else
        Py_INCREF(*registry);

    /* Setup module. */
    *module = PyDict_GetItemString(globals, "__name__");
    if (*module == NULL) {
        *module = PyUnicode_FromString("<string>");
        if (*module == NULL)
            goto handle_error;
    }
    else
        Py_INCREF(*module);

    /* Setup filename. */
    *filename = PyDict_GetItemString(globals, "__file__");
693
    if (*filename != NULL && PyUnicode_Check(*filename)) {
694 695 696 697 698 699 700
        Py_ssize_t len;
        int kind;
        void *data;

        if (PyUnicode_READY(*filename))
            goto handle_error;

701
        len = PyUnicode_GetLength(*filename);
702 703
        kind = PyUnicode_KIND(*filename);
        data = PyUnicode_DATA(*filename);
Christian Heimes's avatar
Christian Heimes committed
704

705
#define ascii_lower(c) ((c <= 127) ? Py_TOLOWER(c) : 0)
706
        /* if filename.lower().endswith(".pyc"): */
Christian Heimes's avatar
Christian Heimes committed
707
        if (len >= 4 &&
Martin v. Löwis's avatar
Martin v. Löwis committed
708
            PyUnicode_READ(kind, data, len-4) == '.' &&
709 710
            ascii_lower(PyUnicode_READ(kind, data, len-3)) == 'p' &&
            ascii_lower(PyUnicode_READ(kind, data, len-2)) == 'y' &&
711
            ascii_lower(PyUnicode_READ(kind, data, len-1)) == 'c')
Christian Heimes's avatar
Christian Heimes committed
712
        {
Martin v. Löwis's avatar
Martin v. Löwis committed
713 714
            *filename = PyUnicode_Substring(*filename, 0,
                                            PyUnicode_GET_LENGTH(*filename)-1);
715 716 717 718
            if (*filename == NULL)
                goto handle_error;
        }
        else
Christian Heimes's avatar
Christian Heimes committed
719 720 721
            Py_INCREF(*filename);
    }
    else {
722
        *filename = NULL;
723
        if (*module != Py_None && _PyUnicode_EqualToASCIIString(*module, "__main__")) {
724
            PyObject *argv = _PySys_GetObjectId(&PyId_argv);
725 726 727
            /* PyList_Check() is needed because sys.argv is set to None during
               Python finalization */
            if (argv != NULL && PyList_Check(argv) && PyList_Size(argv) > 0) {
Christian Heimes's avatar
Christian Heimes committed
728
                int is_true;
Christian Heimes's avatar
Christian Heimes committed
729 730
                *filename = PyList_GetItem(argv, 0);
                Py_INCREF(*filename);
Christian Heimes's avatar
Christian Heimes committed
731 732 733 734 735 736 737
                /* If sys.argv[0] is false, then use '__main__'. */
                is_true = PyObject_IsTrue(*filename);
                if (is_true < 0) {
                    Py_DECREF(*filename);
                    goto handle_error;
                }
                else if (!is_true) {
738
                    Py_SETREF(*filename, PyUnicode_FromString("__main__"));
Christian Heimes's avatar
Christian Heimes committed
739 740 741
                    if (*filename == NULL)
                        goto handle_error;
                }
Christian Heimes's avatar
Christian Heimes committed
742 743 744 745
            }
            else {
                /* embedded interpreters don't have sys.argv, see bug #839151 */
                *filename = PyUnicode_FromString("__main__");
746 747
                if (*filename == NULL)
                    goto handle_error;
Christian Heimes's avatar
Christian Heimes committed
748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777
            }
        }
        if (*filename == NULL) {
            *filename = *module;
            Py_INCREF(*filename);
        }
    }

    return 1;

 handle_error:
    /* filename not XDECREF'ed here as there is no way to jump here with a
       dangling reference. */
    Py_XDECREF(*registry);
    Py_XDECREF(*module);
    return 0;
}

static PyObject *
get_category(PyObject *message, PyObject *category)
{
    int rc;

    /* Get category. */
    rc = PyObject_IsInstance(message, PyExc_Warning);
    if (rc == -1)
        return NULL;

    if (rc == 1)
        category = (PyObject*)message->ob_type;
778
    else if (category == NULL || category == Py_None)
Christian Heimes's avatar
Christian Heimes committed
779 780 781 782
        category = PyExc_UserWarning;

    /* Validate category. */
    rc = PyObject_IsSubclass(category, PyExc_Warning);
783 784 785 786 787 788
    /* category is not a subclass of PyExc_Warning or
       PyObject_IsSubclass raised an error */
    if (rc == -1 || rc == 0) {
        PyErr_Format(PyExc_TypeError,
                     "category must be a Warning subclass, not '%s'",
                     Py_TYPE(category)->tp_name);
Christian Heimes's avatar
Christian Heimes committed
789 790 791 792 793 794 795
        return NULL;
    }

    return category;
}

static PyObject *
796 797
do_warn(PyObject *message, PyObject *category, Py_ssize_t stack_level,
        PyObject *source)
Christian Heimes's avatar
Christian Heimes committed
798 799 800 801 802 803 804
{
    PyObject *filename, *module, *registry, *res;
    int lineno;

    if (!setup_context(stack_level, &filename, &lineno, &module, &registry))
        return NULL;

805
    res = warn_explicit(category, message, filename, lineno, module, registry,
806
                        NULL, source);
Christian Heimes's avatar
Christian Heimes committed
807 808 809 810 811 812
    Py_DECREF(filename);
    Py_DECREF(registry);
    Py_DECREF(module);
    return res;
}

813 814
/*[clinic input]
warn as warnings_warn
Christian Heimes's avatar
Christian Heimes committed
815

816 817 818 819
    message: object
    category: object = None
    stacklevel: Py_ssize_t = 1
    source: object = None
Christian Heimes's avatar
Christian Heimes committed
820

821 822 823 824 825 826 827 828
Issue a warning, or maybe ignore it or raise an exception.
[clinic start generated code]*/

static PyObject *
warnings_warn_impl(PyObject *module, PyObject *message, PyObject *category,
                   Py_ssize_t stacklevel, PyObject *source)
/*[clinic end generated code: output=31ed5ab7d8d760b2 input=bfdf5cf99f6c4edd]*/
{
Christian Heimes's avatar
Christian Heimes committed
829 830 831
    category = get_category(message, category);
    if (category == NULL)
        return NULL;
832
    return do_warn(message, category, stacklevel, source);
Christian Heimes's avatar
Christian Heimes committed
833 834 835 836 837 838
}

static PyObject *
warnings_warn_explicit(PyObject *self, PyObject *args, PyObject *kwds)
{
    static char *kwd_list[] = {"message", "category", "filename", "lineno",
839 840
                                "module", "registry", "module_globals",
                                "source", 0};
Christian Heimes's avatar
Christian Heimes committed
841 842 843 844 845 846 847
    PyObject *message;
    PyObject *category;
    PyObject *filename;
    int lineno;
    PyObject *module = NULL;
    PyObject *registry = NULL;
    PyObject *module_globals = NULL;
848
    PyObject *sourceobj = NULL;
Christian Heimes's avatar
Christian Heimes committed
849

850
    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOUi|OOOO:warn_explicit",
Christian Heimes's avatar
Christian Heimes committed
851
                kwd_list, &message, &category, &filename, &lineno, &module,
852
                &registry, &module_globals, &sourceobj))
Christian Heimes's avatar
Christian Heimes committed
853 854 855
        return NULL;

    if (module_globals) {
856 857 858
        _Py_IDENTIFIER(get_source);
        _Py_IDENTIFIER(splitlines);
        PyObject *tmp;
Christian Heimes's avatar
Christian Heimes committed
859 860 861 862 863 864 865
        PyObject *loader;
        PyObject *module_name;
        PyObject *source;
        PyObject *source_list;
        PyObject *source_line;
        PyObject *returned;

866 867 868 869
        if ((tmp = _PyUnicode_FromId(&PyId_get_source)) == NULL)
            return NULL;
        if ((tmp = _PyUnicode_FromId(&PyId_splitlines)) == NULL)
            return NULL;
Christian Heimes's avatar
Christian Heimes committed
870 871 872 873 874 875 876 877 878

        /* Check/get the requisite pieces needed for the loader. */
        loader = PyDict_GetItemString(module_globals, "__loader__");
        module_name = PyDict_GetItemString(module_globals, "__name__");

        if (loader == NULL || module_name == NULL)
            goto standard_call;

        /* Make sure the loader implements the optional get_source() method. */
879
        if (!_PyObject_HasAttrId(loader, &PyId_get_source))
Christian Heimes's avatar
Christian Heimes committed
880 881
                goto standard_call;
        /* Call get_source() to get the source code. */
882 883
        source = PyObject_CallMethodObjArgs(loader, PyId_get_source.object,
                                            module_name, NULL);
Christian Heimes's avatar
Christian Heimes committed
884 885 886 887 888 889 890 891
        if (!source)
            return NULL;
        else if (source == Py_None) {
            Py_DECREF(Py_None);
            goto standard_call;
        }

        /* Split the source into lines. */
892
        source_list = PyObject_CallMethodObjArgs(source,
893 894
                                                 PyId_splitlines.object,
                                                 NULL);
Christian Heimes's avatar
Christian Heimes committed
895 896 897 898 899 900 901 902 903 904 905 906 907
        Py_DECREF(source);
        if (!source_list)
            return NULL;

        /* Get the source line. */
        source_line = PyList_GetItem(source_list, lineno-1);
        if (!source_line) {
            Py_DECREF(source_list);
            return NULL;
        }

        /* Handle the warning. */
        returned = warn_explicit(category, message, filename, lineno, module,
908
                                 registry, source_line, sourceobj);
Christian Heimes's avatar
Christian Heimes committed
909 910 911 912 913 914
        Py_DECREF(source_list);
        return returned;
    }

 standard_call:
    return warn_explicit(category, message, filename, lineno, module,
915
                         registry, NULL, sourceobj);
Christian Heimes's avatar
Christian Heimes committed
916 917
}

918 919 920 921 922 923 924
static PyObject *
warnings_filters_mutated(PyObject *self, PyObject *args)
{
    _filters_version++;
    Py_RETURN_NONE;
}

Christian Heimes's avatar
Christian Heimes committed
925 926

/* Function to issue a warning message; may raise an exception. */
927 928 929

static int
warn_unicode(PyObject *category, PyObject *message,
930
             Py_ssize_t stack_level, PyObject *source)
Christian Heimes's avatar
Christian Heimes committed
931 932 933 934 935 936
{
    PyObject *res;

    if (category == NULL)
        category = PyExc_RuntimeWarning;

937
    res = do_warn(message, category, stack_level, source);
Christian Heimes's avatar
Christian Heimes committed
938 939 940 941 942 943 944
    if (res == NULL)
        return -1;
    Py_DECREF(res);

    return 0;
}

945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961
static int
_PyErr_WarnFormatV(PyObject *source,
                   PyObject *category, Py_ssize_t stack_level,
                   const char *format, va_list vargs)
{
    PyObject *message;
    int res;

    message = PyUnicode_FromFormatV(format, vargs);
    if (message == NULL)
        return -1;

    res = warn_unicode(category, message, stack_level, source);
    Py_DECREF(message);
    return res;
}

962 963 964 965
int
PyErr_WarnFormat(PyObject *category, Py_ssize_t stack_level,
                 const char *format, ...)
{
966
    int res;
967 968 969 970 971 972 973
    va_list vargs;

#ifdef HAVE_STDARG_PROTOTYPES
    va_start(vargs, format);
#else
    va_start(vargs);
#endif
974
    res = _PyErr_WarnFormatV(NULL, category, stack_level, format, vargs);
975
    va_end(vargs);
976
    return res;
977 978
}

979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997
int
PyErr_ResourceWarning(PyObject *source, Py_ssize_t stack_level,
                      const char *format, ...)
{
    int res;
    va_list vargs;

#ifdef HAVE_STDARG_PROTOTYPES
    va_start(vargs, format);
#else
    va_start(vargs);
#endif
    res = _PyErr_WarnFormatV(source, PyExc_ResourceWarning,
                             stack_level, format, vargs);
    va_end(vargs);
    return res;
}


998 999 1000 1001 1002 1003 1004
int
PyErr_WarnEx(PyObject *category, const char *text, Py_ssize_t stack_level)
{
    int ret;
    PyObject *message = PyUnicode_FromString(text);
    if (message == NULL)
        return -1;
1005
    ret = warn_unicode(category, message, stack_level, NULL);
1006 1007 1008 1009
    Py_DECREF(message);
    return ret;
}

1010
/* PyErr_Warn is only for backwards compatibility and will be removed.
Christian Heimes's avatar
Christian Heimes committed
1011 1012 1013 1014 1015
   Use PyErr_WarnEx instead. */

#undef PyErr_Warn

PyAPI_FUNC(int)
1016
PyErr_Warn(PyObject *category, const char *text)
Christian Heimes's avatar
Christian Heimes committed
1017 1018 1019 1020 1021
{
    return PyErr_WarnEx(category, text, 1);
}

/* Warning with explicit origin */
1022 1023 1024 1025 1026 1027 1028 1029 1030
int
PyErr_WarnExplicitObject(PyObject *category, PyObject *message,
                         PyObject *filename, int lineno,
                         PyObject *module, PyObject *registry)
{
    PyObject *res;
    if (category == NULL)
        category = PyExc_RuntimeWarning;
    res = warn_explicit(category, message, filename, lineno,
1031
                        module, registry, NULL, NULL);
1032 1033 1034 1035 1036 1037
    if (res == NULL)
        return -1;
    Py_DECREF(res);
    return 0;
}

Christian Heimes's avatar
Christian Heimes committed
1038 1039 1040 1041 1042 1043
int
PyErr_WarnExplicit(PyObject *category, const char *text,
                   const char *filename_str, int lineno,
                   const char *module_str, PyObject *registry)
{
    PyObject *message = PyUnicode_FromString(text);
1044
    PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
Christian Heimes's avatar
Christian Heimes committed
1045 1046 1047 1048 1049 1050 1051
    PyObject *module = NULL;
    int ret = -1;

    if (message == NULL || filename == NULL)
        goto exit;
    if (module_str != NULL) {
        module = PyUnicode_FromString(module_str);
1052 1053
        if (module == NULL)
            goto exit;
Christian Heimes's avatar
Christian Heimes committed
1054 1055
    }

1056 1057
    ret = PyErr_WarnExplicitObject(category, message, filename, lineno,
                                   module, registry);
Christian Heimes's avatar
Christian Heimes committed
1058 1059 1060 1061 1062 1063 1064 1065

 exit:
    Py_XDECREF(message);
    Py_XDECREF(module);
    Py_XDECREF(filename);
    return ret;
}

1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094
int
PyErr_WarnExplicitFormat(PyObject *category,
                         const char *filename_str, int lineno,
                         const char *module_str, PyObject *registry,
                         const char *format, ...)
{
    PyObject *message;
    PyObject *module = NULL;
    PyObject *filename = PyUnicode_DecodeFSDefault(filename_str);
    int ret = -1;
    va_list vargs;

    if (filename == NULL)
        goto exit;
    if (module_str != NULL) {
        module = PyUnicode_FromString(module_str);
        if (module == NULL)
            goto exit;
    }

#ifdef HAVE_STDARG_PROTOTYPES
    va_start(vargs, format);
#else
    va_start(vargs);
#endif
    message = PyUnicode_FromFormatV(format, vargs);
    if (message != NULL) {
        PyObject *res;
        res = warn_explicit(category, message, filename, lineno,
1095
                            module, registry, NULL, NULL);
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
        Py_DECREF(message);
        if (res != NULL) {
            Py_DECREF(res);
            ret = 0;
        }
    }
    va_end(vargs);
exit:
    Py_XDECREF(module);
    Py_XDECREF(filename);
    return ret;
}

Christian Heimes's avatar
Christian Heimes committed
1109 1110 1111 1112 1113

PyDoc_STRVAR(warn_explicit_doc,
"Low-level inferface to warnings functionality.");

static PyMethodDef warnings_functions[] = {
1114
    WARNINGS_WARN_METHODDEF
Christian Heimes's avatar
Christian Heimes committed
1115 1116
    {"warn_explicit", (PyCFunction)warnings_warn_explicit,
        METH_VARARGS | METH_KEYWORDS, warn_explicit_doc},
1117 1118
    {"_filters_mutated", (PyCFunction)warnings_filters_mutated, METH_NOARGS,
        NULL},
1119 1120
    /* XXX(brett.cannon): add showwarning? */
    /* XXX(brett.cannon): Reasonable to add formatwarning? */
1121
    {NULL, NULL}                /* sentinel */
Christian Heimes's avatar
Christian Heimes committed
1122 1123 1124 1125 1126 1127 1128 1129 1130
};


static PyObject *
create_filter(PyObject *category, const char *action)
{
    static PyObject *ignore_str = NULL;
    static PyObject *error_str = NULL;
    static PyObject *default_str = NULL;
1131
    static PyObject *always_str = NULL;
Christian Heimes's avatar
Christian Heimes committed
1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158
    PyObject *action_obj = NULL;
    PyObject *lineno, *result;

    if (!strcmp(action, "ignore")) {
        if (ignore_str == NULL) {
            ignore_str = PyUnicode_InternFromString("ignore");
            if (ignore_str == NULL)
                return NULL;
        }
        action_obj = ignore_str;
    }
    else if (!strcmp(action, "error")) {
        if (error_str == NULL) {
            error_str = PyUnicode_InternFromString("error");
            if (error_str == NULL)
                return NULL;
        }
        action_obj = error_str;
    }
    else if (!strcmp(action, "default")) {
        if (default_str == NULL) {
            default_str = PyUnicode_InternFromString("default");
            if (default_str == NULL)
                return NULL;
        }
        action_obj = default_str;
    }
1159 1160 1161 1162 1163 1164 1165 1166
    else if (!strcmp(action, "always")) {
        if (always_str == NULL) {
            always_str = PyUnicode_InternFromString("always");
            if (always_str == NULL)
                return NULL;
        }
        action_obj = always_str;
    }
Christian Heimes's avatar
Christian Heimes committed
1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182
    else {
        Py_FatalError("unknown action");
    }

    /* This assumes the line number is zero for now. */
    lineno = PyLong_FromLong(0);
    if (lineno == NULL)
        return NULL;
    result = PyTuple_Pack(5, action_obj, Py_None, category, Py_None, lineno);
    Py_DECREF(lineno);
    return result;
}

static PyObject *
init_filters(void)
{
1183
    PyObject *filters = PyList_New(5);
1184 1185
    unsigned int pos = 0;  /* Post-incremented in each use. */
    unsigned int x;
1186
    const char *bytes_action, *resource_action;
1187

Christian Heimes's avatar
Christian Heimes committed
1188 1189 1190
    if (filters == NULL)
        return NULL;

1191 1192 1193
    PyList_SET_ITEM(filters, pos++,
                    create_filter(PyExc_DeprecationWarning, "ignore"));
    PyList_SET_ITEM(filters, pos++,
Christian Heimes's avatar
Christian Heimes committed
1194
                    create_filter(PyExc_PendingDeprecationWarning, "ignore"));
1195 1196
    PyList_SET_ITEM(filters, pos++,
                    create_filter(PyExc_ImportWarning, "ignore"));
Christian Heimes's avatar
Christian Heimes committed
1197 1198 1199 1200 1201 1202
    if (Py_BytesWarningFlag > 1)
        bytes_action = "error";
    else if (Py_BytesWarningFlag)
        bytes_action = "default";
    else
        bytes_action = "ignore";
1203
    PyList_SET_ITEM(filters, pos++, create_filter(PyExc_BytesWarning,
Christian Heimes's avatar
Christian Heimes committed
1204
                    bytes_action));
1205 1206 1207 1208 1209 1210 1211 1212
    /* resource usage warnings are enabled by default in pydebug mode */
#ifdef Py_DEBUG
    resource_action = "always";
#else
    resource_action = "ignore";
#endif
    PyList_SET_ITEM(filters, pos++, create_filter(PyExc_ResourceWarning,
                    resource_action));
1213 1214 1215 1216 1217
    for (x = 0; x < pos; x += 1) {
        if (PyList_GET_ITEM(filters, x) == NULL) {
            Py_DECREF(filters);
            return NULL;
        }
Christian Heimes's avatar
Christian Heimes committed
1218 1219 1220 1221 1222
    }

    return filters;
}

1223
static struct PyModuleDef warningsmodule = {
1224 1225 1226 1227 1228 1229 1230 1231 1232
        PyModuleDef_HEAD_INIT,
        MODULE_NAME,
        warnings__doc__,
        0,
        warnings_functions,
        NULL,
        NULL,
        NULL,
        NULL
1233 1234
};

Christian Heimes's avatar
Christian Heimes committed
1235 1236 1237 1238

PyMODINIT_FUNC
_PyWarnings_Init(void)
{
1239
    PyObject *m;
Christian Heimes's avatar
Christian Heimes committed
1240

1241
    m = PyModule_Create(&warningsmodule);
Christian Heimes's avatar
Christian Heimes committed
1242
    if (m == NULL)
1243
        return NULL;
Christian Heimes's avatar
Christian Heimes committed
1244

1245 1246 1247 1248 1249
    if (_filters == NULL) {
        _filters = init_filters();
        if (_filters == NULL)
            return NULL;
    }
Christian Heimes's avatar
Christian Heimes committed
1250 1251
    Py_INCREF(_filters);
    if (PyModule_AddObject(m, "filters", _filters) < 0)
1252
        return NULL;
Christian Heimes's avatar
Christian Heimes committed
1253

1254 1255 1256 1257 1258
    if (_once_registry == NULL) {
        _once_registry = PyDict_New();
        if (_once_registry == NULL)
            return NULL;
    }
Christian Heimes's avatar
Christian Heimes committed
1259
    Py_INCREF(_once_registry);
1260
    if (PyModule_AddObject(m, "_onceregistry", _once_registry) < 0)
1261
        return NULL;
Christian Heimes's avatar
Christian Heimes committed
1262

1263 1264 1265 1266 1267 1268
    if (_default_action == NULL) {
        _default_action = PyUnicode_FromString("default");
        if (_default_action == NULL)
            return NULL;
    }
    Py_INCREF(_default_action);
1269
    if (PyModule_AddObject(m, "_defaultaction", _default_action) < 0)
1270
        return NULL;
1271 1272

    _filters_version = 0;
1273
    return m;
Christian Heimes's avatar
Christian Heimes committed
1274
}