Coverage Report

Created: 2025-10-12 06:48

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/cpython/Python/compile.c
Line
Count
Source
1
/*
2
 * This file compiles an abstract syntax tree (AST) into Python bytecode.
3
 *
4
 * The primary entry point is _PyAST_Compile(), which returns a
5
 * PyCodeObject.  The compiler makes several passes to build the code
6
 * object:
7
 *   1. Checks for future statements.  See future.c
8
 *   2. Builds a symbol table.  See symtable.c.
9
 *   3. Generate an instruction sequence. See compiler_mod() in this file, which
10
 *      calls functions from codegen.c.
11
 *   4. Generate a control flow graph and run optimizations on it.  See flowgraph.c.
12
 *   5. Assemble the basic blocks into final code.  See optimize_and_assemble() in
13
 *      this file, and assembler.c.
14
 *
15
 */
16
17
#include "Python.h"
18
#include "pycore_ast.h"           // PyAST_Check()
19
#include "pycore_code.h"
20
#include "pycore_compile.h"
21
#include "pycore_flowgraph.h"     // _PyCfg_FromInstructionSequence()
22
#include "pycore_pystate.h"       // _Py_GetConfig()
23
#include "pycore_runtime.h"       // _Py_ID()
24
#include "pycore_setobject.h"     // _PySet_NextEntry()
25
#include "pycore_stats.h"
26
#include "pycore_unicodeobject.h" // _PyUnicode_EqualToASCIIString()
27
28
#include "cpython/code.h"
29
30
#include <stdbool.h>
31
32
33
#undef SUCCESS
34
#undef ERROR
35
185k
#define SUCCESS 0
36
1
#define ERROR -1
37
38
#define RETURN_IF_ERROR(X)  \
39
68.7k
    do {                    \
40
68.7k
        if ((X) == -1) {    \
41
0
            return ERROR;   \
42
0
        }                   \
43
68.7k
    } while (0)
44
45
typedef _Py_SourceLocation location;
46
typedef _PyJumpTargetLabel jump_target_label;
47
typedef _PyInstructionSequence instr_sequence;
48
typedef struct _PyCfgBuilder cfg_builder;
49
typedef _PyCompile_FBlockInfo fblockinfo;
50
typedef enum _PyCompile_FBlockType fblocktype;
51
52
/* The following items change on entry and exit of code blocks.
53
   They must be saved and restored when returning to a block.
54
*/
55
struct compiler_unit {
56
    PySTEntryObject *u_ste;
57
58
    int u_scope_type;
59
60
    PyObject *u_private;            /* for private name mangling */
61
    PyObject *u_static_attributes;  /* for class: attributes accessed via self.X */
62
    PyObject *u_deferred_annotations; /* AnnAssign nodes deferred to the end of compilation */
63
    PyObject *u_conditional_annotation_indices;  /* indices of annotations that are conditionally executed (or -1 for unconditional annotations) */
64
    long u_next_conditional_annotation_index;  /* index of the next conditional annotation */
65
66
    instr_sequence *u_instr_sequence; /* codegen output */
67
    instr_sequence *u_stashed_instr_sequence; /* temporarily stashed parent instruction sequence */
68
69
    int u_nfblocks;
70
    int u_in_inlined_comp;
71
    int u_in_conditional_block;
72
73
    _PyCompile_FBlockInfo u_fblock[CO_MAXBLOCKS];
74
75
    _PyCompile_CodeUnitMetadata u_metadata;
76
};
77
78
/* This struct captures the global state of a compilation.
79
80
The u pointer points to the current compilation unit, while units
81
for enclosing blocks are stored in c_stack.     The u and c_stack are
82
managed by _PyCompile_EnterScope() and _PyCompile_ExitScope().
83
84
Note that we don't track recursion levels during compilation - the
85
task of detecting and rejecting excessive levels of nesting is
86
handled by the symbol analysis pass.
87
88
*/
89
90
typedef struct _PyCompiler {
91
    PyObject *c_filename;
92
    struct symtable *c_st;
93
    _PyFutureFeatures c_future;  /* module's __future__ */
94
    PyCompilerFlags c_flags;
95
96
    int c_optimize;              /* optimization level */
97
    int c_interactive;           /* true if in interactive mode */
98
    PyObject *c_const_cache;     /* Python dict holding all constants,
99
                                    including names tuple */
100
    struct compiler_unit *u;     /* compiler state for current block */
101
    PyObject *c_stack;           /* Python list holding compiler_unit ptrs */
102
103
    bool c_save_nested_seqs;     /* if true, construct recursive instruction sequences
104
                                  * (including instructions for nested code objects)
105
                                  */
106
} compiler;
107
108
static int
109
compiler_setup(compiler *c, mod_ty mod, PyObject *filename,
110
               PyCompilerFlags *flags, int optimize, PyArena *arena)
111
366
{
112
366
    PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
113
114
366
    c->c_const_cache = PyDict_New();
115
366
    if (!c->c_const_cache) {
116
0
        return ERROR;
117
0
    }
118
119
366
    c->c_stack = PyList_New(0);
120
366
    if (!c->c_stack) {
121
0
        return ERROR;
122
0
    }
123
124
366
    c->c_filename = Py_NewRef(filename);
125
366
    if (!_PyFuture_FromAST(mod, filename, &c->c_future)) {
126
0
        return ERROR;
127
0
    }
128
366
    if (!flags) {
129
48
        flags = &local_flags;
130
48
    }
131
366
    int merged = c->c_future.ff_features | flags->cf_flags;
132
366
    c->c_future.ff_features = merged;
133
366
    flags->cf_flags = merged;
134
366
    c->c_flags = *flags;
135
366
    c->c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
136
366
    c->c_save_nested_seqs = false;
137
138
366
    if (!_PyAST_Preprocess(mod, arena, filename, c->c_optimize, merged, 0)) {
139
0
        return ERROR;
140
0
    }
141
366
    c->c_st = _PySymtable_Build(mod, filename, &c->c_future);
142
366
    if (c->c_st == NULL) {
143
0
        if (!PyErr_Occurred()) {
144
0
            PyErr_SetString(PyExc_SystemError, "no symtable");
145
0
        }
146
0
        return ERROR;
147
0
    }
148
366
    return SUCCESS;
149
366
}
150
151
static void
152
compiler_free(compiler *c)
153
366
{
154
366
    if (c->c_st) {
155
366
        _PySymtable_Free(c->c_st);
156
366
    }
157
366
    Py_XDECREF(c->c_filename);
158
366
    Py_XDECREF(c->c_const_cache);
159
366
    Py_XDECREF(c->c_stack);
160
366
    PyMem_Free(c);
161
366
}
162
163
static compiler*
164
new_compiler(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
165
             int optimize, PyArena *arena)
