OLD | NEW |
1 #! /usr/bin/env python | 1 #! /usr/bin/env python |
2 """Generate C code from an ASDL description.""" | 2 """Generate C code from an ASDL description.""" |
3 | 3 |
4 # TO DO | 4 # TO DO |
5 # handle fields that have a type but no name | 5 # handle fields that have a type but no name |
6 | 6 |
7 import os, sys | 7 import os, sys |
8 import subprocess | 8 import subprocess |
9 | 9 |
10 import asdl | 10 import asdl |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
285 argstr = ", ".join(["%s %s" % (atype, aname) | 285 argstr = ", ".join(["%s %s" % (atype, aname) |
286 for atype, aname, opt in args + attrs]) | 286 for atype, aname, opt in args + attrs]) |
287 if argstr: | 287 if argstr: |
288 argstr += ", PyArena *arena" | 288 argstr += ", PyArena *arena" |
289 else: | 289 else: |
290 argstr = "PyArena *arena" | 290 argstr = "PyArena *arena" |
291 self.emit("%s" % ctype, 0) | 291 self.emit("%s" % ctype, 0) |
292 emit("%s(%s)" % (name, argstr)) | 292 emit("%s(%s)" % (name, argstr)) |
293 emit("{") | 293 emit("{") |
294 emit("%s p;" % ctype, 1) | 294 emit("%s p;" % ctype, 1) |
| 295 # XXX: special hack for Lit. Lit value can be None and it |
| 296 # should be stored as Py_None, not as NULL. |
| 297 if name.value == 'Lit': |
| 298 emit('if (!v) v = Py_None;', 1) |
295 for argtype, argname, opt in args: | 299 for argtype, argname, opt in args: |
296 if not opt and argtype != "int": | 300 if not opt and argtype != "int": |
297 emit("if (!%s) {" % argname, 1) | 301 emit("if (!%s) {" % argname, 1) |
298 emit("PyErr_SetString(PyExc_ValueError,", 2) | 302 emit("PyErr_SetString(PyExc_ValueError,", 2) |
299 msg = "field %s is required for %s" % (argname, name) | 303 msg = "field %s is required for %s" % (argname, name) |
300 emit(' "%s");' % msg, | 304 emit(' "%s");' % msg, |
301 2, reflow=False) | 305 2, reflow=False) |
302 emit('return NULL;', 2) | 306 emit('return NULL;', 2) |
303 emit('}', 1) | 307 emit('}', 1) |
304 | 308 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 self.emit("if (tmp == NULL) goto failed;", depth+1) | 499 self.emit("if (tmp == NULL) goto failed;", depth+1) |
496 if field.seq: | 500 if field.seq: |
497 self.emit("if (!PyList_Check(tmp)) {", depth+1) | 501 self.emit("if (!PyList_Check(tmp)) {", depth+1) |
498 self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must
" | 502 self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must
" |
499 "be a list, not a %%.200s\", tmp->ob_type->tp_name);" % | 503 "be a list, not a %%.200s\", tmp->ob_type->tp_name);" % |
500 (name, field.name), | 504 (name, field.name), |
501 depth+2, reflow=False) | 505 depth+2, reflow=False) |
502 self.emit("goto failed;", depth+2) | 506 self.emit("goto failed;", depth+2) |
503 self.emit("}", depth+1) | 507 self.emit("}", depth+1) |
504 self.emit("len = PyList_GET_SIZE(tmp);", depth+1) | 508 self.emit("len = PyList_GET_SIZE(tmp);", depth+1) |
| 509 self.emit("if (len == 0)", depth+1) |
| 510 self.emit("%s = NULL;" % field.name, depth+2) |
| 511 self.emit("else {", depth+1) |
505 if self.isSimpleType(field): | 512 if self.isSimpleType(field): |
506 self.emit("%s = asdl_int_seq_new(len, arena);" % field.name, dep
th+1) | 513 self.emit("%s = asdl_int_seq_new(len, arena);" % field.name, dep
th+2) |
507 else: | 514 else: |
508 self.emit("%s = asdl_seq_new(len, arena);" % field.name, depth+1
) | 515 self.emit("%s = asdl_seq_new(len, arena);" % field.name, depth+2
) |
509 self.emit("if (%s == NULL) goto failed;" % field.name, depth+1) | 516 self.emit("if (%s == NULL) goto failed;" % field.name, depth+2) |
510 self.emit("for (i = 0; i < len; i++) {", depth+1) | 517 self.emit("for (i = 0; i < len; i++) {", depth+2) |
511 self.emit("%s value;" % ctype, depth+2) | 518 self.emit("%s value;" % ctype, depth+3) |
512 self.emit("res = obj2ast_%s(PyList_GET_ITEM(tmp, i), &value, arena);
" % | 519 self.emit("res = obj2ast_%s(PyList_GET_ITEM(tmp, i), &value, arena);
" % |
513 field.type, depth+2, reflow=False) | 520 field.type, depth+3, reflow=False) |
514 self.emit("if (res != 0) goto failed;", depth+2) | 521 self.emit("if (res != 0) goto failed;", depth+3) |
515 self.emit("asdl_seq_SET(%s, i, value);" % field.name, depth+2) | 522 self.emit("asdl_seq_SET(%s, i, value);" % field.name, depth+3) |
| 523 self.emit("}", depth+2) |
516 self.emit("}", depth+1) | 524 self.emit("}", depth+1) |
517 else: | 525 else: |
518 self.emit("res = obj2ast_%s(tmp, &%s, arena);" % | 526 self.emit("res = obj2ast_%s(tmp, &%s, arena);" % |
519 (field.type, field.name), depth+1) | 527 (field.type, field.name), depth+1) |
520 self.emit("if (res != 0) goto failed;", depth+1) | 528 self.emit("if (res != 0) goto failed;", depth+1) |
521 | 529 |
522 self.emit("Py_XDECREF(tmp);", depth+1) | 530 self.emit("Py_XDECREF(tmp);", depth+1) |
523 self.emit("tmp = NULL;", depth+1) | 531 self.emit("tmp = NULL;", depth+1) |
524 self.emit("} else {", depth) | 532 self.emit("} else {", depth) |
525 if not field.opt: | 533 if not field.opt: |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1205 sys.exit(1) | 1213 sys.exit(1) |
1206 for o, v in opts: | 1214 for o, v in opts: |
1207 if o == '-h': | 1215 if o == '-h': |
1208 INC_DIR = v | 1216 INC_DIR = v |
1209 if o == '-c': | 1217 if o == '-c': |
1210 SRC_DIR = v | 1218 SRC_DIR = v |
1211 if len(args) != 1: | 1219 if len(args) != 1: |
1212 sys.stdout.write("Must specify single input file\n") | 1220 sys.stdout.write("Must specify single input file\n") |
1213 sys.exit(1) | 1221 sys.exit(1) |
1214 main(args[0]) | 1222 main(args[0]) |
OLD | NEW |