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

Class ObjVisitor

Parser/asdl_c.py:2039–2156  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2037
2038
2039class ObjVisitor(PickleVisitor):
2040
2041 def func_begin(self, name):
2042 ctype = get_c_type(name)
2043 self.emit("PyObject*", 0)
2044 self.emit("ast2obj_%s(struct ast_state *state, void* _o)" % (name), 0)
2045 self.emit("{", 0)
2046 self.emit("%s o = (%s)_o;" % (ctype, ctype), 1)
2047 self.emit("PyObject *result = NULL, *value = NULL;", 1)
2048 self.emit("PyTypeObject *tp;", 1)
2049 self.emit('if (!o) {', 1)
2050 self.emit("Py_RETURN_NONE;", 2)
2051 self.emit("}", 1)
2052 self.emit('if (Py_EnterRecursiveCall("during ast construction")) {', 1)
2053 self.emit("return NULL;", 2)
2054 self.emit("}", 1)
2055
2056 def func_end(self):
2057 self.emit("Py_LeaveRecursiveCall();", 1)
2058 self.emit("return result;", 1)
2059 self.emit("failed:", 0)
2060 self.emit("Py_LeaveRecursiveCall();", 1)
2061 self.emit("Py_XDECREF(value);", 1)
2062 self.emit("Py_XDECREF(result);", 1)
2063 self.emit("return NULL;", 1)
2064 self.emit("}", 0)
2065 self.emit("", 0)
2066
2067 def visitSum(self, sum, name):
2068 if is_simple(sum):
2069 self.simpleSum(sum, name)
2070 return
2071 self.func_begin(name)
2072 self.emit("switch (o->kind) {", 1)
2073 for i in range(len(sum.types)):
2074 t = sum.types[i]
2075 self.visitConstructor(t, i + 1, name)
2076 self.emit("}", 1)
2077 for a in sum.attributes:
2078 self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1)
2079 self.emit("if (!value) goto failed;", 1)
2080 self.emit('if (PyObject_SetAttr(result, state->%s, value) < 0)' % a.name, 1)
2081 self.emit('goto failed;', 2)
2082 self.emit('Py_DECREF(value);', 1)
2083 self.func_end()
2084
2085 def simpleSum(self, sum, name):
2086 self.emit("PyObject* ast2obj_%s(struct ast_state *state, %s_ty o)" % (name, name), 0)
2087 self.emit("{", 0)
2088 self.emit("switch(o) {", 1)
2089 for t in sum.types:
2090 self.emit("case %s:" % t.name, 2)
2091 self.emit("return Py_NewRef(state->%s_singleton);" % t.name, 3)
2092 self.emit("}", 1)
2093 self.emit("Py_UNREACHABLE();", 1);
2094 self.emit("}", 0)
2095
2096 def visitProduct(self, prod, name):

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…