Coverage Report

Created: 2025-08-26 06:57

/src/cpython3/Python/compile.c
Line
Count
Source (jump to first uncovered line)
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
2.20M
#define SUCCESS 0
36
2.41k
#define ERROR -1
37
38
#define RETURN_IF_ERROR(X)  \
39
811k
    do {                    \
40
811k
        if ((X) == -1) {    \
41
546
            return ERROR;   \
42
546
        }                   \
43
811k
    } 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
16.8k
{
112
16.8k
    PyCompilerFlags local_flags = _PyCompilerFlags_INIT;
113
114
16.8k
    c->c_const_cache = PyDict_New();
115
16.8k
    if (!c->c_const_cache) {
116
0
        return ERROR;
117
0
    }
118
119
16.8k
    c->c_stack = PyList_New(0);
120
16.8k
    if (!c->c_stack) {
121
0
        return ERROR;
122
0
    }
123
124
16.8k
    c->c_filename = Py_NewRef(filename);
125
16.8k
    if (!_PyFuture_FromAST(mod, filename, &c->c_future)) {
126
17
        return ERROR;
127
17
    }
128
16.7k
    if (!flags) {
129
16.7k
        flags = &local_flags;
130
16.7k
    }
131
16.7k
    int merged = c->c_future.ff_features | flags->cf_flags;
132
16.7k
    c->c_future.ff_features = merged;
133
16.7k
    flags->cf_flags = merged;
134
16.7k
    c->c_flags = *flags;
135
16.7k
    c->c_optimize = (optimize == -1) ? _Py_GetConfig()->optimization_level : optimize;
136
16.7k
    c->c_save_nested_seqs = false;
137
138
16.7k
    if (!_PyAST_Preprocess(mod, arena, filename, c->c_optimize, merged, 0)) {
139
0
        return ERROR;
140
0
    }
141
16.7k
    c->c_st = _PySymtable_Build(mod, filename, &c->c_future);
142
16.7k
    if (c->c_st == NULL) {
143
395
        if (!PyErr_Occurred()) {
144
0
            PyErr_SetString(PyExc_SystemError, "no symtable");
145
0
        }
146
395
        return ERROR;
147
395
    }
148
16.3k
    return SUCCESS;
149
16.7k
}
150
151
static void
152
compiler_free(compiler *c)
153
16.8k
{
154
16.8k
    if (c->c_st) {
155
16.3k
        _PySymtable_Free(c->c_st);
156
16.3k
    }
157
16.8k
    Py_XDECREF(c->c_filename);
158
16.8k
    Py_XDECREF(c->c_const_cache);
159
16.8k
    Py_XDECREF(c->c_stack);
160
16.8k
    PyMem_Free(c);
161
16.8k
}
162
163
static compiler*
164
new_compiler(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
165
             int optimize, PyArena *arena)
166
16.8k
{
167
16.8k
    compiler *c = PyMem_Calloc(1, sizeof(compiler));
168
16.8k
    if (c == NULL) {
169
0
        return NULL;
170
0
    }
171
16.8k
    if (compiler_setup(c, mod, filename, pflags, optimize, arena) < 0) {
172
412
        compiler_free(c);
173
412
        return NULL;
174
412
    }
175
16.3k
    return c;
176
16.8k
}
177
178
static void
179
compiler_unit_free(struct compiler_unit *u)
180
77.8k
{
181
77.8k
    Py_CLEAR(u->u_instr_sequence);
182
77.8k
    Py_CLEAR(u->u_stashed_instr_sequence);
183
77.8k
    Py_CLEAR(u->u_ste);
184
77.8k
    Py_CLEAR(u->u_metadata.u_name);
185
77.8k
    Py_CLEAR(u->u_metadata.u_qualname);
186
77.8k
    Py_CLEAR(u->u_metadata.u_consts);
187
77.8k
    Py_CLEAR(u->u_metadata.u_names);
188
77.8k
    Py_CLEAR(u->u_metadata.u_varnames);
189
77.8k
    Py_CLEAR(u->u_metadata.u_freevars);
190
77.8k
    Py_CLEAR(u->u_metadata.u_cellvars);
191
77.8k
    Py_CLEAR(u->u_metadata.u_fasthidden);
192
77.8k
    Py_CLEAR(u->u_private);
193
77.8k
    Py_CLEAR(u->u_static_attributes);
194
77.8k
    Py_CLEAR(u->u_deferred_annotations);
195
77.8k
    Py_CLEAR(u->u_conditional_annotation_indices);
196
77.8k
    PyMem_Free(u);
197
77.8k
}
198
199
163k
#define CAPSULE_NAME "compile.c compiler unit"
200
201
int
202
_PyCompile_MaybeAddStaticAttributeToClass(compiler *c, expr_ty e)
203
24.4k
{
204
24.4k
    assert(e->kind == Attribute_kind);
205
24.4k
    expr_ty attr_value = e->v.Attribute.value;
206
24.4k
    if (attr_value->kind != Name_kind ||
207
24.4k
        e->v.Attribute.ctx != Store ||
208
24.4k
        !_PyUnicode_EqualToASCIIString(attr_value->v.Name.id, "self"))
209
23.1k
    {
210
23.1k
        return SUCCESS;
211
23.1k
    }
212
1.24k
    Py_ssize_t stack_size = PyList_GET_SIZE(c->c_stack);
213
1.71k
    for (Py_ssize_t i = stack_size - 1; i >= 0; i--) {
214
933
        PyObject *capsule = PyList_GET_ITEM(c->c_stack, i);
215
0
        struct compiler_unit *u = (struct compiler_unit *)PyCapsule_GetPointer(
216
933
                                                              capsule, CAPSULE_NAME);
217
933
        assert(u);
218
933
        if (u->u_scope_type == COMPILE_SCOPE_CLASS) {
219
456
            assert(u->u_static_attributes);
220
456
            RETURN_IF_ERROR(PySet_Add(u->u_static_attributes, e->v.Attribute.attr));
221
456
            break;
222
456
        }
223
933
    }
224
1.24k
    return SUCCESS;
225
1.24k
}
226
227
static int
228
compiler_set_qualname(compiler *c)
229
61.4k
{
230
61.4k
    Py_ssize_t stack_size;
231
61.4k
    struct compiler_unit *u = c->u;
232
61.4k
    PyObject *name, *base;
233
234
61.4k
    base = NULL;
235
61.4k
    stack_size = PyList_GET_SIZE(c->c_stack);
236
61.4k
    assert(stack_size >= 1);
237
61.4k
    if (stack_size > 1) {
238
31.1k
        int scope, force_global = 0;
239
31.1k
        struct compiler_unit *parent;
240
31.1k
        PyObject *mangled, *capsule;
241
242
31.1k
        capsule = PyList_GET_ITEM(c->c_stack, stack_size - 1);
243
31.1k
        parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
244
31.1k
        assert(parent);
245
31.1k
        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
18.0k
            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
9.19k
                u->u_metadata.u_qualname = Py_NewRef(u->u_metadata.u_name);
252
9.19k
                return SUCCESS;
253
9.19k
            }
254
8.87k
            capsule = PyList_GET_ITEM(c->c_stack, stack_size - 2);
255
8.87k
            parent = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
256
8.87k
            assert(parent);
257
8.87k
        }
