@@ -691,23 +691,18 @@ def visitModule(self, mod):
691
691
static inline PyObject *
692
692
find_field_default(PyObject *field_default)
693
693
{
694
- PyObject *ret = NULL;
695
694
if (PyUnicode_GET_LENGTH(field_default) < 1) {
696
- goto result ;
695
+ return NULL ;
697
696
}
698
697
switch (PyUnicode_READ_CHAR(field_default, 0)){
699
- case '?':
700
- ret = Py_None;
701
- goto result;
702
- case '*':
703
- ret = PyList_New(0);
704
- goto result;
705
- default:
706
- goto result;
698
+ case '?':
699
+ Py_INCREF(Py_None);
700
+ return Py_None;
701
+ case '*':
702
+ return PyList_New(0);
703
+ default:
704
+ return NULL;
707
705
}
708
- result:
709
- Py_DECREF(field_default);
710
- return ret;
711
706
}
712
707
713
708
static int
@@ -716,10 +711,10 @@ def visitModule(self, mod):
716
711
Py_ssize_t i, numfields = 0;
717
712
int res = -1;
718
713
PyObject *key, *value, *fields, *field_defaults;
719
- if (_PyObject_LookupAttr((PyObject*) Py_TYPE(self), astmodulestate_global->_fields, &fields) < 0) {
714
+ if (_PyObject_LookupAttr(Py_TYPE(self), astmodulestate_global->_fields, &fields) < 0) {
720
715
goto cleanup;
721
716
}
722
- if (_PyObject_LookupAttr((PyObject*) Py_TYPE(self), astmodulestate_global->_field_defaults, &field_defaults) < 0) {
717
+ if (_PyObject_LookupAttr(Py_TYPE(self), astmodulestate_global->_field_defaults, &field_defaults) < 0) {
723
718
goto cleanup;
724
719
}
725
720
if (fields) {
@@ -757,7 +752,7 @@ def visitModule(self, mod):
757
752
goto cleanup;
758
753
}
759
754
}
760
- PyObject *field, *field_default;
755
+ PyObject *field, *raw_field_default, * field_default;
761
756
for (i = 0; i < numfields; i++) {
762
757
field = PySequence_GetItem(fields, i);
763
758
if (!field) {
@@ -767,16 +762,18 @@ def visitModule(self, mod):
767
762
int attr_present = PyObject_HasAttr(self, field);
768
763
Py_DECREF(field);
769
764
if (!attr_present) {
770
- field_default = PySequence_GetItem(field_defaults, i);
771
- if (!field_default ) {
765
+ raw_field_default = PySequence_GetItem(field_defaults, i);
766
+ if (!raw_field_default ) {
772
767
res = -1;
773
768
goto cleanup;
774
769
}
775
- if (!(field_default = find_field_default(field_default))) {
770
+ field_default = find_field_default(raw_field_default);
771
+ Py_DECREF(raw_field_default);
772
+ if (!field_default) {
776
773
continue;
777
774
}
778
775
res = PyObject_SetAttr(self, field, field_default);
779
- Py_XDECREF (field_default);
776
+ Py_DECREF (field_default);
780
777
if (res < 0) {
781
778
goto cleanup;
782
779
}
@@ -847,29 +844,31 @@ def visitModule(self, mod):
847
844
PyObject* base,
848
845
const char* const* fields,
849
846
const char* const* field_defaults,
850
- int num_fields,
847
+ Py_ssize_t num_fields,
851
848
const char *doc
852
849
)
853
850
{
854
- PyObject *fnames, *fdefaults, *result;
855
- int i;
851
+ Py_ssize_t i;
852
+ PyObject *fnames, *fdefaults;
853
+ PyObject *result = NULL;
854
+
856
855
fnames = PyTuple_New(num_fields);
857
856
if (!fnames) {
858
- return NULL ;
857
+ goto exit ;
859
858
}
860
859
fdefaults = PyTuple_New(num_fields);
861
860
if (!fdefaults) {
862
- return NULL ;
861
+ goto exit ;
863
862
}
864
863
for (i = 0; i < num_fields; i++) {
865
864
PyObject *field = PyUnicode_InternFromString(fields[i]);
866
865
if (!field) {
867
- goto cleanup ;
866
+ goto exit ;
868
867
}
869
868
PyTuple_SET_ITEM(fnames, i, field);
870
869
PyObject *field_default = PyUnicode_InternFromString(field_defaults[i]);
871
870
if (!field_default) {
872
- goto cleanup ;
871
+ goto exit ;
873
872
}
874
873
PyTuple_SET_ITEM(fdefaults, i, field_default);
875
874
}
@@ -881,12 +880,11 @@ def visitModule(self, mod):
881
880
astmodulestate_global->__module__,
882
881
astmodulestate_global->_ast,
883
882
astmodulestate_global->__doc__, doc);
884
- Py_DECREF(fnames);
883
+ goto exit;
884
+ exit:
885
+ Py_XDECREF(fnames);
886
+ Py_XDECREF(fdefaults);
885
887
return result;
886
- cleanup:
887
- Py_DECREF(fnames);
888
- Py_DECREF(fdefaults);
889
- return NULL;
890
888
}
891
889
892
890
static int
0 commit comments