(self, sum, name)
| 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) |
| 554 | for a in sum.attributes: |
| 555 | self.visitAttributeDeclaration(a, name, sum=sum) |
| 556 | self.emit("", 0) |
| 557 | # XXX: should we only do this for 'expr'? |
| 558 | self.emit("if (obj == Py_None) {", 1) |
| 559 | self.emit("*out = NULL;", 2) |
| 560 | self.emit("return 0;", 2) |
| 561 | self.emit("}", 1) |
| 562 | for a in sum.attributes: |
| 563 | self.visitField(a, name, sum=sum, depth=1) |
| 564 | for t in sum.types: |
| 565 | self.emit("tp = state->%s_type;" % (t.name,), 1) |
| 566 | self.emit("isinstance = PyObject_IsInstance(obj, tp);", 1) |
| 567 | self.emit("if (isinstance == -1) {", 1) |
| 568 | self.emit("return -1;", 2) |
| 569 | self.emit("}", 1) |
| 570 | self.emit("if (isinstance) {", 1) |
| 571 | for f in t.fields: |
| 572 | self.visitFieldDeclaration(f, t.name, sum=sum, depth=2) |
| 573 | self.emit("", 0) |
| 574 | for f in t.fields: |
| 575 | self.visitField(f, t.name, sum=sum, depth=2) |
| 576 | args = [f.name for f in t.fields] + [a.name for a in sum.attributes] |
| 577 | self.emit("*out = %s(%s);" % (ast_func_name(t.name), self.buildArgs(args)), 2) |
| 578 | self.emit("if (*out == NULL) goto failed;", 2) |
| 579 | self.emit("return 0;", 2) |
| 580 | self.emit("}", 1) |
| 581 | self.sumTrailer(name, True) |
| 582 | |
| 583 | def visitAttributeDeclaration(self, a, name, sum=sum): |
| 584 | ctype = get_c_type(a.type) |
no test coverage detected