258
259
21.9k
        if (u->u_scope_type == COMPILE_SCOPE_FUNCTION
260
21.9k
            || u->u_scope_type == COMPILE_SCOPE_ASYNC_FUNCTION
261
21.9k
            || u->u_scope_type == COMPILE_SCOPE_CLASS) {
262
5.05k
            assert(u->u_metadata.u_name);
263
5.05k
            mangled = _Py_Mangle(parent->u_private, u->u_metadata.u_name);
264
5.05k
            if (!mangled) {
265
0
                return ERROR;
266
0
            }
267
268
5.05k
            scope = _PyST_GetScope(parent->u_ste, mangled);
269
5.05k
            Py_DECREF(mangled);
270
5.05k
            RETURN_IF_ERROR(scope);
271
5.05k
            assert(scope != GLOBAL_IMPLICIT);
272
5.05k
            if (scope == GLOBAL_EXPLICIT)
273
35
                force_global = 1;
274
5.05k
        }
275
276
21.9k
        if (!force_global) {
277
21.8k
            if (parent->u_scope_type == COMPILE_SCOPE_FUNCTION
278
21.8k
                || parent->u_scope_type == COMPILE_SCOPE_ASYNC_FUNCTION
279
21.8k
                || parent->u_scope_type == COMPILE_SCOPE_LAMBDA)
280
12.7k
            {
281
12.7k
                _Py_DECLARE_STR(dot_locals, ".<locals>");
282
12.7k
                base = PyUnicode_Concat(parent->u_metadata.u_qualname,
283
12.7k
                                        &_Py_STR(dot_locals));
284
12.7k
                if (base == NULL) {
285
0
                    return ERROR;
286
0
                }
287
12.7k
            }
288
9.19k
            else {
289
9.19k
                base = Py_NewRef(parent->u_metadata.u_qualname);
290
9.19k
            }
291
21.8k
        }
292
21.9k
    }
293
294
52.2k
    if (base != NULL) {
295
21.8k
        name = PyUnicode_Concat(base, _Py_LATIN1_CHR('.'));
296
21.8k
        Py_DECREF(base);
297
21.8k
        if (name == NULL) {
298
0
            return ERROR;
299
0
        }
300
21.8k
        PyUnicode_Append(&name, u->u_metadata.u_name);
301
21.8k
        if (name == NULL) {
302
0
            return ERROR;
303
0
        }
304
21.8k
    }
305
30.3k
    else {
306
30.3k
        name = Py_NewRef(u->u_metadata.u_name);
307
30.3k
    }
308
52.2k
    u->u_metadata.u_qualname = name;
309
310
52.2k
    return SUCCESS;
311
52.2k
}
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
2.68M
{
319
2.68M
    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
2.68M
    if (o == Py_None || o == Py_Ellipsis) {
323
181k
        return o;
324
181k
    }
325
326
2.50M
    PyObject *key = _PyCode_ConstantKey(o);
327
2.50M
    if (key == NULL) {
328
0
        return NULL;
329
0
    }
330
331
2.50M
    PyObject *t;
332
2.50M
    int res = PyDict_SetDefaultRef(const_cache, key, key, &t);
333
2.50M
    if (res != 0) {
334
        // o was not inserted into const_cache. t is either the existing value
335
        // or NULL (on error).
336
1.95M
        Py_DECREF(key);
337
1.95M
        return t;
338
1.95M
    }
339
545k
    Py_DECREF(t);
340
341
545k
    if (!recursive) {
342
337k
        return key;
343
337k
    }
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
207k
    if (PyTuple_CheckExact(o)) {
349
4.07k
        Py_ssize_t len = PyTuple_GET_SIZE(o);
350
7.58k
        for (Py_ssize_t i = 0; i < len; i++) {
351
3.51k
            PyObject *item = PyTuple_GET_ITEM(o, i);
352
0
            PyObject *u = const_cache_insert(const_cache, item, recursive);
353
3.51k
            if (u == NULL) {
354
0
                Py_DECREF(key);
355
0
                return NULL;
356
0
            }
357
358
            // See _PyCode_ConstantKey()
359
3.51k
            PyObject *v;  // borrowed
360
3.51k
            if (PyTuple_CheckExact(u)) {
361
0
                v = PyTuple_GET_ITEM(u, 1);
362
0
            }
363
3.51k
            else {
364
3.51k
                v = u;
365
3.51k
            }
366
3.51k
            if (v != item) {
367
0
                PyTuple_SET_ITEM(o, i, Py_NewRef(v));
368
0
                Py_DECREF(item);
369
0
            }
370
371
3.51k
            Py_DECREF(u);
372
3.51k
        }
373
4.07k
    }
374
203k
    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
207k
    return key;
426
207k
}
427
428
static PyObject*
429
merge_consts_recursive(PyObject *const_cache, PyObject *o)
430
1.48M
{
431
1.48M
    return const_cache_insert(const_cache, o, true);
432
1.48M
}
433
434
Py_ssize_t
435
_PyCompile_DictAddObj(PyObject *dict, PyObject *o)
436
2.35M
{
437
2.35M
    PyObject *v;
438
2.35M
    Py_ssize_t arg;
439
440
2.35M
    if (PyDict_GetItemRef(dict, o, &v) < 0) {
441
0
        return ERROR;
442
0
    }
443
2.35M
    if (!v) {
444
742k
        arg = PyDict_GET_SIZE(dict);
445
742k
        v = PyLong_FromSsize_t(arg);
446
742k
        if (!v) {
447
0
            return ERROR;
448
0
        }
449
742k
        if (PyDict_SetItem(dict, o, v) < 0) {
450
0
            Py_DECREF(v);
451
0
            return ERROR;
452
0
        }
453
742k
    }
454
1.61M
    else
455
1.61M
        arg = PyLong_AsLong(v);
456
2.35M
    Py_DECREF(v);
457
2.35M
    return arg;
458
2.35M
}
459
460
Py_ssize_t
461
_PyCompile_AddConst(compiler *c, PyObject *o)
462
1.48M
{
463
1.48M
    PyObject *key = merge_consts_recursive(c->c_const_cache, o);
464
1.48M
    if (key == NULL) {
465
0
        return ERROR;
466
0
    }
467
468
1.48M
    Py_ssize_t arg = _PyCompile_DictAddObj(c->u->u_metadata.u_consts, key);
469
1.48M
    Py_DECREF(key);
470
1.48M
    return arg;
471
1.48M
}
472
473
static PyObject *
474
list2dict(PyObject *list)
475
77.8k
{
476
77.8k
    Py_ssize_t i, n;
477
77.8k
    PyObject *v, *k;
478
77.8k
    PyObject *dict = PyDict_New();
479
77.8k
    if (!dict) return NULL;
480
481
77.8k
    n = PyList_Size(list);
482
118k
    for (i = 0; i < n; i++) {
483
40.7k
        v = PyLong_FromSsize_t(i);
484
40.7k
        if (!v) {
485
0
            Py_DECREF(dict);
486
0
            return NULL;
487
0
        }
488
40.7k
        k = PyList_GET_ITEM(list, i);
489
40.7k
        if (PyDict_SetItem(dict, k, v) < 0) {
490
0
            Py_DECREF(v);
491
0
            Py_DECREF(dict);
492
0
            return NULL;
493
0
        }
494
40.7k
        Py_DECREF(v);
495
40.7k
    }
496
77.8k
    return dict;
497
77.8k
}
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
155k
{
510
155k
    Py_ssize_t i = offset, num_keys, key_i;
511
155k
    PyObject *k, *v, *dest = PyDict_New();
512
155k
    PyObject *sorted_keys;
513
514
155k
    assert(offset >= 0);
515
155k
    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
155k
    sorted_keys = PyDict_Keys(src);
524
155k
    if (sorted_keys == NULL) {
525
0
        Py_DECREF(dest);
526
0
        return NULL;
527
0
    }
528
155k
    if (PyList_Sort(sorted_keys) != 0) {
529
0
        Py_DECREF(sorted_keys);
530
0
        Py_DECREF(dest);
531
0
        return NULL;
532
0
    }
533
155k
    num_keys = PyList_GET_SIZE(sorted_keys);
534
535
845k
    for (key_i = 0; key_i < num_keys; key_i++) {
536
689k
        k = PyList_GET_ITEM(sorted_keys, key_i);
537
0
        v = PyDict_GetItemWithError(src, k);
538
689k
        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
689k
        long vi = PyLong_AsLong(v);
547
689k
        if (vi == -1 && PyErr_Occurred()) {
548
0
            Py_DECREF(sorted_keys);
549
0
            Py_DECREF(dest);
550
0
            return NULL;
551
0
        }
552
689k
        if (SYMBOL_TO_SCOPE(vi) == scope_type || vi & flag) {
553
35.1k
            PyObject *item = PyLong_FromSsize_t(i);
554
35.1k
            if (item == NULL) {
555
0
                Py_DECREF(sorted_keys);
556
0
                Py_DECREF(dest);
557
0
                return NULL;
558
0
            }
559
35.1k
            i++;
560
35.1k
            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
35.1k
            Py_DECREF(item);
567
35.1k
        }
568
689k
    }
569
155k
    Py_DECREF(sorted_keys);
570
155k
    return dest;
571
155k
}
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
77.8k
{
578
77.8k
    struct compiler_unit *u;
579
77.8k
    u = (struct compiler_unit *)PyMem_Calloc(1, sizeof(struct compiler_unit));
580
77.8k
    if (!u) {
581
0
        PyErr_NoMemory();
582
0
        return ERROR;
583
0
    }
584
77.8k
    u->u_scope_type = scope_type;
585
77.8k
    if (umd != NULL) {
586
37.1k
        u->u_metadata = *umd;
587
37.1k
    }
588
40.7k
    else {
589
40.7k
        u->u_metadata.u_argcount = 0;
590
40.7k
        u->u_metadata.u_posonlyargcount = 0;
591
40.7k
        u->u_metadata.u_kwonlyargcount = 0;
592
40.7k
    }
593
77.8k
    u->u_ste = _PySymtable_Lookup(c->c_st, key);
594
77.8k
    if (!u->u_ste) {
595
0
        compiler_unit_free(u);
596
0
        return ERROR;
597
0
    }
598
77.8k
    u->u_metadata.u_name = Py_NewRef(name);
599
77.8k
    u->u_metadata.u_varnames = list2dict(u->u_ste->ste_varnames);
600
77.8k
    if (!u->u_metadata.u_varnames) {
601
0
        compiler_unit_free(u);
602
0
        return ERROR;
603
0
    }
604
77.8k
    u->u_metadata.u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, DEF_COMP_CELL, 0);
