Skip to content

Commit 12a8296

Browse files
committed
Try to make tests pass on Microsoft C compiler
1 parent da49fbf commit 12a8296

File tree

4 files changed

+141
-99
lines changed

4 files changed

+141
-99
lines changed

Include/Python-ast.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Lib/test/test_ast.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,20 @@ def test_field_attr_writable(self):
390390
x = ast.Num()
391391
# We can assign to _fields
392392
x._fields = 666
393-
x._field_defaults = 999
393+
x._field_qualifiers = 999
394394
self.assertEqual(x._fields, 666)
395+
self.assertEqual(x._field_qualifiers, 999)
396+
397+
functiondef_qualifiers = ast.FunctionDef._field_qualifiers
398+
del ast.FunctionDef._field_qualifiers
399+
fnctdef = ast.FunctionDef("foo")
400+
self.assertEqual(fnctdef.name, "foo")
401+
with self.assertRaises(AttributeError):
402+
fnctdef.body
403+
ast.FunctionDef._field_qualifiers = (5,) * len(functiondef_qualifiers)
404+
with self.assertRaises(ValueError):
405+
ast.FunctionDef() # 5 as a field qualifier is an invalid value
406+
ast.FunctionDef._field_qualifiers = functiondef_qualifiers
395407

396408
def test_classattrs(self):
397409
x = ast.Num()

Parser/asdl_c.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ def visitModule(self, mod):
131131
for dfn in mod.dfns:
132132
self.visit(dfn)
133133
self.emit(
134-
"typedef enum _field_qualifier {SEQUENCE = 1, OPTIONAL = 2} "
134+
"typedef enum _field_qualifier {Q_SEQUENCE=1, Q_OPTIONAL=2} "
135135
"field_qualifier;", 0
136136
)
137137
def visitType(self, type, depth=0):
@@ -702,9 +702,9 @@ def _emit_field_qualifiers(self, name, fields, depth):
702702
self.emit("static const field_qualifier %s_field_qualifiers[]={" % name, depth)
703703
for field in fields:
704704
if field.seq:
705-
qualifier = "SEQUENCE"
705+
qualifier = "Q_SEQUENCE"
706706
elif field.opt:
707-
qualifier = "OPTIONAL"
707+
qualifier = "Q_OPTIONAL"
708708
else:
709709
qualifier = "0"
710710
self.emit("%s, // %s" % (qualifier, field.name), depth+1)
@@ -820,10 +820,15 @@ def visitModule(self, mod):
820820
}
821821
}
822822
if (_PyObject_LookupAttr(self, state->_field_qualifiers, &field_qualifiers) < 0) {
823+
res = -1;
824+
goto cleanup;
825+
}
826+
827+
if (!PyTuple_CheckExact(field_qualifiers) || PyTuple_Size(field_qualifiers) != numfields) {
823828
goto cleanup;
824829
}
825830
826-
PyObject *field, *field_qualifier, *field_default = NULL;
831+
PyObject *field, *field_qualifier;
827832
for (i = 0; i < numfields; i++) {
828833
field = PySequence_GetItem(fields, i);
829834
field_qualifier = PySequence_GetItem(field_qualifiers, i);
@@ -836,19 +841,29 @@ def visitModule(self, mod):
836841
goto next_iteration;
837842
}
838843
844+
PyObject *field_default = NULL;
839845
switch (PyLong_AsLong(field_qualifier)) {
840846
case -1:
841847
res = -1;
842848
goto next_iteration;
843849
case 0:
844850
goto next_iteration;
845-
case SEQUENCE:
851+
case Q_SEQUENCE:
846852
field_default = PyList_New(0);
853+
if (field_default == NULL) {
854+
res = -1;
855+
goto next_iteration;
856+
}
847857
break;
848-
case OPTIONAL:
858+
case Q_OPTIONAL:
849859
field_default = Py_None;
850860
Py_INCREF(field_default);
851861
break;
862+
default:
863+
PyErr_Format(PyExc_ValueError,
864+
"Unknown field qualifier: \\"%R\\"", field_qualifier);
865+
res = -1;
866+
goto next_iteration;
852867
}
853868
assert(field_default != NULL);
854869
res = PyObject_SetAttr(self, field, field_default);

0 commit comments

Comments
 (0)