| 494 | |
| 495 | |
| 496 | class 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) |
no outgoing calls
no test coverage detected
searching dependent graphs…