605
77.8k
    if (!u->u_metadata.u_cellvars) {
606
0
        compiler_unit_free(u);
607
0
        return ERROR;
608
0
    }
609
77.8k
    if (u->u_ste->ste_needs_class_closure) {
610
        /* Cook up an implicit __class__ cell. */
611
94
        Py_ssize_t res;
612
94
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS);
613
94
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__class__));
614
94
        if (res < 0) {
615
0
            compiler_unit_free(u);
616
0
            return ERROR;
617
0
        }
618
94
    }
619
77.8k
    if (u->u_ste->ste_needs_classdict) {
620
        /* Cook up an implicit __classdict__ cell. */
621
2.64k
        Py_ssize_t res;
622
2.64k
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS);
623
2.64k
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__classdict__));
624
2.64k
        if (res < 0) {
625
0
            compiler_unit_free(u);
626
0
            return ERROR;
627
0
        }
628
2.64k
    }
629
77.8k
    if (u->u_ste->ste_has_conditional_annotations) {
630
        /* Cook up an implicit __conditional__annotations__ cell */
631
2.97k
        Py_ssize_t res;
632
2.97k
        assert(u->u_scope_type == COMPILE_SCOPE_CLASS || u->u_scope_type == COMPILE_SCOPE_MODULE);
633
2.97k
        res = _PyCompile_DictAddObj(u->u_metadata.u_cellvars, &_Py_ID(__conditional_annotations__));
634
2.97k
        if (res < 0) {
635
0
            compiler_unit_free(u);
636
0
            return ERROR;
637
0
        }
638
2.97k
    }
639
640
77.8k
    u->u_metadata.u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS,
641
77.8k
                               PyDict_GET_SIZE(u->u_metadata.u_cellvars));
642
77.8k
    if (!u->u_metadata.u_freevars) {
643
0
        compiler_unit_free(u);
644
0
        return ERROR;
645
0
    }
646
647
77.8k
    u->u_metadata.u_fasthidden = PyDict_New();
648
77.8k
    if (!u->u_metadata.u_fasthidden) {
649
0
        compiler_unit_free(u);
650
0
        return ERROR;
651
0
    }
652
653
77.8k
    u->u_nfblocks = 0;
654
77.8k
    u->u_in_inlined_comp = 0;
655
77.8k
    u->u_metadata.u_firstlineno = lineno;
656
77.8k
    u->u_metadata.u_consts = PyDict_New();
657
77.8k
    if (!u->u_metadata.u_consts) {
658
0
        compiler_unit_free(u);
659
0
        return ERROR;
660
0
    }
661
77.8k
    u->u_metadata.u_names = PyDict_New();
662
77.8k
    if (!u->u_metadata.u_names) {
663
0
        compiler_unit_free(u);
664
0
        return ERROR;
665
0
    }
666
667
77.8k
    u->u_deferred_annotations = NULL;
668
77.8k
    u->u_conditional_annotation_indices = NULL;
669
77.8k
    u->u_next_conditional_annotation_index = 0;
670
77.8k
    if (scope_type == COMPILE_SCOPE_CLASS) {
671
15.7k
        u->u_static_attributes = PySet_New(0);
672
15.7k
        if (!u->u_static_attributes) {
673
0
            compiler_unit_free(u);
674
0
            return ERROR;
675
0
        }
676
15.7k
    }
677
62.1k
    else {
678
62.1k
        u->u_static_attributes = NULL;
679
62.1k
    }
680
681
77.8k
    u->u_instr_sequence = (instr_sequence*)_PyInstructionSequence_New();
682
77.8k
    if (!u->u_instr_sequence) {
683
0
        compiler_unit_free(u);
684
0
        return ERROR;
685
0
    }
686
77.8k
    u->u_stashed_instr_sequence = NULL;
687
688
    /* Push the old compiler_unit on the stack. */
689
77.8k
    if (c->u) {
690
61.4k
        PyObject *capsule = PyCapsule_New(c->u, CAPSULE_NAME, NULL);
691
61.4k
        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
61.4k
        Py_DECREF(capsule);
697
61.4k
        if (private == NULL) {
698
37.8k
            private = c->u->u_private;
699
37.8k
        }
700
61.4k
    }
