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

Class Obj2ModVisitor

Parser/asdl_c.py:496–717  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

494
495
496class Obj2ModVisitor(PickleVisitor):
497
498 attribute_special_defaults = {
499 "end_lineno": "lineno",
500 "end_col_offset": "col_offset",
501 }
502
503 @contextmanager
504 def recursive_call(self, node, level):
505 self.emit('if (_Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False)
506 self.emit('goto failed;', level + 1)
507 self.emit('}', level)
508 yield
509 self.emit('_Py_LeaveRecursiveCall();', level)
510
511 def funcHeader(self, name):
512 ctype = get_c_type(name)
513 self.emit("int", 0)
514 self.emit("obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
515 self.emit("{", 0)
516 self.emit("int isinstance;", 1)
517 self.emit("", 0)
518
519 def sumTrailer(self, name, add_label=False):
520 self.emit("", 0)
521 # there's really nothing more we can do if this fails ...
522 error = "expected some sort of %s, but got %%R" % name
523 format = "PyErr_Format(PyExc_TypeError, \"%s\", obj);"
524 self.emit(format % error, 1, reflow=False)
525 if add_label:
526 self.emit("failed:", 1)
527 self.emit("Py_XDECREF(tmp);", 1)
528 self.emit("return -1;", 1)
529 self.emit("}", 0)
530 self.emit("", 0)
531
532 def simpleSum(self, sum, name):
533 self.funcHeader(name)
534 for t in sum.types:
535 line = ("isinstance = PyObject_IsInstance(obj, "
536 "state->%s_type);")
537 self.emit(line % (t.name,), 1)
538 self.emit("if (isinstance == -1) {", 1)
539 self.emit("return -1;", 2)
540 self.emit("}", 1)
541 self.emit("if (isinstance) {", 1)
542 self.emit("*out = %s;" % t.name, 2)
543 self.emit("return 0;", 2)
544 self.emit("}", 1)
545 self.sumTrailer(name)
546
547 def buildArgs(self, fields):
548 return ", ".join(fields + ["arena"])
549
550 def complexSum(self, sum, name):
551 self.funcHeader(name)
552 self.emit("PyObject *tmp = NULL;", 1)
553 self.emit("PyObject *tp;", 1)

Callers 1

write_sourceFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…