Skip to content

bpo-43950: optimize column table assembling with pre-sizing the column table #26997

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 2, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 13 additions & 6 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
#define DEFAULT_BLOCKS 8
#define DEFAULT_CODE_SIZE 128
#define DEFAULT_LNOTAB_SIZE 16
#define DEFAULT_CNOTAB_SIZE 0
#define DEFAULT_CNOTAB_SIZE 32

#define COMP_GENEXP 0
#define COMP_LISTCOMP 1
Expand Down Expand Up @@ -6587,6 +6587,7 @@ struct assembler {
PyObject* a_cnotab; /* bytes containing cnotab */
int a_lnotab_off; /* offset into lnotab */
int a_enotab_off; /* offset into enotab */
int a_cnotab_off; /* offset into cnotab */
PyObject *a_except_table; /* bytes containing exception table */
int a_except_table_off; /* offset into exception table */
int a_prevlineno; /* lineno of last emitted line in line table */
Expand Down Expand Up @@ -6696,6 +6697,7 @@ assemble_init(struct assembler *a, int nblocks, int firstlineno)
a->a_lnotab = NULL;
a->a_enotab = NULL;
a->a_cnotab = NULL;
a->a_cnotab_off = 0;
a->a_except_table = NULL;
a->a_bytecode = PyBytes_FromStringAndSize(NULL, DEFAULT_CODE_SIZE);
if (a->a_bytecode == NULL) {
Expand Down Expand Up @@ -7106,14 +7108,16 @@ static int
assemble_cnotab(struct assembler* a, struct instr* i, int instr_size)
{
Py_ssize_t len = PyBytes_GET_SIZE(a->a_cnotab);
// TODO: Allocate more memory than just what we immediately need
// like a_lnotab does.
if (_PyBytes_Resize(&a->a_cnotab, len + (instr_size * 2)) < 0) {
return 0;
int difference = instr_size * 2;
if (a->a_cnotab_off + difference >= len) {
if (_PyBytes_Resize(&a->a_cnotab, difference + (len * 2)) < 0) {
return 0;
}
}

unsigned char* cnotab = (unsigned char*)PyBytes_AS_STRING(a->a_cnotab);
cnotab += len;
cnotab += a->a_cnotab_off;
a->a_cnotab_off += difference;

for (int j = 0; j < instr_size; j++) {
if (i->i_col_offset > 255 || i->i_end_col_offset > 255) {
Expand Down Expand Up @@ -7855,6 +7859,9 @@ assemble(struct compiler *c, int addNone)
if (!merge_const_one(c, &a.a_enotab)) {
goto error;
}
if (_PyBytes_Resize(&a.a_cnotab, a.a_cnotab_off) < 0) {
goto error;
}
if (_PyBytes_Resize(&a.a_bytecode, a.a_offset * sizeof(_Py_CODEUNIT)) < 0) {
goto error;
}
Expand Down