701
702
77.8k
    u->u_private = Py_XNewRef(private);
703
704
77.8k
    c->u = u;
705
77.8k
    if (scope_type != COMPILE_SCOPE_MODULE) {
706
61.4k
        RETURN_IF_ERROR(compiler_set_qualname(c));
707
61.4k
    }
708
77.8k
    return SUCCESS;
709
77.8k
}
710
711
void
712
_PyCompile_ExitScope(compiler *c)
713
77.8k
{
714
    // Don't call PySequence_DelItem() with an exception raised
715
77.8k
    PyObject *exc = PyErr_GetRaisedException();
716
717
77.8k
    instr_sequence *nested_seq = NULL;
718
77.8k
    if (c->c_save_nested_seqs) {
719
0
        nested_seq = c->u->u_instr_sequence;
720
0
        Py_INCREF(nested_seq);
721
0
    }
722
77.8k
    compiler_unit_free(c->u);
723
    /* Restore c->u to the parent unit. */
724
77.8k
    Py_ssize_t n = PyList_GET_SIZE(c->c_stack) - 1;
725
77.8k
    if (n >= 0) {
726
61.4k
        PyObject *capsule = PyList_GET_ITEM(c->c_stack, n);
727
61.4k
        c->u = (struct compiler_unit *)PyCapsule_GetPointer(capsule, CAPSULE_NAME);
728
61.4k
        assert(c->u);
729
        /* we are deleting from a list so this really shouldn't fail */
730
61.4k
        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
61.4k
        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
61.4k
    }
741
16.3k
    else {
742
16.3k
        c->u = NULL;
743
16.3k
    }
744
77.8k
    Py_XDECREF(nested_seq);
745
746
77.8k
    PyErr_SetRaisedException(exc);
747
77.8k
}
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
39.8k
{
758
39.8k
    fblockinfo *f;
759
39.8k
    if (c->u->u_nfblocks >= CO_MAXBLOCKS) {
760
10
        return _PyCompile_Error(c, loc, "too many statically nested blocks");
761
10
    }
762
39.8k
    f = &c->u->u_fblock[c->u->u_nfblocks++];
763
39.8k
    f->fb_type = t;
764
39.8k
    f->fb_block = block_label;
765
39.8k
    f->fb_loc = loc;
766
39.8k
    f->fb_exit = exit;
767
39.8k
    f->fb_datum = datum;
768
39.8k
    return SUCCESS;
769
39.8k
}
770
771
void
772
_PyCompile_PopFBlock(compiler *c, fblocktype t, jump_target_label block_label)
773
39.4k
{
774
39.4k
    struct compiler_unit *u = c->u;
775
39.4k
    assert(u->u_nfblocks > 0);
776
39.4k
    u->u_nfblocks--;
777
39.4k
    assert(u->u_fblock[u->u_nfblocks].fb_type == t);
778
39.4k
    assert(SAME_JUMP_TARGET_LABEL(u->u_fblock[u->u_nfblocks].fb_block, block_label));
779
39.4k
}
780
781
fblockinfo *
782
_PyCompile_TopFBlock(compiler *c)
783
3.35k
{
784
3.35k
    if (c->u->u_nfblocks == 0) {
785
811
        return NULL;
786
811
    }
787
2.54k
    return &c->u->u_fblock[c->u->u_nfblocks - 1];
788
3.35k
}
789
790
void
791
_PyCompile_DeferredAnnotations(compiler *c,
792
                               PyObject **deferred_annotations,
793
                               PyObject **conditional_annotation_indices)
794
26.2k
{
795
26.2k
    *deferred_annotations = Py_XNewRef(c->u->u_deferred_annotations);
796
26.2k
    *conditional_annotation_indices = Py_XNewRef(c->u->u_conditional_annotation_indices);
797
26.2k
}
798
799
static location
800
start_location(asdl_stmt_seq *stmts)
801
14.0k
{
802
14.0k
    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
13.6k
        stmt_ty st = (stmt_ty)asdl_seq_GET(stmts, 0);
809
13.6k
        return SRC_LOCATION_FROM_AST(st);
810
13.6k
    }
811
324
    return (const _Py_SourceLocation){1, 1, 0, 0};
812
14.0k
}
813
814
static int
815
compiler_codegen(compiler *c, mod_ty mod)
816
16.3k
{
817
16.3k
    RETURN_IF_ERROR(_PyCodegen_EnterAnonymousScope(c, mod));
818
16.3k
    assert(c->u->u_scope_type == COMPILE_SCOPE_MODULE);
819
16.3k
    switch (mod->kind) {
820
9.92k
    case Module_kind: {
821
9.92k
        asdl_stmt_seq *stmts = mod->v.Module.body;
822
9.92k
        RETURN_IF_ERROR(_PyCodegen_Module(c, start_location(stmts), stmts, false));
823
9.57k
        break;
824
9.92k
    }
825
9.57k
    case Interactive_kind: {
826
4.09k
        c->c_interactive = 1;
827
4.09k
        asdl_stmt_seq *stmts = mod->v.Interactive.body;
828
4.09k
        RETURN_IF_ERROR(_PyCodegen_Module(c, start_location(stmts), stmts, true));
829
3.96k
        break;
830
4.09k
    }
831
3.96k
    case Expression_kind: {
832
2.36k
        RETURN_IF_ERROR(_PyCodegen_Expression(c, mod->v.Expression.body));
833
2.30k
        break;
834
2.36k
    }
835
2.30k
    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
2.36k
    }}
841
15.8k
    return SUCCESS;
