(self, field, name, sum=None, prod=None, depth=0)
| 635 | return field.type in self.metadata.simple_sums or self.isNumeric(field) |
| 636 | |
| 637 | def visitField(self, field, name, sum=None, prod=None, depth=0): |
| 638 | ctype = get_c_type(field.type) |
| 639 | line = "if (PyObject_GetOptionalAttr(obj, state->%s, &tmp) < 0) {" |
| 640 | self.emit(line % field.name, depth) |
| 641 | self.emit("return -1;", depth+1) |
| 642 | self.emit("}", depth) |
| 643 | if field.seq: |
| 644 | self.emit("if (tmp == NULL) {", depth) |
| 645 | self.emit("tmp = PyList_New(0);", depth+1) |
| 646 | self.emit("if (tmp == NULL) {", depth+1) |
| 647 | self.emit("return -1;", depth+2) |
| 648 | self.emit("}", depth+1) |
| 649 | self.emit("}", depth) |
| 650 | self.emit("{", depth) |
| 651 | else: |
| 652 | if not field.opt: |
| 653 | self.emit("if (tmp == NULL) {", depth) |
| 654 | message = "required field \\\"%s\\\" missing from %s" % (field.name, name) |
| 655 | format = "PyErr_SetString(PyExc_TypeError, \"%s\");" |
| 656 | self.emit(format % message, depth+1, reflow=False) |
| 657 | self.emit("return -1;", depth+1) |
| 658 | else: |
| 659 | self.emit("if (tmp == NULL || tmp == Py_None) {", depth) |
| 660 | self.emit("Py_CLEAR(tmp);", depth+1) |
| 661 | if self.isNumeric(field): |
| 662 | if field.name in self.attribute_special_defaults: |
| 663 | self.emit( |
| 664 | "%s = %s;" % (field.name, self.attribute_special_defaults[field.name]), |
| 665 | depth+1, |
| 666 | ) |
| 667 | else: |
| 668 | self.emit("%s = 0;" % field.name, depth+1) |
| 669 | elif not self.isSimpleType(field): |
| 670 | self.emit("%s = NULL;" % field.name, depth+1) |
| 671 | else: |
| 672 | raise TypeError("could not determine the default value for %s" % field.name) |
| 673 | self.emit("}", depth) |
| 674 | self.emit("else {", depth) |
| 675 | |
| 676 | self.emit("int res;", depth+1) |
| 677 | if field.seq: |
| 678 | self.emit("Py_ssize_t len;", depth+1) |
| 679 | self.emit("Py_ssize_t i;", depth+1) |
| 680 | self.emit("if (!PyList_Check(tmp)) {", depth+1) |
| 681 | self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must " |
| 682 | "be a list, not a %%.200s\", _PyType_Name(Py_TYPE(tmp)));" % |
| 683 | (name, field.name), |
| 684 | depth+2, reflow=False) |
| 685 | self.emit("goto failed;", depth+2) |
| 686 | self.emit("}", depth+1) |
| 687 | self.emit("len = PyList_GET_SIZE(tmp);", depth+1) |
| 688 | if self.isSimpleType(field): |
| 689 | self.emit("%s = _Py_asdl_int_seq_new(len, arena);" % field.name, depth+1) |
| 690 | else: |
| 691 | self.emit("%s = _Py_asdl_%s_seq_new(len, arena);" % (field.name, field.type), depth+1) |
| 692 | self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) |
| 693 | self.emit("for (i = 0; i < len; i++) {", depth+1) |
| 694 | self.emit("%s val;" % ctype, depth+2) |
no test coverage detected