| 2037 | |
| 2038 | |
| 2039 | class 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): |
no outgoing calls
no test coverage detected
searching dependent graphs…