842
16.3k
}
843
844
static PyCodeObject *
845
compiler_mod(compiler *c, mod_ty mod)
846
16.3k
{
847
16.3k
    PyCodeObject *co = NULL;
848
16.3k
    int addNone = mod->kind != Expression_kind;
849
16.3k
    if (compiler_codegen(c, mod) < 0) {
850
546
        goto finally;
851
546
    }
852
15.8k
    co = _PyCompile_OptimizeAndAssemble(c, addNone);
853
16.3k
finally:
854
16.3k
    _PyCompile_ExitScope(c);
855
16.3k
    return co;
856
15.8k
}
857
858
int
859
_PyCompile_GetRefType(compiler *c, PyObject *name)
860
25.8k
{
861
25.8k
    if (c->u->u_scope_type == COMPILE_SCOPE_CLASS &&
862
25.8k
        (_PyUnicode_EqualToASCIIString(name, "__class__") ||
863
5.05k
         _PyUnicode_EqualToASCIIString(name, "__classdict__") ||
864
5.05k
         _PyUnicode_EqualToASCIIString(name, "__conditional_annotations__"))) {
865
4.56k
        return CELL;
866
4.56k
    }
867
21.3k
    PySTEntryObject *ste = c->u->u_ste;
868
21.3k
    int scope = _PyST_GetScope(ste, name);
869
21.3k
    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
21.3k
    return scope;
882
21.3k
}
883
884
static int
885
dict_lookup_arg(PyObject *dict, PyObject *name)
886
28.5k
{
887
28.5k
    PyObject *v = PyDict_GetItemWithError(dict, name);
888
28.5k
    if (v == NULL) {
889
0
        return ERROR;
890
0
    }
891
28.5k
    return PyLong_AsLong(v);
892
28.5k
}
893
894
int
895
_PyCompile_LookupCellvar(compiler *c, PyObject *name)
896
2.72k
{
897
2.72k
    assert(c->u->u_metadata.u_cellvars);
898
2.72k
    return dict_lookup_arg(c->u->u_metadata.u_cellvars, name);
899
2.72k
}
900
901
int
902
_PyCompile_LookupArg(compiler *c, PyCodeObject *co, PyObject *name)
903
25.8k
{
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
25.8k
    int reftype = _PyCompile_GetRefType(c, name);
911
25.8k
    if (reftype == -1) {
912
0
        return ERROR;
913
0
    }
914
25.8k
    int arg;
915
25.8k
    if (reftype == CELL) {
916
14.6k
        arg = dict_lookup_arg(c->u->u_metadata.u_cellvars, name);
917
14.6k
    }
918
11.2k
    else {
919
11.2k
        arg = dict_lookup_arg(c->u->u_metadata.u_freevars, name);
920
11.2k
    }
921
25.8k
    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
25.8k
    return arg;
938
25.8k
}
939
940
PyObject *
941
_PyCompile_StaticAttributesAsTuple(compiler *c)
942
15.6k
{
943
15.6k
    assert(c->u->u_static_attributes);
944
15.6k
    PyObject *static_attributes_unsorted = PySequence_List(c->u->u_static_attributes);
945
15.6k
    if (static_attributes_unsorted == NULL) {
946
0
        return NULL;
947
0
    }
948
15.6k
    if (PyList_Sort(static_attributes_unsorted) != 0) {
949
0
        Py_DECREF(static_attributes_unsorted);
950
0
        return NULL;
951
0
    }
952
15.6k
    PyObject *static_attributes = PySequence_Tuple(static_attributes_unsorted);
953
15.6k
    Py_DECREF(static_attributes_unsorted);
954
15.6k
    return static_attributes;
955
15.6k
}
956
957
int
958
_PyCompile_ResolveNameop(compiler *c, PyObject *mangled, int scope,
959
                          _PyCompile_optype *optype, Py_ssize_t *arg)
960
753k
{
961
753k
    PyObject *dict = c->u->u_metadata.u_names;
962
753k
    *optype = COMPILE_OP_NAME;
963
964
753k
    assert(scope >= 0);
965
753k
    switch (scope) {
966
11.1k
    case FREE:
967
11.1k
        dict = c->u->u_metadata.u_freevars;
968
11.1k
        *optype = COMPILE_OP_DEREF;
969
11.1k
        break;
970
17.1k
    case CELL:
971
17.1k
        dict = c->u->u_metadata.u_cellvars;
972
17.1k
        *optype = COMPILE_OP_DEREF;
973
17.1k
        break;
974
277k
    case LOCAL:
975
277k
        if (_PyST_IsFunctionLike(c->u->u_ste)) {
976
189k
            *optype = COMPILE_OP_FAST;
977
189k
        }
978
87.5k
        else {
979
87.5k
            PyObject *item;
980
87.5k
            RETURN_IF_ERROR(PyDict_GetItemRef(c->u->u_metadata.u_fasthidden, mangled,
981
87.5k
                                              &item));
982
87.5k
            if (item == Py_True) {
983
9.64k
                *optype = COMPILE_OP_FAST;
984
9.64k
            }
985
87.5k
            Py_XDECREF(item);
986
87.5k
        }
987
277k
        break;
988
361k
    case GLOBAL_IMPLICIT:
989
361k
        if (_PyST_IsFunctionLike(c->u->u_ste)) {
990
151k
            *optype = COMPILE_OP_GLOBAL;
991
151k
        }
992
361k
        break;
993
1.55k
    case GLOBAL_EXPLICIT:
994
1.55k
        *optype = COMPILE_OP_GLOBAL;
995
1.55k
        break;
996
85.5k
    default:
997
        /* scope can be 0 */
998
85.5k
        break;
999
753k
    }
1000
753k
    if (*optype != COMPILE_OP_FAST) {
1001
554k
        *arg = _PyCompile_DictAddObj(dict, mangled);
1002
554k
        RETURN_IF_ERROR(*arg);
1003
554k
    }
1004
753k
    return SUCCESS;
1005
753k
}
1006
1007
int
1008
_PyCompile_TweakInlinedComprehensionScopes(compiler *c, location loc,
1009
                                            PySTEntryObject *entry,
1010
                                            _PyCompile_InlinedComprehensionState *state)
1011
4.83k
{
1012
4.83k
    int in_class_block = (c->u->u_ste->ste_type == ClassBlock) && !c->u->u_in_inlined_comp;
1013
4.83k
    c->u->u_in_inlined_comp++;
1014
1015
4.83k
    PyObject *k, *v;
1016
4.83k
    Py_ssize_t pos = 0;
1017
29.5k
    while (PyDict_Next(entry->ste_symbols, &pos, &k, &v)) {
1018
24.6k
        long symbol = PyLong_AsLong(v);
1019
24.6k
        assert(symbol >= 0 || PyErr_Occurred());
1020
24.6k
        RETURN_IF_ERROR(symbol);
1021
24.6k
        long scope = SYMBOL_TO_SCOPE(symbol);
1022
1023
24.6k
        long outsymbol = _PyST_GetSymbol(c->u->u_ste, k);
1024
24.6k
        RETURN_IF_ERROR(outsymbol);
1025
24.6k
        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
24.6k
        if ((scope != outsc && scope != FREE && !(scope == CELL && outsc == FREE))
1036
24.6k
                || in_class_block) {
1037
8.53k
            if (state->temp_symbols == NULL) {
1038
4.16k
                state->temp_symbols = PyDict_New();
1039
4.16k
                if (state->temp_symbols == NULL) {
1040
0
                    return ERROR;
1041
0
                }
1042
4.16k
            }
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
8.53k
            if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v) < 0) {
1047
0
                return ERROR;
1048
0
            }
1049
8.53k
            PyObject *outv = PyLong_FromLong(outsymbol);
1050
8.53k
            if (outv == NULL) {
1051
0
                return ERROR;
1052
0
            }
1053
8.53k
            int res = PyDict_SetItem(state->temp_symbols, k, outv);
1054
8.53k
            Py_DECREF(outv);
1055
8.53k
            RETURN_IF_ERROR(res);
1056
8.53k
        }
1057
        // locals handling for names bound in comprehension (DEF_LOCAL |
1058
        // DEF_NONLOCAL occurs in assignment expression to nonlocal)
1059
24.6k
        if ((symbol & DEF_LOCAL && !(symbol & DEF_NONLOCAL)) || in_class_block) {
1060
14.1k
            if (!_PyST_IsFunctionLike(c->u->u_ste)) {
1061
                // non-function scope: override this name to use fast locals
1062
11.3k
                PyObject *orig;
1063
11.3k
                if (PyDict_GetItemRef(c->u->u_metadata.u_fasthidden, k, &orig) < 0) {
1064
0
                    return ERROR;
1065
0
                }
1066
11.3k
                assert(orig == NULL || orig == Py_True || orig == Py_False);
1067
11.3k
                if (orig != Py_True) {
1068
8.56k
                    if (PyDict_SetItem(c->u->u_metadata.u_fasthidden, k, Py_True) < 0) {
1069
0
                        return ERROR;
1070
0
                    }
1071
8.56k
                    if (state->fast_hidden == NULL) {
1072
2.12k
                        state->fast_hidden = PySet_New(NULL);
1073
2.12k
                        if (state->fast_hidden == NULL) {
1074
0
                            return ERROR;
1075
0
                        }
1076
2.12k
                    }
1077
8.56k
                    if (PySet_Add(state->fast_hidden, k) < 0) {
1078
0
                        return ERROR;
1079
0
                    }
1080
8.56k
                }
1081
11.3k
            }
1082
14.1k
        }