166
366
{
167
366
    compiler *c = PyMem_Calloc(1, sizeof(compiler));
168
366
    if (c == NULL) {
169
0
        return NULL;
170
0
    }
171
366
    if (compiler_setup(c, mod, filename, pflags, optimize, arena) < 0) {
172
0
        compiler_free(c);
173
0
        return NULL;
174
0
    }
175
366
    return c;
176
366
}
177
178
static void
179
compiler_unit_free(struct compiler_unit *u)
180
6.90k
{
181
6.90k
    Py_CLEAR(u->u_instr_sequence);
182
6.90k
    Py_CLEAR(u->u_stashed_instr_sequence);
183
6.90k
    Py_CLEAR(u->u_ste);
184
6.90k
    Py_CLEAR(u->u_metadata.u_name);
185
6.90k
    Py_CLEAR(u->u_metadata.u_qualname);
186
6.90k
    Py_CLEAR(u->u_metadata.u_consts);
187
6.90k
    Py_CLEAR(u->u_metadata.u_names);
188
6.90k
    Py_CLEAR(u->u_metadata.u_varnames);
189
6.90k
    Py_CLEAR(u->u_metadata.u_freevars);
190
6.90k
    Py_CLEAR(u->u_metadata.u_cellvars);
191
6.90k
    Py_CLEAR(u->u_metadata.u_fasthidden);
192
6.90k
    Py_CLEAR(u->u_private);
193
6.90k
    Py_CLEAR(u->u_static_attributes);
194
6.90k
    Py_CLEAR(u->u_deferred_annotations);
195
6.90k
    Py_CLEAR(u->u_conditional_annotation_indices);
196
6.90k
    PyMem_Free(u);
197
6.90k
}
198
199
18.0k
#define CAPSULE_NAME "compile.c compiler unit"
200
201
int
202
_PyCompile_MaybeAddStaticAttributeToClass(compiler *c, expr_ty e)
203
14.4k
{
204
14.4k
    assert(e->kind == Attribute_kind);
205
14.4k
    expr_ty attr_value = e->v.Attribute.value;
206
14.4k
    if (attr_value->kind != Name_kind ||
207
13.4k
        e->v.Attribute.ctx != Store ||
208
1.77k
        !_PyUnicode_EqualToASCIIString(attr_value->v.Name.id, "self"))
209
13.2k
    {
210
13.2k
        return SUCCESS;
211
13.2k
    }
212
1.25k
    Py_ssize_t stack_size = PyList_GET_SIZE(c->c_stack);
213
1.28k
    for (Py_ssize_t i = stack_size - 1; i >= 0; i--) {
214
1.25k
        PyObject *capsule = PyList_GET_ITEM(c->c_stack, i);
215
1.25k
        struct compiler_unit *u = (struct compiler_unit *)PyCapsule_GetPointer(
216
1.25k
                                                              capsule, CAPSULE_NAME);
217
1.25k
        assert(u);
218
1.25k
        if (u->u_scope_type == COMPILE_SCOPE_CLASS) {
219
1.22k
            assert(u->u_static_attributes);
220
1.22k
            RETURN_IF_ERROR(PySet_Add(u->u_static_attributes, e->v.Attribute.attr));
221
1.22k
            break;
222
1.22k
        }
223
1.25k
    }
224
1.25k
    return SUCCESS;
225
1.25k
}
226
227
static int
228
compiler_set_qualname(compiler *c)
229
6.54k
{
230
6.54k
    Py_ssize_t stack_size;
231
6.54k
    struct compiler_unit *u = c->u;
232
6.54k
    PyObject *name, *base;
233
234
6.54k
    base = NULL;
235
6.54k
    stack_size = PyList_GET_SIZE(c->c_stack);
236
6.54k
    assert(stack_size >= 1);
237
6.54k
    if (stack_size > 1) {
238
3.72k
        int scope, force_global = 0;
239
3.72k
        struct compiler_unit *parent;
240
3.72k
        PyObject *mangled, *capsule;
241
242
3.72k
        capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
243
3.72k
        parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
244
3.72k
        assert(parent);
245
3.72k
        if (parent->u_scope_type == COMPILE_SCOPE_ANNOTATIONS) {
246
            /* The parent is an annotation scope, so we need to
247
               look at the grandparent. */
248
0
            if (stack_size == 2) {
249
                // If we're immediately within the module, we can skip
250
                // the rest and just set the qualname to be the same as name.
251
0
                u->u_metadata.u_qualname = Py_NewRef(u->u_metadata.u_name);
252
0
                return SUCCESS;
253
0
            }
254
0
            capsule = PyList_GET_ITEM(c->c_stack, stack_size - 2);
255
0
            parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
256
0
            assert(parent);
257
0
        }
258
259
3.72k
        if (u->u_scope_type == COMPILE_SCOPE_FUNCTION
260
382
            || u->u_scope_type == COMPILE_SCOPE_ASYNC_FUNCTION
261
3.36k
            || u->u_scope_type == COMPILE_SCOPE_CLASS) {
262
3.36k
            assert(u->u_metadata.u_name);
263
3.36k
            mangled = _Py_Mangle(parent->u_private, u->u_metadata.u_name);
264
3.36k
            if (!mangled) {
265
0
                return ERROR;
266
0
            }
267
268
3.36k
            scope = _PyST_GetScope(parent->u_ste, mangled);
269
3.36k
            Py_DECREF(mangled);
270
3.36k
            RETURN_IF_ERROR(scope);
271
3.36k
            assert(scope != GLOBAL_IMPLICIT);
272
3.36k
            if (scope == GLOBAL_EXPLICIT)
273
0
                force_global = 1;
274
3.36k
        }
275
276
3.72k
        if (!force_global) {
277
3.72k
            if (parent->u_scope_type == COMPILE_SCOPE_FUNCTION
278
3.09k
                || parent->u_scope_type == COMPILE_SCOPE_ASYNC_FUNCTION
279
3.09k
                || parent->u_scope_type == COMPILE_SCOPE_LAMBDA)
280
630
            {
281
630
                _Py_DECLARE_STR(dot_locals, ".<locals>");
282
630
                base = PyUnicode_Concat(parent->u_metadata.u_qualname,
283
630
                                        &_Py_STR(dot_locals));
284
630
                if (base == NULL) {
285
0
                    return ERROR;
286
0
                }
287
630
            }
288
3.09k
            else {
289
3.09k
                base = Py_NewRef(parent->u_metadata.u_qualname);
290
3.09k
            }
291
3.72k
        }
292
3.72k
    }
293
294
6.54k
    if (base != NULL) {
295
3.72k
        name = PyUnicode_Concat(base, _Py_LATIN1_CHR('.'));
296
3.72k
        Py_DECREF(base);
297
3.72k
        if (name == NULL) {
298
0
            return ERROR;
299
0
        }
300
3.72k
        PyUnicode_Append(&name, u->u_metadata.u_name);
301
3.72k
        if (name == NULL) {
302
0
            return ERROR;
303
0
        }
304
3.72k
    }
305
2.81k
    else {
306
2.81k
        name = Py_NewRef(u->u_metadata.u_name);
307
2.81k
    }
308
6.54k
    u->u_metadata.u_qualname = name;
309
310
6.54k
    return SUCCESS;
311
6.54k
}
312
313
/* Merge const *o* and return constant key object.
314
 * If recursive, insert all elements if o is a tuple or frozen set.
315
 */
