8000 bpo-39981: Default values for AST nodes by isidentical · Pull Request #19031 · python/cpython · GitHub
[go: up one dir, main page]

Skip to content

bpo-39981: Default values for AST nodes #19031

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

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
Prev Previous commit
Next Next commit
Do proper cleanups, increase reference of None, format switch
  • Loading branch information
isidentical committed Mar 18, 2020
commit 43fe55a4dc1f52c5667e1893920863417ea15b8d
62 changes: 30 additions & 32 deletions Parser/asdl_c.py
Original file line number Diff line number Diff line change
Expand Up @@ -691,23 +691,18 @@ def visitModule(self, mod):
static inline PyObject *
find_field_default(PyObject *field_default)
{
PyObject *ret = NULL;
if (PyUnicode_GET_LENGTH(field_default) < 1) {
goto result;
return NULL;
}
switch (PyUnicode_READ_CHAR(field_default, 0)){
case '?':
ret = Py_None;
goto result;
case '*':
ret = PyList_New(0);
goto result;
default:
goto result;
case '?':
Py_INCREF(Py_None);
return Py_None;
case '*':
return PyList_New(0);
default:
return NULL;
}
result:
Py_DECREF(field_default);
return ret;
}

static int
Expand All @@ -716,10 +711,10 @@ def visitModule(self, mod):
Py_ssize_t i, numfields = 0;
int res = -1;
PyObject *key, *value, *fields, *field_defaults;
if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), astmodulestate_global->_fields, &fields) < 0) {
if (_PyObject_LookupAttr(Py_TYPE(self), astmodulestate_global->_fields, &fields) < 0) {
goto cleanup;
}
if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), astmodulestate_global->_field_defaults, &field_defaults) < 0) {
if (_PyObject_LookupAttr(Py_TYPE(self), astmodulestate_global->_field_defaults, &field_defaults) < 0) {
goto cleanup;
}
if (fields) {
Expand Down Expand Up @@ -757,7 +752,7 @@ def visitModule(self, mod):
goto cleanup;
}
}
PyObject *field, *field_default;
PyObject *field, *raw_field_default, *field_default;
for (i = 0; i < numfields; i++) {
field = PySequence_GetItem(fields, i);
if (!field) {
Expand All @@ -767,16 +762,18 @@ def visitModule(self, mod):
int attr_present = PyObject_HasAttr(self, field);
Py_DECREF(field);
if (!attr_present) {
field_default = PySequence_GetItem(field_defaults, i);
if (!field_default) {
raw_field_default = PySequence_GetItem(field_defaults, i);
if (!raw_field_default) {
res = -1;
goto cleanup;
}
if (!(field_default = find_field_default(field_default))) {
field_default = find_field_default(raw_field_default);
Py_DECREF(raw_field_default);
if (!field_default) {
continue;
}
res = PyObject_SetAttr(self, field, field_default);
Py_XDECREF(field_default);
Py_DECREF(field_default);
if (res < 0) {
goto cleanup;
}
Expand Down Expand Up @@ -847,29 +844,31 @@ def visitModule(self, mod):
PyObject* base,
const char* const* fields,
const char* const* field_defaults,
int num_fields,
Py_ssize_t num_fields,
const char *doc
)
{
PyObject *fnames, *fdefaults, *result;
int i;
Py_ssize_t i;
PyObject *fnames, *fdefaults;
PyObject *result = NULL;

fnames = PyTuple_New(num_fields);
if (!fnames) {
return NULL;
goto exit;
}
fdefaults = PyTuple_New(num_fields);
if (!fdefaults) {
return NULL;
goto exit;
}
for (i = 0; i < num_fields; i++) {
PyObject *field = PyUnicode_InternFromString(fields[i]);
if (!field) {
goto cleanup;
goto exit;
}
PyTuple_SET_ITEM(fnames, i, field);
PyObject *field_default = PyUnicode_InternFromString(field_defaults[i]);
if (!field_default) {
goto cleanup;
goto exit;
}
PyTuple_SET_ITEM(fdefaults, i, field_default);
}
Expand All @@ -881,12 +880,11 @@ def visitModule(self, mod):
astmodulestate_global->__module__,
astmodulestate_global->_ast,
astmodulestate_global->__doc__, doc);
Py_DECREF(fnames);
goto exit;
exit:
Py_XDECREF(fnames);
Py_XDECREF(fdefaults);
return result;
cleanup:
Py_DECREF(fnames);
Py_DECREF(fdefaults);
return NULL;
}

static int
Expand Down
64 changes: 31 additions & 33 deletions Python/Python-ast.c

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0