1083
24.6k
    }
1084
4.83k
    return SUCCESS;
1085
4.83k
}
1086
1087
int
1088
_PyCompile_RevertInlinedComprehensionScopes(compiler *c, location loc,
1089
                                             _PyCompile_InlinedComprehensionState *state)
1090
4.69k
{
1091
4.69k
    c->u->u_in_inlined_comp--;
1092
4.69k
    if (state->temp_symbols) {
1093
4.11k
        PyObject *k, *v;
1094
4.11k
        Py_ssize_t pos = 0;
1095
12.5k
        while (PyDict_Next(state->temp_symbols, &pos, &k, &v)) {
1096
8.47k
            if (PyDict_SetItem(c->u->u_ste->ste_symbols, k, v)) {
1097
0
                return ERROR;
1098
0
            }
1099
8.47k
        }
1100
4.11k
        Py_CLEAR(state->temp_symbols);
1101
4.11k
    }
1102
4.69k
    if (state->fast_hidden) {
1103
10.4k
        while (PySet_Size(state->fast_hidden) > 0) {
1104
8.34k
            PyObject *k = PySet_Pop(state->fast_hidden);
1105
8.34k
            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
8.34k
            if (PyDict_SetItem(c->u->u_metadata.u_fasthidden, k, Py_False)) {
1111
0
                Py_DECREF(k);
1112
0
                return ERROR;
1113
0
            }
1114
8.34k
            Py_DECREF(k);
1115
8.34k
        }
1116
2.08k
        Py_CLEAR(state->fast_hidden);
1117
2.08k
    }
1118
4.69k
    return SUCCESS;
1119
4.69k
}
1120
1121
void
1122
_PyCompile_EnterConditionalBlock(struct _PyCompiler *c)
1123
14.4k
{
1124
14.4k
    c->u->u_in_conditional_block++;
1125
14.4k
}
1126
1127
void
1128
_PyCompile_LeaveConditionalBlock(struct _PyCompiler *c)
1129
14.4k
{
1130
14.4k
    assert(c->u->u_in_conditional_block > 0);
1131
14.4k
    c->u->u_in_conditional_block--;
1132
14.4k
}
1133
1134
int
1135
_PyCompile_AddDeferredAnnotation(compiler *c, stmt_ty s,
1136
                                 PyObject **conditional_annotation_index)