316
static PyObject*
317
const_cache_insert(PyObject *const_cache, PyObject *o, bool recursive)
318
120k
{
319
120k
    assert(PyDict_CheckExact(const_cache));
320
    // None and Ellipsis are immortal objects, and key is the singleton.
321
    // No need to merge object and key.
322
120k
    if (o == Py_None || o == Py_Ellipsis) {
323
13.7k
        return o;
324
13.7k
    }
325
326
106k
    PyObject *key = _PyCode_ConstantKey(o);
327
106k
    if (key == NULL) {
328
0
        return NULL;
329
0
    }
330
331
106k
    PyObject *t;
332
106k
    int res = PyDict_SetDefaultRef(const_cache, key, key, &t);
333
106k
    if (res != 0) {
334
        // o was not inserted into const_cache. t is either the existing value
335
        // or NULL (on error).
336
40.5k
        Py_DECREF(key);
337
40.5k
        return t;
338
40.5k
    }
339
66.4k
    Py_DECREF(t);
340
341
66.4k
    if (!recursive) {
342
29.2k
        return key;
343
29.2k
    }
344
345
    // We registered o in const_cache.
346
    // When o is a tuple or frozenset, we want to merge its
347
    // items too.
348
37.2k
    if (PyTuple_CheckExact(o)) {
349
1.20k
        Py_ssize_t len = PyTuple_GET_SIZE(o);
350
4.15k
        for (Py_ssize_t i = 0; i < len; i++) {
351
2.94k
            PyObject *item = PyTuple_GET_ITEM(o, i);
352
2.94k
            PyObject *u = const_cache_insert(const_cache, item, recursive);
353
2.94k
            if (u == NULL) {
354
0
                Py_DECREF(key);
355
0
                return NULL;
356
0
            }
357
358
            // See _PyCode_ConstantKey()
359
2.94k
            PyObject *v;  // borrowed
360
2.94k
            if (PyTuple_CheckExact(u)) {
361
0
                v = PyTuple_GET_ITEM(u, 1);
362
0
            }
363
2.94k
            else {
364
2.94k
                v = u;
365
2.94k
            }
366
2.94k
            if (v != item) {
367
236
                PyTuple_SET_ITEM(o, i, Py_NewRef(v));
368
236
                Py_DECREF(item);
369
236
            }
370
371
2.94k
            Py_DECREF(u);
372
2.94k
        }
373
1.20k
    }
374
36.0k
    else if (PyFrozenSet_CheckExact(o)) {
375
        // *key* is tuple. And its first item is frozenset of
376
        // constant keys.
377
        // See _PyCode_ConstantKey() for detail.
378
0
        assert(PyTuple_CheckExact(key));
379
0
        assert(PyTuple_GET_SIZE(key) == 2);
380
381
0
        Py_ssize_t len = PySet_GET_SIZE(o);
382
0
        if (len == 0) {  // empty frozenset should not be re-created.
383
0
            return key;
384
0
        }
385
0
        PyObject *tuple = PyTuple_New(len);
386
0
        if (tuple == NULL) {
387
0
            Py_DECREF(key);
388
0
            return NULL;
389
0
        }
390
0
        Py_ssize_t i = 0, pos = 0;
391
0
        PyObject *item;
392
0
        Py_hash_t hash;
393
0
        while (_PySet_NextEntry(o, &pos, &item, &hash)) {
394
0
            PyObject *k = const_cache_insert(const_cache, item, recursive);
395
0
            if (k == NULL) {
396
0
                Py_DECREF(tuple);
397
0
                Py_DECREF(key);
398
0
                return NULL;
399
0
            }
400
0
            PyObject *u;
401
0
            if (PyTuple_CheckExact(k)) {
402
0
                u = Py_NewRef(PyTuple_GET_ITEM(k, 1));
403
0
                Py_DECREF(k);
404
0
            }
405
0
            else {
406
0
                u = k;
407
0
            }
408
0
            PyTuple_SET_ITEM(tuple, i, u);  // Steals reference of u.
409
0
            i++;
410
0
        }
411
412
        // Instead of rewriting o, we create new frozenset and embed in the
413
        // key tuple.  Caller should get merged frozenset from the key tuple.
414
0
        PyObject *new = PyFrozenSet_New(tuple);
415
0
        Py_DECREF(tuple);
416
0
        if (new == NULL) {
417
0
            Py_DECREF(key);
418
0
            return NULL;
419
0
        }
420
0
        assert(PyTuple_GET_ITEM(key, 1) == o);
421
0
        Py_DECREF(o);
422
0
        PyTuple_SET_ITEM(key, 1, new);
423
0
    }
424
425
37.2k
    return key;
426
37.2k
}
427
428
static PyObject*
429
merge_consts_recursive(PyObject *const_cache, PyObject *o)
430
73.9k
{
431
73.9k
    return const_cache_insert(const_cache, o, true);
432
73.9k
}
433
434
Py_ssize_t
435
_PyCompile_DictAddObj(PyObject *dict, PyObject *o)
436
207k
{
437
207k
    PyObject *v;
438
207k
    Py_ssize_t arg;
439
440
207k
    if (PyDict_GetItemRef(dict, o, &v) < 0) {
441
0
        return ERROR;
442
0
    }
443
207k
    if (!v) {
444
104k
        arg = PyDict_GET_SIZE(dict);
445
104k
        v = PyLong_FromSsize_t(arg);
446
104k
        if (!v) {
447
0
            return ERROR;
448
0
        }
449
104k
        if (PyDict_SetItem(dict, o, v) < 0) {
450
0
            Py_DECREF(v);
451
0
            return ERROR;
452
0
        }
453
104k
    }
454
103k
    else
455
103k
        arg = PyLong_AsLong(v);
456
207k
    Py_DECREF(v);
457
207k
    return arg;
458
207k
}
459
460
Py_ssize_t
461
_PyCompile_AddConst(compiler *c, PyObject *o)
462
73.9k
{
463
73.9k
    PyObject *key = merge_consts_recursive(c->c_const_cache, o);
464
73.9k
    if (key == NULL) {
465
0
        return ERROR;
466
0
    }
467
468
73.9k
    Py_ssize_t arg = _PyCompile_DictAddObj(c->u->u_metadata.u_consts, key);
469
73.9k
    Py_DECREF(key);
470
73.9k
    return arg;
471
73.9k
}
472
473
static PyObject *
474
list2dict(PyObject *list)
475
6.90k
{
476
6.90k
    Py_ssize_t i, n;
477
6.90k
    PyObject *v, *k;
478
6.90k
    PyObject *dict = PyDict_New();
479
6.90k
    if (!dict) return NULL;
480
481
6.90k
    n = PyList_Size(list);
482
17.9k
    for (i = 0; i < n; i++) {
483
11.0k
        v = PyLong_FromSsize_t(i);
484
11.0k
        if (!v) {
485
0
            Py_DECREF(dict);
486
0
            return NULL;
487
0
        }
488
11.0k
        k = PyList_GET_ITEM(list, i);
489
11.0k
        if (PyDict_SetItem(dict, k, v) < 0) {
490
0
            Py_DECREF(v);
491
0
            Py_DECREF(dict);
492
0
            return NULL;
493
0
        }
494
11.0k
        Py_DECREF(v);
495
11.0k
    }
496
6.90k
    return dict;
497
6.90k
}
498
499
/* Return new dict containing names from src that match scope(s).
500
501
src is a symbol table dictionary.  If the scope of a name matches
502
either scope_type or flag is set, insert it into the new dict.  The
503
values are integers, starting at offset and increasing by one for
504
each key.
505
*/
506
507
static PyObject *
508
dictbytype(PyObject *src, int scope_type, int flag, Py_ssize_t offset)
509
13.8k
{
510
13.8k
    Py_ssize_t i = offset, num_keys, key_i;
511
13.8k
    PyObject *k, *v, *dest = PyDict_New();
512
13.8k
    PyObject *sorted_keys;
513
514
13.8k
    assert(offset >= 0);
515
13.8k
    if (dest == NULL)
516
0
        return NULL;
517
518
    /* Sort the keys so that we have a deterministic order on the indexes
519
       saved in the returned dictionary.  These indexes are used as indexes
520
       into the free and cell var storage.  Therefore if they aren't
521
       deterministic, then the generated bytecode is not deterministic.
522
    */
523
13.8k
    sorted_keys = PyDict_Keys(src);
524
13.8k
    if (sorted_keys == NULL) {
525
0
        Py_DECREF(dest);
526
0
        return NULL;
527
0
    }
528
13.8k
    if (PyList_Sort(sorted_keys) != 0) {
529
0
        Py_DECREF(sorted_keys);
530
0
        Py_DECREF(dest);
531
0
        return NULL;
532
0
    }
533
13.8k
    num_keys = PyList_GET_SIZE(sorted_keys);
534
535
100k
    for (key_i = 0; key_i < num_keys; key_i++) {
536
86.7k
        k = PyList_GET_ITEM(sorted_keys, key_i);
537
86.7k
        v = PyDict_GetItemWithError(src, k);
538
86.7k
        if (!v) {
539
0
            if (!PyErr_Occurred()) {
540
0
                PyErr_SetObject(PyExc_KeyError, k);
541
0
            }
542
0
            Py_DECREF(sorted_keys);
543
0
            Py_DECREF(dest);
544
0
            return NULL;
545
0
        }
546
86.7k
        long vi = PyLong_AsLong(v);
547
86.7k
        if (vi == -1 && PyErr_Occurred()) {
548
0
            Py_DECREF(sorted_keys);
549
0
            Py_DECREF(dest);
550
0
            return NULL;
551
0
        }
552
86.7k
        if (SYMBOL_TO_SCOPE(vi) == scope_type || vi & flag) {
553
1.86k
            PyObject *item = PyLong_FromSsize_t(i);
554
1.86k
            if (item == NULL) {
555
0
                Py_DECREF(sorted_keys);
556
0
                Py_DECREF(dest);
557
0
                return NULL;
558
0
            }
559
1.86k
            i++;
560
1.86k
            if (PyDict_SetItem(dest, k, item) < 0) {
561
0
                Py_DECREF(sorted_keys);
562
0
                Py_DECREF(item);
563
0
                Py_DECREF(dest);
564
0
                return NULL;
565
0
            }
566
1.86k
            Py_DECREF(item);
567
1.86k
        }
568
86.7k
    }
569
13.8k
    Py_DECREF(sorted_keys);
570
13.8k
    return dest;
571
13.8k
}
572
573
int
574
_PyCompile_EnterScope(compiler *c, identifier name, int scope_type,
575
                       void *key, int lineno, PyObject *private,
576
                      _PyCompile_CodeUnitMetadata *umd)
577
6.90k
{
578
6.90k
    struct compiler_unit *u;
579
6.90k
    u = (struct compiler_unit *)PyMem_Calloc(1, sizeof(struct compiler_unit));
580
6.90k
    if (!u) {
581
0
        PyErr_NoMemory();
582
0
        return ERROR;
583
0
    }
584
6.90k
    u->u_scope_type = scope_type;
585
6.90k
    if (umd != NULL) {
586
5.43k
        u->u_metadata = *umd;
587
5.43k
    }
588
1.47k
    else {
589
1.47k
        u->u_metadata.u_argcount = 0;
590
1.47k
        u->u_metadata.u_posonlyargcount = 0;
591
1.47k
        u->u_metadata.u_kwonlyargcount = 0;
592
1.47k
    }
593
6.90k
    u->u_ste = _PySymtable_Lookup(c->c_st, key);
594
6.90k
    if (!u->u_ste) {
595
0
        compiler_unit_free(u);
596
0
        return ERROR;
597
0
    }
598
6.90k
    u->u_metadata.u_name = Py_NewRef(name);
599
6.90k
    u->u_metadata.u_varnames = list2dict(u->u_ste->ste_varnames);
600
6.90k
    if (!u->u_metadata.u_varnames) {
601
0
        compiler_unit_free(u);
602
0
        return ERROR;
603
0
    }
604
6.90k
    u->u_metadata.u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, DEF_COMP_CELL, 0);
605
6.90k
    if (!u->u_metadata.u_cellvars) {
606
0
        compiler_unit_free(u);
607
0
        return ERROR;
608
0
    }
609
6.90k
    if (u->u_ste->ste_needs_class_closure) {
610
        /* Cook up an implicit __class__ cell. */
611
72
        Py_ssize_t res;
612
72
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS);
613
72
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__class__));
614
72
        if (res < 0) {
615
0
            compiler_unit_free(u);
616
0
            return ERROR;
617
0
        }
618
72
    }
619
6.90k
    if (u->u_ste->ste_needs_classdict) {
620
        /* Cook up an implicit __classdict__ cell. */
621
657
        Py_ssize_t res;
622
657
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS);
623
657
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__classdict__));
624
657
        if (res < 0) {
625
0
            compiler_unit_free(u);
626
0
            return ERROR;
627
0
        }
628
657
    }
629
6.90k
    if (u->u_ste->ste_has_conditional_annotations) {
630
        /* Cook up an implicit __conditional__annotations__ cell */
631
1
        Py_ssize_t res;
632
1
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS || u->u_scope_type == COMPILE_SCOPE_MODULE);
633
1
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__conditional_annotations__));
634
1
        if (res < 0) {
635
0
            compiler_unit_free(u);
636
0
            return ERROR;
637
0
        }
638
1
    }
639
640
6.90k
    u->u_metadata.u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
641
6.90k
                               PyDict_GET_SIZE(u->u_metadata.u_cellvars));
642
6.90k
    if (!u->u_metadata.u_freevars) {
643
0
        compiler_unit_free(u);
644
0
        return ERROR;
645
0
    }
646
647
6.90k
    u->u_metadata.u_fasthidden = PyDict_New();
648
6.90k
    if (!u->u_metadata.u_fasthidden) {
649
0
        compiler_unit_free(u);
650
0
        return ERROR;
651
0
    }
652
653
6.90k
    u->u_nfblocks = 0;
654
6.90k
    u->u_in_inlined_comp = 0;
655
6.90k
    u->u_metadata.u_firstlineno = lineno;
656
6.90k
    u->u_metadata.u_consts = PyDict_New();
