MCPcopy Index your code
hub / github.com/python/cpython / visitField

Method visitField

Parser/asdl_c.py:637–717  ·  view source on GitHub ↗
(self, field, name, sum=None, prod=None, depth=0)

Source from the content-addressed store, hash-verified

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)

Callers 2

complexSumMethod · 0.95
visitProductMethod · 0.95

Calls 5

isNumericMethod · 0.95
isSimpleTypeMethod · 0.95
recursive_callMethod · 0.95
get_c_typeFunction · 0.85
emitMethod · 0.45

Tested by

no test coverage detected