1137
12.0k
{
1138
12.0k
    if (c->u->u_deferred_annotations == NULL) {
1139
3.13k
        c->u->u_deferred_annotations = PyList_New(0);
1140
3.13k
        if (c->u->u_deferred_annotations == NULL) {
1141
0
            return ERROR;
1142
0
        }
1143
3.13k
    }
1144
12.0k
    if (c->u->u_conditional_annotation_indices == NULL) {
1145
3.13k
        c->u->u_conditional_annotation_indices = PyList_New(0);
1146
3.13k
        if (c->u->u_conditional_annotation_indices == NULL) {
1147
0
            return ERROR;
1148
0
        }
1149
3.13k
    }
1150
12.0k
    PyObject *ptr = PyLong_FromVoidPtr((void *)s);
1151
12.0k
    if (ptr == NULL) {
1152
0
        return ERROR;
1153
0
    }
1154
12.0k
    if (PyList_Append(c->u->u_deferred_annotations, ptr) < 0) {
1155
0
        Py_DECREF(ptr);
1156
0
        return ERROR;
1157
0
    }
1158
12.0k
    Py_DECREF(ptr);
1159
12.0k
    PyObject *index;
1160
12.0k
    if (c->u->u_scope_type == COMPILE_SCOPE_MODULE || c->u->u_in_conditional_block) {
1161
8.23k
        index = PyLong_FromLong(c->u->u_next_conditional_annotation_index);
1162
8.23k
        if (index == NULL) {
1163
0
            return ERROR;
1164
0
        }
1165
8.23k
        *conditional_annotation_index = Py_NewRef(index);
1166
8.23k
        c->u->u_next_conditional_annotation_index++;
1167
8.23k
    }
1168
3.77k
    else {
1169
3.77k
        index = PyLong_FromLong(-1);
1170
3.77k
        if (index == NULL) {
1171
0
            return ERROR;
1172
0
        }
1173
3.77k
    }
1174
12.0k
    int rc = PyList_Append(c->u->u_conditional_annotation_indices, index);
1175
12.0k
    Py_DECREF(index);
1176
12.0k
    RETURN_IF_ERROR(rc);
1177
12.0k
    return SUCCESS;
1178
12.0k
}
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
541
{
1186
541
    va_list vargs;
1187
541
    va_start(vargs, format);
1188
541
    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
1189
541
    va_end(vargs);
1190
541
    if (msg == NULL) {
1191
0
        return ERROR;
1192
0
    }
1193
541
    _PyErr_RaiseSyntaxError(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
1194
541
                            loc.end_lineno, loc.end_col_offset + 1);
1195
541
    Py_DECREF(msg);
1196
541
    return ERROR;
1197
541
}
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
21.6k
{
1206
21.6k
    va_list vargs;
1207
21.6k
    va_start(vargs, format);
1208
21.6k
    PyObject *msg = PyUnicode_FromFormatV(format, vargs);
1209
21.6k
    va_end(vargs);
1210
21.6k
    if (msg == NULL) {
1211
0
        return ERROR;
1212
0
    }
1213
21.6k
    int ret = _PyErr_EmitSyntaxWarning(msg, c->c_filename, loc.lineno, loc.col_offset + 1,
1214
21.6k
                                       loc.end_lineno, loc.end_col_offset + 1);
1215
21.6k
    Py_DECREF(msg);
1216
21.6k
    return ret;
1217
21.6k
}
1218
1219
PyObject *
1220
_PyCompile_Mangle(compiler *c, PyObject *name)
1221
11.9k
{
1222
11.9k
    return _Py_Mangle(c->u->u_private, name);
1223
11.9k
}
1224
1225
PyObject *
1226
_PyCompile_MaybeMangle(compiler *c, PyObject *name)
1227
853k
{
1228
853k
    return _Py_MaybeMangle(c->u->u_private, c->u->u_ste, name);
1229
853k
}
1230
1231
instr_sequence *
1232
_PyCompile_InstrSequence(compiler *c)
1233
7.38M
{
1234
7.38M
    return c->u->u_instr_sequence;
1235
7.38M
}
1236
1237
int
1238
_PyCompile_StartAnnotationSetup(struct _PyCompiler *c)
1239
930
{
1240
930
    instr_sequence *new_seq = (instr_sequence *)_PyInstructionSequence_New();
1241
930
    if (new_seq == NULL) {
1242
0
        return ERROR;
1243
0
    }
1244
930
    assert(c->u->u_stashed_instr_sequence == NULL);
1245
930
    c->u->u_stashed_instr_sequence = c->u->u_instr_sequence;
1246
930
    c->u->u_instr_sequence = new_seq;
1247
930
    return SUCCESS;
1248
930
}
1249
1250
int
1251
_PyCompile_EndAnnotationSetup(struct _PyCompiler *c)
1252
914
{
1253
914
    assert(c->u->u_stashed_instr_sequence != NULL);
1254
914
    instr_sequence *parent_seq = c->u->u_stashed_instr_sequence;
1255
914
    instr_sequence *anno_seq = c->u->u_instr_sequence;
1256
914
    c->u->u_stashed_instr_sequence = NULL;
1257
914
    c->u->u_instr_sequence = parent_seq;
1258
914
    if (_PyInstructionSequence_SetAnnotationsCode(parent_seq, anno_seq) == ERROR) {
1259
0
        Py_DECREF(anno_seq);
1260
0
        return ERROR;
1261
0
    }
1262
914
    return SUCCESS;
1263
914
}
1264
1265
1266
int
1267
_PyCompile_FutureFeatures(compiler *c)
1268
82.2k
{
1269
82.2k
    return c->c_future.ff_features;
1270
82.2k
}
1271
1272
struct symtable *
1273
_PyCompile_Symtable(compiler *c)
1274
19.9k
{
1275
19.9k
    return c->c_st;
1276
19.9k
}
1277
1278
PySTEntryObject *
1279
_PyCompile_SymtableEntry(compiler *c)
1280
1.34M
{
1281
1.34M
    return c->u->u_ste;
1282
1.34M
}
1283
1284
int
1285
_PyCompile_OptimizationLevel(compiler *c)
1286
5.71k
{
1287
5.71k
    return c->c_optimize;
1288
5.71k
}
1289
1290
int
1291
_PyCompile_IsInteractiveTopLevel(compiler *c)
1292
139k
{
1293
139k
    assert(c->c_stack != NULL);
1294
139k
    assert(PyList_CheckExact(c->c_stack));
1295
139k
    bool is_nested_scope = PyList_GET_SIZE(c->c_stack) > 0;
1296
139k
    return c->c_interactive && !is_nested_scope;
1297
139k
}
1298
1299
int
1300
_PyCompile_ScopeType(compiler *c)
1301
35.4k
{
1302
35.4k
    return c->u->u_scope_type;
1303
35.4k
}
1304
1305
int
1306
_PyCompile_IsInInlinedComp(compiler *c)
1307
59.3k
{
1308
59.3k
    return c->u->u_in_inlined_comp;
1309
59.3k
}
1310
1311
PyObject *
1312
_PyCompile_Qualname(compiler *c)
1313
15.7k
{
1314
15.7k
    assert(c->u->u_metadata.u_qualname);
1315
15.7k
    return c->u->u_metadata.u_qualname;
1316
15.7k
}
1317
1318
_PyCompile_CodeUnitMetadata *
1319
_PyCompile_Metadata(compiler *c)
1320
326k
{
1321
326k
    return &c->u->u_metadata;
1322
326k
}
1323
1324
// Merge *obj* with constant cache, without recursion.
1325
int
1326
_PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj)
1327
1.19M
{
1328
1.19M
    PyObject *key = const_cache_insert(const_cache, *obj, false);
1329
1.19M
    if (key == NULL) {
1330
0
        return ERROR;
1331
0
    }
1332
1.19M
    if (PyTuple_CheckExact(key)) {
1333
881k
        PyObject *item = PyTuple_GET_ITEM(key, 1);
1334
881k
        Py_SETREF(*obj, Py_NewRef(item));
1335
881k
        Py_DECREF(key);
1336
881k
    }
1337
312k
    else {
1338
312k
        Py_SETREF(*obj, key);
1339
312k
    }
1340
1.19M
    return SUCCESS;
1341
1.19M
}
1342
1343
static PyObject *
1344
consts_dict_keys_inorder(PyObject *dict)
1345
77.1k
{
1346
77.1k
    PyObject *consts, *k, *v;
1347
77.1k
    Py_ssize_t i, pos = 0, size = PyDict_GET_SIZE(dict);
1348
1349
77.1k
    consts = PyList_New(size);   /* PyCode_Optimize() requires a list */
1350
77.1k
    if (consts == NULL)
1351
0
        return NULL;
1352
454k
    while (PyDict_Next(dict, &pos, &k, &v)) {
1353
377k
        assert(PyLong_CheckExact(v));
1354
377k
        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
377k
        if (PyTuple_CheckExact(k)) {
1359
41.0k
            k = PyTuple_GET_ITEM(k, 1);
1360
41.0k
        }
1361
377k
        assert(i < size);
1362
377k
        assert(i >= 0);
1363
377k
        PyList_SET_ITEM(consts, i, Py_NewRef(k));
1364
377k
    }
1365
77.1k
    return consts;
1366
77.1k
}
1367
1368
static int
1369
compute_code_flags(compiler *c)
1370
77.1k
{
1371
77.1k
    PySTEntryObject *ste = c->u->u_ste;
1372
77.1k
    int flags = 0;
1373
77.1k
    if (_PyST_IsFunctionLike(ste)) {
1374
45.5k
        flags |= CO_NEWLOCALS | CO_OPTIMIZED;
1375
45.5k
        if (ste->ste_nested)
1376
19.1k
            flags |= CO_NESTED;
1377
45.5k
        if (ste->ste_generator && !ste->ste_coroutine)
1378
1.56k
            flags |= CO_GENERATOR;
1379
45.5k
        if (ste->ste_generator && ste->ste_coroutine)
1380
224
            flags |= CO_ASYNC_GENERATOR;
1381
45.5k
        if (ste->ste_varargs)
1382
4.17k
            flags |= CO_VARARGS;
1383
45.5k
        if (ste->ste_varkeywords)
1384
1.25k
            flags |= CO_VARKEYWORDS;
1385
45.5k
        if (ste->ste_has_docstring)
1386
825
            flags |= CO_HAS_DOCSTRING;
1387
45.5k
        if (ste->ste_method)
1388
210
            flags |= CO_METHOD;
1389
45.5k
    }
1390
1391
77.1k
    if (ste->ste_coroutine && !ste->ste_generator) {
1392
3.90k
        flags |= CO_COROUTINE;
1393
3.90k
    }
1394
1395
    /* (Only) inherit compilerflags in PyCF_MASK */
1396
77.1k
    flags |= (c->c_flags.cf_flags & PyCF_MASK);
1397
1398
77.1k
    return flags;
1399
77.1k
}
1400
1401
static PyCodeObject *
1402
optimize_and_assemble_code_unit(struct compiler_unit *u, PyObject *const_cache,
1403
                                int code_flags, PyObject *filename)