657
6.90k
    if (!u->u_metadata.u_consts) {
658
0
        compiler_unit_free(u);
659
0
        return ERROR;
660
0
    }
661
6.90k
    u->u_metadata.u_names = PyDict_New();
662
6.90k
    if (!u->u_metadata.u_names) {
663
0
        compiler_unit_free(u);
664
0
        return ERROR;
665
0
    }
666
667
6.90k
    u->u_deferred_annotations = NULL;
668
6.90k
    u->u_conditional_annotation_indices = NULL;
669
6.90k
    u->u_next_conditional_annotation_index = 0;
670
6.90k
    if (scope_type == COMPILE_SCOPE_CLASS) {
671
1.11k
        u->u_static_attributes = PySet_New(0);
672
1.11k
        if (!u->u_static_attributes) {
673
0
            compiler_unit_free(u);
674
0
            return ERROR;
675
0
        }
676
1.11k
    }
677
5.79k
    else {
678
5.79k
        u->u_static_attributes = NULL;
679
5.79k
    }
680
681
6.90k
    u->u_instr_sequence = (instr_sequence*)_PyInstructionSequence_New();
682
6.90k
    if (!u->u_instr_sequence) {
683
0
        compiler_unit_free(u);
684
0
        return ERROR;
685
0
    }
686
6.90k
    u->u_stashed_instr_sequence = NULL;
687
688
    /* Push the old compiler_unit on the stack. */
689
6.90k
    if (c->u) {
690
6.54k
        PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
691
6.54k
        if (!capsule || PyList_Append(c->c_stack, capsule) < 0) {
692
0
            Py_XDECREF(capsule);
693
0
            compiler_unit_free(u);
694
0
            return ERROR;
695
0
        }
696
6.54k
        Py_DECREF(capsule);
697
6.54k
        if (private == NULL) {
698
5.43k
            private = c->u->u_private;
699
5.43k
        }
700
6.54k
    }
701
702
6.90k
    u->u_private = Py_XNewRef(private);
703
704
6.90k
    c->u = u;
705
6.90k
    if (scope_type != COMPILE_SCOPE_MODULE) {
706
6.54k
        RETURN_IF_ERROR(compiler_set_qualname(c));
707
6.54k
    }
708
6.90k
    return SUCCESS;
709
6.90k
}
710
711
void
712
_PyCompile_ExitScope(compiler *c)
713
6.90k
{
714
    // Don't call PySequence_DelItem() with an exception raised
715
6.90k
    PyObject *exc = PyErr_GetRaisedException();
716
717
6.90k
    instr_sequence *nested_seq = NULL;
718
6.90k
    if (c->c_save_nested_seqs) {
719
0
        nested_seq = c->u->u_instr_sequence;
720
0
        Py_INCREF(nested_seq);
721
0
    }
722
6.90k
    compiler_unit_free(c->u);
723
    /* Restore c->u to the parent unit. */
724
6.90k
    Py_ssize_t n = PyList_GET_SIZE(c->c_stack) - 1;
725
6.90k
    if (n >= 0) {
726
6.54k
        PyObject *capsule = PyList_GET_ITEM(c->c_stack, n);
727
6.54k
        c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
728
6.54k
        assert(c->u);
729
        /* we are deleting from a list so this really shouldn't fail */
730
6.54k
        if (PySequence_DelItem(c->c_stack, n) < 0) {
731
0
            PyErr_FormatUnraisable("Exception ignored while removing "
732
0
                                   "the last compiler stack item");
733
0
        }
734
6.54k
        if (nested_seq != NULL) {
735
0
            if (_PyInstructionSequence_AddNested(c->u->u_instr_sequence, nested_seq) < 0) {
736
0
                PyErr_FormatUnraisable("Exception ignored while appending "
737
0
                                       "nested instruction sequence");
738
0
            }
739
0
        }
740
6.54k
    }
741
366
    else {
742
366
        c->u = NULL;
743
366
    }
744
6.90k
    Py_XDECREF(nested_seq);
745
746
6.90k
    PyErr_SetRaisedException(exc);
747
6.90k
}
748
749
/*
750
 * Frame block handling functions
751
 */
752
753
int
754
_PyCompile_PushFBlock(compiler *c, location loc,
755
                     fblocktype t, jump_target_label block_label,
756
                     jump_target_label exit, void *datum)
757
5.30k
{
758
5.30k
    fblockinfo *f;
759
5.30k
    if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
760
0
        return _PyCompile_Error(c, loc, "too many statically nested blocks");
761
0
    }
762
5.30k
    f = &c->u->u_fblock[c->u->u_nfblocks++];
763
5.30k
    f->fb_type = t;
764
5.30k
    f->fb_block = block_label;
765
5.30k
    f->fb_loc = loc;
766
5.30k
    f->fb_exit = exit;
767
5.30k
    f->fb_datum = datum;
768
5.30k
    return SUCCESS;
769
5.30k
}
770
771
void
772
_PyCompile_PopFBlock(compiler *c, fblocktype t, jump_target_label block_label)
773
5.30k
{
774
5.30k
    struct compiler_unit *u = c->u;
775
5.30k
    assert(u->u_nfblocks > 0);
776
5.30k
    u->u_nfblocks--;
777
5.30k
    assert(u->u_fblock[u->u_nfblocks].fb_type == t);
778
5.30k
    assert(SAME_JUMP_TARGET_LABEL(u->u_fblock[u->u_nfblocks].fb_block, block_label));
779
5.30k
}
780
781
fblockinfo *
782
_PyCompile_TopFBlock(compiler *c)
783
7.15k
{
784
7.15k
    if (c->u->u_nfblocks == 0) {
785
5.60k
        return NULL;
786
5.60k
    }
787
1.55k
    return &c->u->u_fblock[c->u->u_nfblocks - 1];
788
7.15k
}
789
790
void
791
_PyCompile_DeferredAnnotations(compiler *c,
792
                               PyObject **deferred_annotations,
793
                               PyObject **conditional_annotation_indices)
