Skip to content

Commit 6547576

Browse files
committed
add .generic_base to bases in AST so compiler doesn't need to do it
1 parent 031c697 commit 6547576

File tree

4 files changed

+25
-28
lines changed

4 files changed

+25
-28
lines changed

Include/internal/pycore_compile.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,6 @@ int _PyCompile_IsNestedScope(struct _PyCompiler *c);
136136
int _PyCompile_IsInInlinedComp(struct _PyCompiler *c);
137137
int _PyCompile_ScopeType(struct _PyCompiler *c);
138138
int _PyCompile_OptimizationLevel(struct _PyCompiler *c);
139-
PyArena *_PyCompile_Arena(struct _PyCompiler *c);
140139
int _PyCompile_LookupArg(struct _PyCompiler *c, PyCodeObject *co, PyObject *name);
141140
PyObject *_PyCompile_Qualname(struct _PyCompiler *c);
142141
_PyCompile_CodeUnitMetadata *_PyCompile_Metadata(struct _PyCompiler *c);

Parser/action_helpers.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,30 @@ _PyPegen_class_def(expr_ty a, arguments_ty b, asdl_stmt_seq *c, asdl_type_param_
758758
asdl_stmt_seq *body = c;
759759
asdl_expr_seq *decorator_list = NULL;
760760
asdl_type_param_seq *type_params = t;
761+
762+
int is_generic = asdl_seq_LEN(type_params) > 0;
763+
if (is_generic) {
764+
/* Add */
765+
asdl_expr_seq *orig_bases = bases;
766+
Py_ssize_t orig_len = asdl_seq_LEN(orig_bases);
767+
bases = _Py_asdl_expr_seq_new(orig_len + 1, arena);
768+
if (bases == NULL) {
769+
return NULL;
770+
}
771+
for (Py_ssize_t i = 0; i < orig_len; i++) {
772+
asdl_seq_SET(bases, i, asdl_seq_GET(orig_bases, i));
773+
}
774+
_Py_DECLARE_STR(generic_base, ".generic_base");
775+
expr_ty name_node = _PyAST_Name(
776+
&_Py_STR(generic_base), Load,
777+
lineno, col_offset, end_lineno, end_col_offset, arena
778+
);
779+
if (name_node == NULL) {
780+
return NULL;
781+
}
782+
asdl_seq_SET(bases, orig_len, name_node);
783+
}
784+
761785
return _PyAST_ClassDef(name, bases, keywords, body, decorator_list, type_params,
762786
lineno, col_offset, end_lineno, end_col_offset, arena);
763787
}

Python/codegen.c

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ typedef struct _PyCompiler compiler;
7676
#define SCOPE_TYPE(C) _PyCompile_ScopeType(C)
7777
#define QUALNAME(C) _PyCompile_Qualname(C)
7878
#define METADATA(C) _PyCompile_Metadata(C)
79-
#define ARENA(C) _PyCompile_Arena(C)
8079

8180
typedef _PyInstruction instruction;
8281
typedef _PyInstructionSequence instr_sequence;
@@ -1549,27 +1548,8 @@ codegen_class(compiler *c, stmt_ty s)
15491548
ADDOP_I_IN_SCOPE(c, loc, CALL_INTRINSIC_1, INTRINSIC_SUBSCRIPT_GENERIC);
15501549
RETURN_IF_ERROR_IN_SCOPE(c, codegen_nameop(c, loc, &_Py_STR(generic_base), Store));
15511550

1552-
Py_ssize_t original_len = asdl_seq_LEN(s->v.ClassDef.bases);
1553-
asdl_expr_seq *bases = _Py_asdl_expr_seq_new(
1554-
original_len + 1, ARENA(c));
1555-
if (bases == NULL) {
1556-
_PyCompile_ExitScope(c);
1557-
return ERROR;
1558-
}
1559-
for (Py_ssize_t i = 0; i < original_len; i++) {
1560-
asdl_seq_SET(bases, i, asdl_seq_GET(s->v.ClassDef.bases, i));
1561-
}
1562-
expr_ty name_node = _PyAST_Name(
1563-
&_Py_STR(generic_base), Load,
1564-
loc.lineno, loc.col_offset, loc.end_lineno, loc.end_col_offset, ARENA(c)
1565-
);
1566-
if (name_node == NULL) {
1567-
_PyCompile_ExitScope(c);
1568-
return ERROR;
1569-
}
1570-
asdl_seq_SET(bases, original_len, name_node);
15711551
RETURN_IF_ERROR_IN_SCOPE(c, codegen_call_helper(c, loc, 2,
1572-
bases,
1552+
s->v.ClassDef.bases,
15731553
s->v.ClassDef.keywords));
15741554

15751555
PyCodeObject *co = _PyCompile_OptimizeAndAssemble(c, 0);

Python/compile.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1244,12 +1244,6 @@ _PyCompile_Metadata(compiler *c)
12441244
return &c->u->u_metadata;
12451245
}
12461246

1247-
PyArena *
1248-
_PyCompile_Arena(compiler *c)
1249-
{
1250-
return c->c_arena;
1251-
}
1252-
12531247
#ifndef NDEBUG
12541248
int
12551249
_PyCompile_IsTopLevelAwait(compiler *c)

0 commit comments

Comments
 (0)