1404
77.1k
{
1405
77.1k
    cfg_builder *g = NULL;
1406
77.1k
    instr_sequence optimized_instrs;
1407
77.1k
    memset(&optimized_instrs, 0, sizeof(instr_sequence));
1408
1409
77.1k
    PyCodeObject *co = NULL;
1410
77.1k
    PyObject *consts = consts_dict_keys_inorder(u->u_metadata.u_consts);
1411
77.1k
    if (consts == NULL) {
1412
0
        goto error;
1413
0
    }
1414
77.1k
    g = _PyCfg_FromInstructionSequence(u->u_instr_sequence);
1415
77.1k
    if (g == NULL) {
1416
0
        goto error;
1417
0
    }
1418
77.1k
    int nlocals = (int)PyDict_GET_SIZE(u->u_metadata.u_varnames);
1419
77.1k
    int nparams = (int)PyList_GET_SIZE(u->u_ste->ste_varnames);
1420
77.1k
    assert(u->u_metadata.u_firstlineno);
1421
1422
77.1k
    if (_PyCfg_OptimizeCodeUnit(g, consts, const_cache, nlocals,
1423
77.1k
                                nparams, u->u_metadata.u_firstlineno) < 0) {
1424
0
        goto error;
1425
0
    }
1426
1427
77.1k
    int stackdepth;
1428
77.1k
    int nlocalsplus;
1429
77.1k
    if (_PyCfg_OptimizedCfgToInstructionSequence(g, &u->u_metadata, code_flags,
1430
77.1k
                                                 &stackdepth, &nlocalsplus,
1431
77.1k
                                                 &optimized_instrs) < 0) {
1432
0
        goto error;
1433
0
    }
1434
1435
    /** Assembly **/
1436
77.1k
    co = _PyAssemble_MakeCodeObject(&u->u_metadata, const_cache, consts,
1437
77.1k
                                    stackdepth, &optimized_instrs, nlocalsplus,
1438
77.1k
                                    code_flags, filename);
1439
1440
77.1k
error:
1441
77.1k
    Py_XDECREF(consts);
1442
77.1k
    PyInstructionSequence_Fini(&optimized_instrs);
1443
77.1k
    _PyCfgBuilder_Free(g);
1444
77.1k
    return co;
1445
77.1k
}
1446
1447
1448
PyCodeObject *
1449
_PyCompile_OptimizeAndAssemble(compiler *c, int addNone)
1450
77.1k
{
1451
77.1k
    struct compiler_unit *u = c->u;
1452
77.1k
    PyObject *const_cache = c->c_const_cache;
1453
77.1k
    PyObject *filename = c->c_filename;
1454
1455
77.1k
    int code_flags = compute_code_flags(c);
1456
77.1k
    if (code_flags < 0) {
1457
0
        return NULL;
1458
0
    }
1459
1460
77.1k
    if (_PyCodegen_AddReturnAtEnd(c, addNone) < 0) {
1461
0
        return NULL;
1462
0
    }
1463
1464
77.1k
    return optimize_and_assemble_code_unit(u, const_cache, code_flags, filename);
1465
77.1k
}
1466
1467
PyCodeObject *
1468
_PyAST_Compile(mod_ty mod, PyObject *filename, PyCompilerFlags *pflags,
1469
               int optimize, PyArena *arena)
1470
16.8k
{
1471
16.8k
    assert(!PyErr_Occurred());
1472
16.8k
    compiler *c = new_compiler(mod, filename, pflags, optimize, arena);
1473
16.8k
    if (c == NULL) {
1474
412
        return NULL;
1475
412
    }
1476
1477
16.3k
    PyCodeObject *co = compiler_mod(c, mod);
1478
16.3k
    compiler_free(c);
1479
16.3k
    assert(co || PyErr_Occurred());
1480
16.3k
    return co;
1481
16.3k
}
1482
1483
int
1484
_PyCompile_AstPreprocess(mod_ty mod, PyObject *filename, PyCompilerFlags *cf,
1485
                         int optimize, PyArena *arena, int no_const_folding)
1486
6
{
1487
6
    _PyFutureFeatures future;
1488
6
    if (!_PyFuture_FromAST(mod, filename, &future)) {
1489
0
        return -1;
1490
0
    }
1491
6
    int flags = future.ff_features | cf->cf_flags;
1492
6
    if (optimize == -1) {
1493
6
        optimize = _Py_GetConfig()->optimization_level;
1494
6
    }
1495
6
    if (!_PyAST_Preprocess(mod, arena, filename, optimize, flags, no_const_folding)) {
1496
0
        return -1;
1497
0
    }
1498
6
    return 0;
1499
6
}
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
1.91k
{
1508
1.91k
    doc = PyObject_CallMethod(doc, "expandtabs", NULL);
1509
1.91k
    if (doc == NULL) {
1510
0
        return NULL;
1511
0
    }
1512
1513
1.91k
    Py_ssize_t doc_size;
1514
1.91k
    const char *doc_utf8 = PyUnicode_AsUTF8AndSize(doc, &doc_size);
1515
1.91k
    if (doc_utf8 == NULL) {
1516
5
        Py_DECREF(doc);
1517
5
        return NULL;
1518
5
    }
1519
1.91k
    const char *p = doc_utf8;
1520
1.91k
    const char *pend = p + doc_size;
1521
1522
    // First pass: find minimum indentation of any non-blank lines
1523
    // after first line.
1524
42.0k
    while (p < pend && *p++ != '\n') {
1525
40.1k
    }
1526
1527
1.91k
    Py_ssize_t margin = PY_SSIZE_T_MAX;
1528
14.8k
    while (p < pend) {
1529
12.8k
        const char *s = p;
1530
17.0k
        while (*p == ' ') p++;
1531
12.8k
        if (p < pend && *p != '\n') {
1532
1.57k
            margin = Py_MIN(margin, p - s);
1533
1.57k
        }
1534
61.1k
        while (p < pend && *p++ != '\n') {
1535
48.3k
        }
1536
12.8k
    }
1537
1.91k
    if (margin == PY_SSIZE_T_MAX) {
1538
1.40k
        margin = 0;
1539
1.40k
    }
1540
1541
    // Second pass: write cleandoc into buff.
1542
1543
    // copy first line without leading spaces.
1544
1.91k
    p = doc_utf8;
1545
8.73k
    while (*p == ' ') {
1546
6.82k
        p++;
1547
6.82k
    }
1548
1.91k
    if (p == doc_utf8 && margin == 0 ) {
1549
        // doc is already clean.
1550
1.22k
        return doc;
1551
1.22k
    }
1552
1553
691
    char *buff = PyMem_Malloc(doc_size);
1554
691
    if (buff == NULL){
1555
0
        Py_DECREF(doc);
1556
0
        PyErr_NoMemory();
1557
0
        return NULL;
1558
0
    }
1559
1560
691
    char *w = buff;
1561
1562
25.9k
    while (p < pend) {
1563
25.5k
        int ch = *w++ = *p++;
1564
25.5k
        if (ch == '\n') {
1565
291
            break;
1566
291
        }
1567
25.5k
    }
1568
1569
    // copy subsequent lines without margin.
1570
2.31k
    while (p < pend) {
1571
3.50k
        for (Py_ssize_t i = 0; i < margin; i++, p++) {
1572
2.77k
            if (*p != ' ') {
1573
892
                assert(*p == '\n' || *p == '\0');
1574
892
                break;
1575
892
            }
1576
2.77k
        }
1577
19.3k
        while (p < pend) {
1578
19.0k
            int ch = *w++ = *p++;
1579
19.0k
            if (ch == '\n') {
1580
1.33k
                break;
1581
1.33k
            }
1582
19.0k
        }
1583
1.62k
    }
1584
1585
691
    Py_DECREF(doc);
1586
691
    PyObject *res = PyUnicode_FromStringAndSize(buff, w - buff);
1587
691
    PyMem_Free(buff);
1588
691
    return res;
1589
691
}
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
}