794
1.40k
{
795
1.40k
    *deferred_annotations = Py_XNewRef(c->u->u_deferred_annotations);
796
1.40k
    *conditional_annotation_indices = Py_XNewRef(c->u->u_conditional_annotation_indices);
797
1.40k
}
798
799
static location
800
start_location(asdl_stmt_seq *stmts)
801
300
{
802
300
    if (asdl_seq_LEN(stmts) > 0) {
803
        /* Set current line number to the line number of first statement.
804
         * This way line number for SETUP_ANNOTATIONS will always
805
         * coincide with the line number of first "real" statement in module.
806
         * If body is empty, then lineno will be set later in the assembly stage.
807
         */
808
297
        stmt_ty st = (stmt_ty)asdl_seq_GET(stmts, 0);
809
297
        return SRC_LOCATION_FROM_AST(st);
810
297
    }
811
3
    return (const _Py_SourceLocation){1, 1, 0, 0};
812
300
}
813
814
static int
815
compiler_codegen(compiler *c, mod_ty mod)
816
366
{
817
366
    RETURN_IF_ERROR(_PyCodegen_EnterAnonymousScope(c, mod));
818
366
    assert(c->u->u_scope_type == COMPILE_SCOPE_MODULE);
819
366
    switch (mod->kind) {
820
300
    case Module_kind: {
821
300
        asdl_stmt_seq *stmts = mod->v.Module.body;
822
300
        RETURN_IF_ERROR(_PyCodegen_Module(c, start_location(stmts), stmts, false));
823
300
        break;
824
300
    }
825
300
    case Interactive_kind: {
826
0
        c->c_interactive = 1;
827
0
        asdl_stmt_seq *stmts = mod->v.Interactive.body;
828
0
        RETURN_IF_ERROR(_PyCodegen_Module(c, start_location(stmts), stmts, true));
829
0
        break;
830
0
    }
831
66
    case Expression_kind: {
832
66
        RETURN_IF_ERROR(_PyCodegen_Expression(c, mod->v.Expression.body));
833
66
        break;
834
66
    }
835
66
    default: {
836
0
        PyErr_Format(PyExc_SystemError,
837
0
                     "module kind %d should not be possible",
838
0
                     mod->kind);
839
0
        return ERROR;
840
66
    }}
841
366
    return SUCCESS;
842
366
}
843
844
static PyCodeObject *
845
compiler_mod(compiler *c, mod_ty mod)
846
366
{
847
366
    PyCodeObject *co = NULL;
848
366
    int addNone = mod->kind != Expression_kind;
849
366
    if (compiler_codegen(c, mod) < 0) {
850
0
        goto finally;
851
0
    }
852
366
    co = _PyCompile_OptimizeAndAssemble(c, addNone);
853
366
finally:
854
366
    _PyCompile_ExitScope(c);
855
366
    return co;
856
366
}
857
858
int
859
_PyCompile_GetRefType(compiler *c, PyObject *name)
860
1.36k
{
861
1.36k
    if (c->u->u_scope_type == COMPILE_SCOPE_CLASS &&
862
210
        (_PyUnicode_EqualToASCIIString(name, "__class__") ||
863
45
         _PyUnicode_EqualToASCIIString(name, "__classdict__") ||
864
183
         _PyUnicode_EqualToASCIIString(name, "__conditional_annotations__"))) {
865
183
        return CELL;
866
183
    }
867
1.17k
    PySTEntryObject *ste = c->u->u_ste;
868
1.17k
    int scope = _PyST_GetScope(ste, name);
869
1.17k
    if (scope == 0) {
870
0
        PyErr_Format(PyExc_SystemError,
871
0
                     "_PyST_GetScope(name=%R) failed: "
872
0
                     "unknown scope in unit %S (%R); "
873
0
                     "symbols: %R; locals: %R; "
874
0
                     "globals: %R",
875
0
                     name,
876
0
                     c->u->u_metadata.u_name, ste->ste_id,
877
0
                     ste->ste_symbols, c->u->u_metadata.u_varnames,
878
0
                     c->u->u_metadata.u_names);
879
0
        return ERROR;
880
0
    }
881
1.17k
    return scope;
882
1.17k
}
883
884
static int
885
dict_lookup_arg(PyObject *dict, PyObject *name)
886
1.93k
{
887
1.93k
    PyObject *v = PyDict_GetItemWithError(dict, name);
888
1.93k
    if (v == NULL) {
889
0
        return ERROR;
890
0
    }
891
1.93k
    return PyLong_AsLong(v);
892
1.93k
}
893
894
int
895
_PyCompile_LookupCellvar(compiler *c, PyObject *name)
896
729
{
897
729
    assert(c->u->u_metadata.u_cellvars);
898
729
    return dict_lookup_arg(c->u->u_metadata.u_cellvars, name);
899
729
}
900
901
int
902
_PyCompile_LookupArg(compiler *c, PyCodeObject *co, PyObject *name)
903
1.20k
{
904
    /* Special case: If a class contains a method with a
905
     * free variable that has the same name as a method,
906
     * the name will be considered free *and* local in the
907
     * class.  It should be handled by the closure, as
908
     * well as by the normal name lookup logic.
909
     */
910
1.20k
    int reftype = _PyCompile_GetRefType(c, name);
911
1.20k
    if (reftype == -1) {
912
0
        return ERROR;
913
0
    }
914
1.20k
    int arg;
915
1.20k
    if (reftype == CELL) {
916
1.13k
        arg = dict_lookup_arg(c->u->u_metadata.u_cellvars, name);
917
1.13k
    }
918
70
    else {
919
70
        arg = dict_lookup_arg(c->u->u_metadata.u_freevars, name);
920
70
    }
921
1.20k
    if (arg == -1 && !PyErr_Occurred()) {
922
0
        PyObject *freevars = _PyCode_GetFreevars(co);
923
0
        if (freevars == NULL) {
924
0
            PyErr_Clear();
925
0
        }
926
0
        PyErr_Format(PyExc_SystemError,
927
0
            "compiler_lookup_arg(name=%R) with reftype=%d failed in %S; "
928
0
            "freevars of code %S: %R",
929
0
            name,
930
0
            reftype,
931
0
            c->u->u_metadata.u_name,
932
0
            co->co_name,
933
0
            freevars);
934
0
        Py_XDECREF(freevars);
935
0
        return ERROR;
936
0
    }
937
1.20k
    return arg;
938
1.20k
}
939
940
PyObject *
941
_PyCompile_StaticAttributesAsTuple(compiler *c)
942
1.11k
{
943
1.11k
    assert(c->u->u_static_attributes);
944
1.11k
    PyObject *static_attributes_unsorted = PySequence_List(c->u->u_static_attributes);
945
1.11k
    if (static_attributes_unsorted == NULL) {
946
0
        return NULL;
947
0
    }
948
1.11k
    if (PyList_Sort(static_attributes_unsorted) != 0) {
949
0
        Py_DECREF(static_attributes_unsorted);
950
0
        return NULL;
951
0
    }
952
1.11k
    PyObject *static_attributes = PySequence_Tuple(static_attributes_unsorted);
953
1.11k
    Py_DECREF(static_attributes_unsorted);
954
1.11k
    return static_attributes;
955
1.11k
}
956
957
int
958
_PyCompile_ResolveNameop(compiler *c, PyObject *mangled, int scope,
959
                          _PyCompile_optype *optype, Py_ssize_t *arg)
960
107k
{
961
107k
    PyObject *dict = c->u->u_metadata.u_names;
962
107k
    *optype = COMPILE_OP_NAME;
963
964
107k
    assert(scope >= 0);
965
107k
    switch (scope) {
966
1.85k
    case FREE:
967
1.85k
        dict = c->u->u_metadata.u_freevars;
968
1.85k
        *optype = COMPILE_OP_DEREF;
969
1.85k
        break;
970
1.13k
    case CELL:
971
1.13k
        dict = c->u->u_metadata.u_cellvars;
972
1.13k
        *optype = COMPILE_OP_DEREF;
973
1.13k
        break;
974
77.4k
    case LOCAL:
975
77.4k
        if (_PyST_IsFunctionLike(c->u->u_ste)) {
976
64.7k
            *optype = COMPILE_OP_FAST;
977
64.7k
        }
978
12.6k
        else {
979
12.6k
            PyObject *item;
980
12.6k
            RETURN_IF_ERROR(PyDict_GetItemRef(c->u->u_metadata.u_fasthidden, mangled,
981
12.6k
                                              &item));
982
12.6k
            if (item == Py_True) {
983
63
                *optype = COMPILE_OP_FAST;
984
63
            }
985
12.6k
            Py_XDECREF(item);
986
12.6k
        }
987
77.4k
        break;
988
77.4k
    case GLOBAL_IMPLICIT:
989
19.6k
        if (_PyST_IsFunctionLike(c->u->u_ste)) {
990
17.2k
            *optype = COMPILE_OP_GLOBAL;
991
17.2k
        }
992
19.6k
        break;
993
146
    case GLOBAL_EXPLICIT:
994
146
        *optype = COMPILE_OP_GLOBAL;
995
146
        break;
996
6.77k
    default:
997
        /* scope can be 0 */
998
6.77k
        break;
999
107k
    }
1000
107k
    if (*optype != COMPILE_OP_FAST) {
1001
42.2k
        *arg = _PyCompile_DictAddObj(dict, mangled);
1002
42.2k
        RETURN_IF_ERROR(*arg);
1003
42.2k
    }
1004
107k
    return SUCCESS;
1005
107k
}
1006
1007
int
1008
_PyCompile_TweakInlinedComprehensionScopes(compiler *c, location loc,
1009
                                            PySTEntryObject *entry,
1010
                                            _PyCompile_InlinedComprehensionState *state)
1011
254
{
1012
254
    int in_class_block = (c->u->u_ste->ste_type == ClassBlock) && !c->u->u_in_inlined_comp;
1013
254
    c->u->u_in_inlined_comp++;
1014
1015
254
    PyObject *k, *v;
1016
254
    Py_ssize_t pos = 0;
1017
1.09k
    while (PyDict_Next(entry->ste_symbols, &pos, &k, &v)) {
1018
845
        long symbol = PyLong_AsLong(v);
1019
845
        assert(symbol >= 0 || PyErr_Occurred());
1020
845
        RETURN_IF_ERROR(symbol);
1021
845
        long scope = SYMBOL_TO_SCOPE(symbol);
1022
1023
845
        long outsymbol = _PyST_GetSymbol(c->u->u_ste, k);
1024
845
        RETURN_IF_ERROR(outsymbol);
1025
845
        long outsc = SYMBOL_TO_SCOPE(outsymbol);
1026
1027
        // If a name has different scope inside than outside the comprehension,
1028
        // we need to temporarily handle it with the right scope while
1029
        // compiling the comprehension. If it's free in the comprehension
1030
        // scope, no special handling; it should be handled the same as the
1031
        // enclosing scope. (If it's free in outer scope and cell in inner
1032
        // scope, we can't treat it as both cell and free in the same function,
1033
        // but treating it as free throughout is fine; it's *_DEREF
1034
        // either way.)
1035
845
        if ((scope != outsc && scope != FREE && !(scope == CELL && outsc == FREE))
1036
565
                || in_class_block) {
1037
280
            if (state->temp_symbols == NULL) {
1038
254
                state->temp_symbols = PyDict_New();
1039
254
                if (state->temp_symbols == NULL) {
1040
0
                    return ERROR;
1041
0
                }
1042
254
            }
1043
            // update the symbol to the in-comprehension version and save
1044
            // the outer version; we'll restore it after running the
1045
            // comprehension
1046
280
            if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v) < 0) {
1047
0
                return ERROR;
1048
0
            }
1049
280
            PyObject *outv = PyLong_FromLong(outsymbol);
1050
280
            if (outv == NULL) {
1051
0
                return ERROR;
1052
0
            }
1053
280
            int res = PyDict_SetItem(state->temp_symbols, k, outv);
1054
280
            Py_DECREF(outv);
1055
280
            RETURN_IF_ERROR(res);
1056
280
        }
1057
        // locals handling for names bound in comprehension (DEF_LOCAL |
1058
        // DEF_NONLOCAL occurs in assignment expression to nonlocal)
1059
845
        if ((symbol & DEF_LOCAL && !(symbol & DEF_NONLOCAL)) || in_class_block) {
1060
324
            if (!_PyST_IsFunctionLike(c->u->u_ste)) {
1061
                // non-function scope: override this name to use fast locals
1062
25
                PyObject *orig;
1063
25
                if (PyDict_GetItemRef(c->u->u_metadata.u_fasthidden, k, &orig) < 0) {
1064
0
                    return ERROR;
1065
0
                }
1066
25
                assert(orig == NULL || orig == Py_True || orig == Py_False);
1067
25
                if (orig != Py_True) {
1068
25
                    if (PyDict_SetItem(c->u->u_metadata.u_fasthidden, k, Py_True) < 0) {
1069
0
                        return ERROR;
1070
0
                    }
1071
25
                    if (state->fast_hidden == NULL) {
1072
19
                        state->fast_hidden = PySet_New(NULL);
1073
19
                        if (state->fast_hidden == NULL) {
1074
0
                            return ERROR;
1075
0
                        }
1076
19
                    }
1077
25
                    if (PySet_Add(state->fast_hidden, k) < 0) {
1078
0
                        return ERROR;
1079
0
                    }
1080
25
                }
1081
25
            }
1082
324
        }
1083
845
    }
1084
254
    return SUCCESS;
1085
254
}
1086
1087
int
1088
_PyCompile_RevertInlinedComprehensionScopes(compiler *c, location loc,
1089
                                             _PyCompile_InlinedComprehensionState *state)
1090
254
{
1091
254
    c->u->u_in_inlined_comp--;
1092
254
    if (state->temp_symbols) {
1093
254
        PyObject *k, *v;
1094
254
        Py_ssize_t pos = 0;
1095
534
        while (PyDict_Next(state->temp_symbols, &pos, &k, &v)) {
1096
280
            if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v)) {
1097
0
                return ERROR;
1098
0
            }
1099
280
        }
1100
254
        Py_CLEAR(state->temp_symbols);
1101
254
    }
1102
254
    if (state->fast_hidden) {
1103
44
        while (PySet_Size(state->fast_hidden) > 0) {
1104
25
            PyObject *k = PySet_Pop(state->fast_hidden);
1105
25
            if (k == NULL) {
1106
0
                return ERROR;
1107
0
            }
1108
            // we set to False instead of clearing, so we can track which names
1109
            // were temporarily fast-locals and should use CO_FAST_HIDDEN
1110
25
            if (PyDict_SetItem(c->u->u_metadata.u_fasthidden, k, Py_False)) {
1111
0
                Py_DECREF(k);
1112
0
                return ERROR;
1113
0
            }
1114
25
            Py_DECREF(k);
1115
25
        }
1116
19
        Py_CLEAR(state->fast_hidden);
1117
19
    }
1118
254
    return SUCCESS;
1119
254
}
1120
1121
void
1122
_PyCompile_EnterConditionalBlock(struct _PyCompiler *c)
1123
10.7k
{
1124
10.7k
    c->u->u_in_conditional_block++;
1125
10.7k
}
1126
1127
void
1128
_PyCompile_LeaveConditionalBlock(struct _PyCompiler *c)
1129
10.7k
{
1130
10.7k
    assert(c->u->u_in_conditional_block > 0);
1131
10.7k
    c->u->u_in_conditional_block--;
1132
10.7k
}
1133
1134
int
1135
_PyCompile_AddDeferredAnnotation(compiler *c, stmt_ty s,
1136
                                 PyObject **conditional_annotation_index)
1137
51
{
1138
51
    if (c->u->u_deferred_annotations == NULL) {
1139
8
        c->u->u_deferred_annotations = PyList_New(0);
1140
8
        if (c->u->u_deferred_annotations == NULL) {
1141
0
            return ERROR;
1142
0
        }
1143
8
    }
1144
51
    if (c->u->u_conditional_annotation_indices == NULL) {
1145
8
        c->u->u_conditional_annotation_indices = PyList_New(0);
1146
8
        if (c->u->u_conditional_annotation_indices == NULL) {
1147
0
            return ERROR;
1148
0
        }
1149
8
    }
1150
51
    PyObject *ptr = PyLong_FromVoidPtr((void *)s);
1151
51
    if (ptr == NULL) {
1152
0
        return ERROR;
1153
0
    }
1154
51
    if (PyList_Append(c->u->u_deferred_annotations, ptr) < 0) {
1155
0
        Py_DECREF(ptr);
1156
0
        return ERROR;
1157
0
    }
1158
51
    Py_DECREF(ptr);
1159
51
    PyObject *index;
1160
51
    if (c->u->u_scope_type == COMPILE_SCOPE_MODULE || c->u->u_in_conditional_block) {
1161
1
        index = PyLong_FromLong(c->u->u_next_conditional_annotation_index);
1162
1
        if (index == NULL) {
1163
0
            return ERROR;
1164
0
        }
1165
1
        *conditional_annotation_index = Py_NewRef(index);
1166
1
        c->u->u_next_conditional_annotation_index++;
1167
1
    }
1168
50
    else {
1169
50
        index = PyLong_FromLong(-1);
1170
50
        if (index == NULL) {
1171
0
            return ERROR;
1172
0
        }
1173
50
    }
1174
51
    int rc = PyList_Append(c->u->u_conditional_annotation_indices, index);
1175
51
    Py_DECREF(index);
1176
51
    RETURN_IF_ERROR(rc);
1177
51
    return SUCCESS;
1178
51
}
1179
1180
/* Raises a SyntaxError and returns ERROR.
1181
 * If something goes wrong, a different exception may be raised.
1182
 */
1183
int
1184
_PyCompile_Error(compiler *c, location loc, const char *format, ...)
1185
0
{
1186
0
    va_list vargs;
1187
0
    va_start(vargs, format);
1188
0
    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
1189
0
    va_end(vargs);
1190
0
    if (msg == NULL) {
1191
0
        return ERROR;
1192
0
    }
1193
0
    _PyErr_RaiseSyntaxError(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
1194
0
                            loc.end_lineno, loc.end_col_offset + 1);
1195
0
    Py_DECREF(msg);
1196
0
    return ERROR;
1197
0
}
1198
1199
/* Emits a SyntaxWarning and returns 0 on success.
1200
   If a SyntaxWarning raised as error, replaces it with a SyntaxError
1201
   and returns -1.
1202
*/
1203
int
1204
_PyCompile_Warn(compiler *c, location loc, const char *format, ...)
1205
0
{
1206
0
    va_list vargs;
1207
0
    va_start(vargs, format);
1208
0
    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
1209
0
    va_end(vargs);
1210
0
    if (msg == NULL) {
1211
0
        return ERROR;
1212
0
    }
1213
0
    int ret = _PyErr_EmitSyntaxWarning(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
1214
0
                                       loc.end_lineno, loc.end_col_offset + 1);
1215
0
    Py_DECREF(msg);
1216
0
    return ret;
1217
0
}
1218
1219
PyObject *
1220
_PyCompile_Mangle(compiler *c, PyObject *name)
1221
51
{
1222
51
    return _Py_Mangle(c->u->u_private, name);
1223
51
}
1224
1225
PyObject *
1226
_PyCompile_MaybeMangle(compiler *c, PyObject *name)
1227
133k
{
1228
133k
    return _Py_MaybeMangle(c->u->u_private, c->u->u_ste, name);
1229
133k
}
1230
1231
instr_sequence *
1232
_PyCompile_InstrSequence(compiler *c)
1233
478k
{
1234
478k
    return c->u->u_instr_sequence;
1235
478k
}
1236
1237
int
1238
_PyCompile_StartAnnotationSetup(struct _PyCompiler *c)
1239
1
{
1240
1
    instr_sequence *new_seq = (instr_sequence *)_PyInstructionSequence_New();
1241
1
    if (new_seq == NULL) {
1242
0
        return ERROR;
1243
0
    }
1244
1
    assert(c->u->u_stashed_instr_sequence == NULL);
1245
1
    c->u->u_stashed_instr_sequence = c->u->u_instr_sequence;
1246
1
    c->u->u_instr_sequence = new_seq;
1247
1
    return SUCCESS;
1248
1
}
1249
1250
int
1251
_PyCompile_EndAnnotationSetup(struct _PyCompiler *c)
1252
1
{
1253
1
    assert(c->u->u_stashed_instr_sequence != NULL);
1254
1
    instr_sequence *parent_seq = c->u->u_stashed_instr_sequence;
1255
1
    instr_sequence *anno_seq = c->u->u_instr_sequence;
1256
1
    c->u->u_stashed_instr_sequence = NULL;
1257
1
    c->u->u_instr_sequence = parent_seq;
1258
1
    if (_PyInstructionSequence_SetAnnotationsCode(parent_seq, anno_seq) == ERROR) {
1259
0
        Py_DECREF(anno_seq);
1260
0
        return ERROR;
1261
0
    }
1262
1
    return SUCCESS;
1263
1
}
1264
1265
1266
int
1267
_PyCompile_FutureFeatures(compiler *c)
1268
3.03k
{
1269
3.03k
    return c->c_future.ff_features;
1270
3.03k
}
1271
1272
struct symtable *
1273
_PyCompile_Symtable(compiler *c)
1274
13.1k
{
1275
13.1k
    return c->c_st;
1276
13.1k
}
1277
1278
PySTEntryObject *
1279
_PyCompile_SymtableEntry(compiler *c)
1280
154k
{
1281
154k
    return c->u->u_ste;
1282
154k
}
1283
1284
int
1285
_PyCompile_OptimizationLevel(compiler *c)
1286
141
{
1287
141
    return c->c_optimize;
1288
141
}
1289
1290
int
1291
_PyCompile_IsInteractiveTopLevel(compiler *c)
1292
4.56k
{
1293
4.56k
    assert(c->c_stack != NULL);
1294
4.56k
    assert(PyList_CheckExact(c->c_stack));
1295
4.56k
    bool is_nested_scope = PyList_GET_SIZE(c->c_stack) > 0;
1296
4.56k
    return c->c_interactive && !is_nested_scope;
1297
4.56k
}
1298
1299
int
1300
_PyCompile_ScopeType(compiler *c)
1301
147
{
1302
147
    return c->u->u_scope_type;
1303
147
}
1304
1305
int
1306
_PyCompile_IsInInlinedComp(compiler *c)
1307
2.64k
{
1308
2.64k
    return c->u->u_in_inlined_comp;
1309
2.64k
}
1310
1311
PyObject *
1312
_PyCompile_Qualname(compiler *c)
1313
1.11k
{
1314
1.11k
    assert(c->u->u_metadata.u_qualname);
1315
1.11k
    return c->u->u_metadata.u_qualname;
1316
1.11k
}
1317
1318
_PyCompile_CodeUnitMetadata *
1319
_PyCompile_Metadata(compiler *c)
1320
92.4k
{
1321
92.4k
    return &c->u->u_metadata;
1322
92.4k
}
1323
1324
// Merge *obj* with constant cache, without recursion.
1325
int
1326
_PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj)
1327
43.7k
{
1328
43.7k
    PyObject *key = const_cache_insert(const_cache, *obj, false);
1329
43.7k
    if (key == NULL) {
1330
0
        return ERROR;
1331
0
    }
1332
43.7k
    if (PyTuple_CheckExact(key)) {
1333
43.2k
        PyObject *item = PyTuple_GET_ITEM(key, 1);
1334
43.2k
        Py_SETREF(*obj, Py_NewRef(item));
1335
43.2k
        Py_DECREF(key);
1336
43.2k
    }
1337
570
    else {
1338
570
        Py_SETREF(*obj, key);
1339
570
    }
1340
43.7k
    return SUCCESS;
1341
43.7k
}
1342
1343
static PyObject *
1344
consts_dict_keys_inorder(PyObject *dict)
1345
6.90k
{
1346
6.90k
    PyObject *consts, *k, *v;
1347
6.90k
    Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
1348
1349
6.90k
    consts = PyList_New(size);   /* PyCode_Optimize() requires a list */
1350
6.90k
    if (consts == NULL)
1351
0
        return NULL;
1352
57.2k
    while (PyDict_Next(dict, &pos, &k, &v)) {
1353
50.3k
        assert(PyLong_CheckExact(v));
1354
50.3k
        i = PyLong_AsLong(v);
1355
        /* The keys of the dictionary can be tuples wrapping a constant.
1356
         * (see _PyCompile_DictAddObj and _PyCode_ConstantKey). In that case
1357
         * the object we want is always second. */
1358
50.3k
        if (PyTuple_CheckExact(k)) {
1359
3.89k
            k = PyTuple_GET_ITEM(k, 1);
1360
3.89k
        }
1361
50.3k
        assert(i < size);
1362
50.3k
        assert(i >= 0);
1363
50.3k
        PyList_SET_ITEM(consts, i, Py_NewRef(k));
1364
50.3k
    }
1365
6.90k
    return consts;
1366
6.90k
}
1367
1368
static int
1369
compute_code_flags(compiler *c)
1370
6.90k
{
1371
6.90k
    PySTEntryObject *ste = c->u->u_ste;
1372
6.90k
    int flags = 0;
1373
6.90k
    if (_PyST_IsFunctionLike(ste)) {
1374
5.43k
        flags |= CO_NEWLOCALS | CO_OPTIMIZED;
1375
5.43k
        if (ste->ste_nested)
1376
656
            flags |= CO_NESTED;
1377
5.43k
        if (ste->ste_generator && !ste->ste_coroutine)
1378
364
            flags |= CO_GENERATOR;
1379
5.43k
        if (ste->ste_generator && ste->ste_coroutine)
1380
1
            flags |= CO_ASYNC_GENERATOR;
1381
5.43k
        if (ste->ste_varargs)
1382
205
            flags |= CO_VARARGS;
1383
5.43k
        if (ste->ste_varkeywords)
1384
165
            flags |= CO_VARKEYWORDS;
1385
5.43k
        if (ste->ste_has_docstring)
1386
1.74k
            flags |= CO_HAS_DOCSTRING;
1387
5.43k
        if (ste->ste_method)
1388
3.07k
            flags |= CO_METHOD;
1389
5.43k
    }
1390
1391
6.90k
    if (ste->ste_coroutine && !ste->ste_generator) {
1392
15
        flags |= CO_COROUTINE;
1393
15
    }
1394
1395
    /* (Only) inherit compilerflags in PyCF_MASK */
1396
6.90k
    flags |= (c->c_flags.cf_flags & PyCF_MASK);
1397
1398
6.90k
    return flags;
1399
6.90k
}
1400
1401
static PyCodeObject *
1402
optimize_and_assemble_code_unit(struct compiler_unit *u, PyObject *const_cache,
1403
                                int code_flags, PyObject *filename)
1404
6.90k
{
1405
6.90k
    cfg_builder *g = NULL;
1406
6.90k
    instr_sequence optimized_instrs;
1407
6.90k
    memset(&optimized_instrs, 0, sizeof(instr_sequence));
1408
1409
6.90k
    PyCodeObject *co = NULL;
1410
6.90k
    PyObject *consts = consts_dict_keys_inorder(u->u_metadata.u_consts);
1411
6.90k
    if (consts == NULL) {
1412
0
        goto error;
1413
0
    }
1414
6.90k
    g = _PyCfg_FromInstructionSequence(u->u_instr_sequence);
1415
6.90k
    if (g == NULL) {
1416
0
        goto error;
1417
0
    }
1418
6.90k
    int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames);
1419
6.90k
    int nparams = (int)PyList_GET_SIZE(u->u_ste->ste_varnames);
1420
6.90k
    assert(u->u_metadata.u_firstlineno);
1421
1422
6.90k
    if (_PyCfg_OptimizeCodeUnit(g, consts, const_cache, nlocals,
1423
6.90k
                                nparams, u->u_metadata.u_firstlineno) < 0) {
1424
0
        goto error;
1425
0
    }
1426
1427
6.90k
    int stackdepth;
1428
6.90k
    int nlocalsplus;
1429
6.90k
    if (_PyCfg_OptimizedCfgToInstructionSequence(g, &u->u_metadata, code_flags,
1430
6.90k
                                                 &stackdepth, &nlocalsplus,
1431
6.90k
                                                 &optimized_instrs) < 0) {
1432
0
        goto error;
1433
0
    }
1434
1435
    /** Assembly **/
1436
6.90k
    co = _PyAssemble_MakeCodeObject(&u->u_metadata, const_cache, consts,
1437
6.90k
                                    stackdepth, &optimized_instrs, nlocalsplus,
1438
6.90k
                                    code_flags, filename);
1439
1440
6.90k
error:
1441
6.90k
    Py_XDECREF(consts);
1442
6.90k
    PyInstructionSequence_Fini(&optimized_instrs);
1443
6.90k
    _PyCfgBuilder_Free(g);
1444
6.90k
    return co;
1445
6.90k
}
1446
1447
1448
PyCodeObject *
1449
_PyCompile_OptimizeAndAssemble(compiler *c, int addNone)
1450
6.90k
{
1451
6.90k
    struct compiler_unit *u = c->u;
1452
6.90k
    PyObject *const_cache = c->c_const_cache;
1453
6.90k
    PyObject *filename = c->c_filename;
1454
1455
6.90k
    int code_flags = compute_code_flags(c);
1456
6.90k
    if (code_flags < 0) {
1457
0
        return NULL;
1458
0
    }
1459
1460
6.90k
    if (_PyCodegen_AddReturnAtEnd(c, addNone) < 0) {
1461
0
        return NULL;
1462
0
    }
1463
1464
6.90k
    return optimize_and_assemble_code_unit(u, const_cache, code_flags, filename);
1465
6.90k
}
1466
1467
PyCodeObject *
1468
_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
1469
               int optimize, PyArena *arena)
1470
366
{
1471
366
    assert(!PyErr_Occurred());
1472
366
    compiler *c = new_compiler(mod, filename, pflags, optimize, arena);
1473
366
    if (c == NULL) {
1474
0
        return NULL;
1475
0
    }
1476
1477
366
    PyCodeObject *co = compiler_mod(c, mod);
1478
366
    compiler_free(c);
1479
366
    assert(co || PyErr_Occurred());
1480
366
    return co;
1481
366
}
1482
1483
int
1484
_PyCompile_AstPreprocess(mod_ty mod, PyObject *filename, PyCompilerFlags *cf,
1485
                         int optimize, PyArena *arena, int no_const_folding)
1486
6.60k
{
1487
6.60k
    _PyFutureFeatures future;
1488
6.60k
    if (!_PyFuture_FromAST(mod, filename, &future)) {
1489
12
        return -1;
1490
12
    }
1491
6.59k
    int flags = future.ff_features | cf->cf_flags;
1492
6.59k
    if (optimize == -1) {
1493
6.59k
        optimize = _Py_GetConfig()->optimization_level;
1494
6.59k
    }
1495
6.59k
    if (!_PyAST_Preprocess(mod, arena, filename, optimize, flags, no_const_folding)) {
1496
0
        return -1;
1497
0
    }
1498
6.59k
    return 0;
1499
6.59k
}
1500
1501
// C implementation of inspect.cleandoc()
1502
//
1503
// Difference from inspect.cleandoc():
1504
// - Do not remove leading and trailing blank lines to keep lineno.
1505
PyObject *
1506
_PyCompile_CleanDoc(PyObject *doc)
1507
2.22k
{
1508
2.22k
    doc = PyObject_CallMethod(doc, "expandtabs", NULL);
1509
2.22k
    if (doc == NULL) {
1510
0
        return NULL;
1511
0
    }
1512
1513
2.22k
    Py_ssize_t doc_size;
1514
2.22k
    const char *doc_utf8 = PyUnicode_AsUTF8AndSize(doc, &doc_size);
1515
2.22k
    if (doc_utf8 == NULL) {
1516
0
        Py_DECREF(doc);
1517
0
        return NULL;
1518
0
    }
1519
2.22k
    const char *p = doc_utf8;
1520
2.22k
    const char *pend = p + doc_size;
1521
1522
    // First pass: find minimum indentation of any non-blank lines
1523
    // after first line.
1524
102k
    while (p < pend && *p++ != '\n') {
1525
100k
    }
1526
1527
2.22k
    Py_ssize_t margin = PY_SSIZE_T_MAX;
1528
14.9k
    while (p < pend) {
1529
12.7k
        const char *s = p;
1530
75.9k
        while (*p == ' ') p++;
1531
12.7k
        if (p < pend && *p != '\n') {
1532
8.52k
            margin = Py_MIN(margin, p - s);
1533
8.52k
        }
1534
428k
        while (p < pend && *p++ != '\n') {
1535
415k
        }
1536
12.7k
    }
1537
2.22k
    if (margin == PY_SSIZE_T_MAX) {
1538
772
        margin = 0;
1539
772
    }
1540
1541
    // Second pass: write cleandoc into buff.
1542
1543
    // copy first line without leading spaces.
1544
2.22k
    p = doc_utf8;
1545
2.35k
    while (*p == ' ') {
1546
132
        p++;
1547
132
    }
1548
2.22k
    if (p == doc_utf8 && margin == 0 ) {
1549
        // doc is already clean.
1550
760
        return doc;
1551
760
    }
1552
1553
1.46k
    char *buff = PyMem_Malloc(doc_size);
1554
1.46k
    if (buff == NULL){
1555
0
        Py_DECREF(doc);
1556
0
        PyErr_NoMemory();
1557
0
        return NULL;
1558
0
    }
1559
1560
1.46k
    char *w = buff;
1561
1562
66.2k
    while (p < pend) {
1563
66.2k
        int ch = *w++ = *p++;
1564
66.2k
        if (ch == '\n') {
1565
1.46k
            break;
1566
1.46k
        }
1567
66.2k
    }
1568
1569
    // copy subsequent lines without margin.
1570
12.8k
    while (p < pend) {
1571
61.1k
        for (Py_ssize_t i = 0; i < margin; i++, p++) {
1572
52.2k
            if (*p != ' ') {
1573
2.55k
                assert(*p == '\n' || *p == '\0');
1574
2.55k
                break;
1575
2.55k
            }
1576
52.2k
        }
1577
383k
        while (p < pend) {
1578
381k
            int ch = *w++ = *p++;
1579
381k
            if (ch == '\n') {
1580
9.98k
                break;
1581
9.98k
            }
1582
381k
        }
1583
11.3k
    }
1584
1585
1.46k
    Py_DECREF(doc);
1586
1.46k
    PyObject *res = PyUnicode_FromStringAndSize(buff, w - buff);
1587
1.46k
    PyMem_Free(buff);
1588
1.46k
    return res;
1589
1.46k
}
1590
1591
/* Access to compiler optimizations for unit tests.
1592
 *
1593
 * _PyCompile_CodeGen takes an AST, applies code-gen and
1594
 * returns the unoptimized CFG as an instruction list.
1595
 *
1596
 */
1597
PyObject *
1598
_PyCompile_CodeGen(PyObject *ast, PyObject *filename, PyCompilerFlags *pflags,
1599
                   int optimize, int compile_mode)
1600
0
{
1601
0
    PyObject *res = NULL;
1602
0
    PyObject *metadata = NULL;
1603
1604
0
    if (!PyAST_Check(ast)) {
1605
0
        PyErr_SetString(PyExc_TypeError, "expected an AST");
1606
0
        return NULL;
1607
0
    }
1608
1609
0
    PyArena *arena = _PyArena_New();
1610
0
    if (arena == NULL) {
1611
0
        return NULL;
1612
0
    }
1613
1614
0
    mod_ty mod = PyAST_obj2mod(ast, arena, compile_mode);
1615
0
    if (mod == NULL || !_PyAST_Validate(mod)) {
1616
0
        _PyArena_Free(arena);
1617
0
        return NULL;
1618
0
    }
1619
1620
0
    compiler *c = new_compiler(mod, filename, pflags, optimize, arena);
1621
0
    if (c == NULL) {
1622
0
        _PyArena_Free(arena);
1623
0
        return NULL;
1624
0
    }
1625
0
    c->c_save_nested_seqs = true;
1626
1627
0
    metadata = PyDict_New();
1628
0
    if (metadata == NULL) {
1629
0
        return NULL;
1630
0
    }
1631
1632
0
    if (compiler_codegen(c, mod) < 0) {
1633
0
        goto finally;
1634
0
    }
1635
1636
0
    _PyCompile_CodeUnitMetadata *umd = &c->u->u_metadata;
1637
1638
0
#define SET_METADATA_INT(key, value) do { \
1639
0
        PyObject *v = PyLong_FromLong((long)value); \
1640
0
        if (v == NULL) goto finally; \
1641
0
        int res = PyDict_SetItemString(metadata, key, v); \
1642
0
        Py_XDECREF(v); \
1643
0
        if (res < 0) goto finally; \
1644
0
    } while (0);
1645
1646
0
    SET_METADATA_INT("argcount", umd->u_argcount);
1647
0
    SET_METADATA_INT("posonlyargcount", umd->u_posonlyargcount);
1648
0
    SET_METADATA_INT("kwonlyargcount", umd->u_kwonlyargcount);
1649
0
#undef SET_METADATA_INT
1650
1651
0
    int addNone = mod->kind != Expression_kind;
1652
0
    if (_PyCodegen_AddReturnAtEnd(c, addNone) < 0) {
1653
0
        goto finally;
1654
0
    }
1655
1656
0
    if (_PyInstructionSequence_ApplyLabelMap(_PyCompile_InstrSequence(c)) < 0) {
1657
0
        return NULL;
1658
0
    }
1659
    /* Allocate a copy of the instruction sequence on the heap */
1660
0
    res = PyTuple_Pack(2, _PyCompile_InstrSequence(c), metadata);
1661
1662
0
finally:
1663
0
    Py_XDECREF(metadata);
1664
0
    _PyCompile_ExitScope(c);
1665
0
    compiler_free(c);
1666
0
    _PyArena_Free(arena);
1667
0
    return res;
1668
0
}
1669
1670
int _PyCfg_JumpLabelsToTargets(cfg_builder *g);
1671
1672
PyCodeObject *
1673
_PyCompile_Assemble(_PyCompile_CodeUnitMetadata *umd, PyObject *filename,
1674
                    PyObject *seq)
1675
0
{
1676
0
    if (!_PyInstructionSequence_Check(seq)) {
1677
0
        PyErr_SetString(PyExc_TypeError, "expected an instruction sequence");
1678
0
        return NULL;
1679
0
    }
1680
0
    cfg_builder *g = NULL;
1681
0
    PyCodeObject *co = NULL;
1682
0
    instr_sequence optimized_instrs;
1683
0
    memset(&optimized_instrs, 0, sizeof(instr_sequence));
1684
1685
0
    PyObject *const_cache = PyDict_New();
1686
0
    if (const_cache == NULL) {
1687
0
        return NULL;
1688
0
    }
1689
1690
0
    g = _PyCfg_FromInstructionSequence((instr_sequence*)seq);
1691
0
    if (g == NULL) {
1692
0
        goto error;
1693
0
    }
1694
1695
0
    if (_PyCfg_JumpLabelsToTargets(g) < 0) {
1696
0
        goto error;
1697
0
    }
1698
1699
0
    int code_flags = 0;
1700
0
    int stackdepth, nlocalsplus;
1701
0
    if (_PyCfg_OptimizedCfgToInstructionSequence(g, umd, code_flags,
1702
0
                                                 &stackdepth, &nlocalsplus,
1703
0
                                                 &optimized_instrs) < 0) {
1704
0
        goto error;
1705
0
    }
1706
1707
0
    PyObject *consts = consts_dict_keys_inorder(umd->u_consts);
1708
0
    if (consts == NULL) {
1709
0
        goto error;
1710
0
    }
1711
0
    co = _PyAssemble_MakeCodeObject(umd, const_cache,
1712
0
                                    consts, stackdepth, &optimized_instrs,
1713
0
                                    nlocalsplus, code_flags, filename);
1714
0
    Py_DECREF(consts);
1715
1716
0
error:
1717
0
    Py_DECREF(const_cache);
1718
0
    _PyCfgBuilder_Free(g);
1719
0
    PyInstructionSequence_Fini(&optimized_instrs);
1720
0
    return co;
1721
0
}
1722
1723
/* Retained for API compatibility.
1724
 * Optimization is now done in _PyCfg_OptimizeCodeUnit */
1725
1726
PyObject *
1727
PyCode_Optimize(PyObject *code, PyObject* Py_UNUSED(consts),
1728
                PyObject *Py_UNUSED(names), PyObject *Py_UNUSED(lnotab_obj))
1729
0
{
1730
0
    return Py_NewRef(code);
1731
0
}