Lines Matching refs:self

108     def __init__(self, file, metadata = None):
109 self.file = file
110 self._metadata = metadata
111 super(EmitVisitor, self).__init__()
113 def emit(self, s, depth, reflow=True):
122 self.file.write(line + "\n")
125 def metadata(self):
126 if self._metadata is None:
129 % type(self).__name__
131 return self._metadata
134 def metadata(self, value):
135 self._metadata = value
140 def __init__(self, *args, **kwargs):
153 self.metadata = types.SimpleNamespace(
157 types={self.ROOT_TYPE},
160 def visitModule(self, mod):
162 self.visit(dfn)
164 def visitType(self, type):
165 self.visit(type.value, type.name)
167 def visitSum(self, sum, name):
168 self.metadata.types.add(name)
172 self.metadata.simple_sums.add(name)
176 self.metadata.singletons.add(constructor.name)
177 self.visitConstructor(constructor)
178 self.visitFields(sum.attributes)
180 def visitConstructor(self, constructor):
181 self.metadata.types.add(constructor.name)
182 self.visitFields(constructor.fields)
184 def visitProduct(self, product, name):
185 self.metadata.types.add(name)
186 self.visitFields(product.attributes)
187 self.visitFields(product.fields)
189 def visitFields(self, fields):
191 self.visitField(field)
193 def visitField(self, field):
194 self.metadata.identifiers.add(field.name)
198 def visitModule(self, mod):
200 self.visit(dfn)
202 def visitType(self, type, depth=0):
203 self.visit(type.value, type.name, depth)
205 def visitSum(self, sum, name, depth):
207 self.simple_sum(sum, name, depth)
209 self.sum_with_constructors(sum, name, depth)
211 def simple_sum(self, sum, name, depth):
219 self.emit(s, depth)
220 self.emit("", depth)
222 def sum_with_constructors(self, sum, name, depth):
225 self.emit(s, depth)
226 self.emit("", depth)
228 def visitProduct(self, product, name, depth):
231 self.emit(s, depth)
232 self.emit("", depth)
235 def visitModule(self, mod):
237 self.visit(dfn)
239 def visitType(self, type, depth=0):
240 self.visit(type.value, type.name, depth)
242 def visitSum(self, sum, name, depth):
245 self.emit_sequence_constructor(name, depth)
247 def emit_sequence_constructor(self, name,depth):
249 self.emit("""\
254 self.emit("", depth)
255 self.emit("asdl_%(name)s_seq *_Py_asdl_%(name)s_seq_new(Py_ssize_t size, PyArena *arena);" % locals(), depth)
256 self.emit("", depth)
258 def visitProduct(self, product, name, depth):
259 self.emit_sequence_constructor(name, depth)
264 def visitModule(self, mod):
266 self.visit(dfn)
268 def visitType(self, type, depth=0):
269 self.visit(type.value, type.name, depth)
271 def visitSum(self, sum, name, depth):
273 self.sum_with_constructors(sum, name, depth)
275 def sum_with_constructors(self, sum, name, depth):
277 self.emit(s % sys._getframe(1).f_locals, depth)
289 self.visit(t, depth + 2)
299 def visitConstructor(self, cons, depth):
301 self.emit("struct {", depth)
303 self.visit(f, depth + 1)
304 self.emit("} %s;" % cons.name, depth)
305 self.emit("", depth)
307 def visitField(self, field, depth):
313 if field.type in self.metadata.simple_sums:
314 self.emit("asdl_int_seq *%(name)s;" % locals(), depth)
317 self.emit("asdl_%(_type)s_seq *%(name)s;" % locals(), depth)
319 self.emit("%(ctype)s %(name)s;" % locals(), depth)
321 def visitProduct(self, product, name, depth):
322 self.emit("struct _%(name)s {" % locals(), depth)
324 self.visit(f, depth + 1)
329 self.emit("%s %s;" % (type, field.name), depth + 1);
330 self.emit("};", depth)
331 self.emit("", depth)
341 def visitModule(self, mod):
343 self.visit(dfn)
345 def visitType(self, type):
346 self.visit(type.value, type.name)
348 def visitSum(self, sum, name):
353 self.visit(t, name, sum.attributes)
355 def get_args(self, fields):
373 if f.type in self.metadata.simple_sums:
382 def visitConstructor(self, cons, type, attrs):
383 args = self.get_args(cons.fields)
384 attrs = self.get_args(attrs)
386 self.emit_function(cons.name, ctype, args, attrs)
388 def emit_function(self, name, ctype, args, attrs, union=True):
396 self.emit("%s %s(%s);" % (ctype, ast_func_name(name), argstr), False)
398 def visitProduct(self, prod, name):
399 self.emit_function(name, get_c_type(name),
400 self.get_args(prod.fields),
401 self.get_args(prod.attributes),
408 def emit_function(self, name, ctype, args, attrs, union=True):
410 self.emit(s, depth, reflow)
417 self.emit("%s" % ctype, 0)
435 self.emit_body_union(name, args, attrs)
437 self.emit_body_struct(name, args, attrs)
442 def emit_body_union(self, name, args, attrs):
444 self.emit(s, depth, reflow)
451 def emit_body_struct(self, name, args, attrs):
453 self.emit(s, depth, reflow)
462 def visitModule(self, mod):
464 self.visit(dfn)
466 def visitType(self, type):
467 self.visit(type.value, type.name)
469 def visitSum(self, sum, name):
472 def visitProduct(self, sum, name):
475 def visitConstructor(self, cons, name):
478 def visitField(self, sum):
483 def visitProduct(self, prod, name):
485 self.emit(code % (name, get_c_type(name)), 0)
498 def recursive_call(self, node, level):
499 self.emit('if (_Py_EnterRecursiveCall(" while traversing \'%s\' node")) {' % node, level, reflow=False)
500 self.emit('goto failed;', level + 1)
501 self.emit('}', level)
503 self.emit('_Py_LeaveRecursiveCall();', level)
505 def funcHeader(self, name):
507 self.emit("int", 0)
508 self.emit("obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
509 self.emit("{", 0)
510 self.emit("int isinstance;", 1)
511 self.emit("", 0)
513 def sumTrailer(self, name, add_label=False):
514 self.emit("", 0)
518 self.emit(format % error, 1, reflow=False)
520 self.emit("failed:", 1)
521 self.emit("Py_XDECREF(tmp);", 1)
522 self.emit("return 1;", 1)
523 self.emit("}", 0)
524 self.emit("", 0)
526 def simpleSum(self, sum, name):
527 self.funcHeader(name)
531 self.emit(line % (t.name,), 1)
532 self.emit("if (isinstance == -1) {", 1)
533 self.emit("return 1;", 2)
534 self.emit("}", 1)
535 self.emit("if (isinstance) {", 1)
536 self.emit("*out = %s;" % t.name, 2)
537 self.emit("return 0;", 2)
538 self.emit("}", 1)
539 self.sumTrailer(name)
541 def buildArgs(self, fields):
544 def complexSum(self, sum, name):
545 self.funcHeader(name)
546 self.emit("PyObject *tmp = NULL;", 1)
547 self.emit("PyObject *tp;", 1)
549 self.visitAttributeDeclaration(a, name, sum=sum)
550 self.emit("", 0)
552 self.emit("if (obj == Py_None) {", 1)
553 self.emit("*out = NULL;", 2)
554 self.emit("return 0;", 2)
555 self.emit("}", 1)
557 self.visitField(a, name, sum=sum, depth=1)
559 self.emit("tp = state->%s_type;" % (t.name,), 1)
560 self.emit("isinstance = PyObject_IsInstance(obj, tp);", 1)
561 self.emit("if (isinstance == -1) {", 1)
562 self.emit("return 1;", 2)
563 self.emit("}", 1)
564 self.emit("if (isinstance) {", 1)
566 self.visitFieldDeclaration(f, t.name, sum=sum, depth=2)
567 self.emit("", 0)
569 self.visitField(f, t.name, sum=sum, depth=2)
571 self.emit("*out = %s(%s);" % (ast_func_name(t.name), self.buildArgs(args)), 2)
572 self.emit("if (*out == NULL) goto failed;", 2)
573 self.emit("return 0;", 2)
574 self.emit("}", 1)
575 self.sumTrailer(name, True)
577 def visitAttributeDeclaration(self, a, name, sum=sum):
579 self.emit("%s %s;" % (ctype, a.name), 1)
581 def visitSum(self, sum, name):
583 self.simpleSum(sum, name)
585 self.complexSum(sum, name)
587 def visitProduct(self, prod, name):
589 self.emit("int", 0)
590 self.emit("obj2ast_%s(struct ast_state *state, PyObject* obj, %s* out, PyArena* arena)" % (name, ctype), 0)
591 self.emit("{", 0)
592 self.emit("PyObject* tmp = NULL;", 1)
594 self.visitFieldDeclaration(f, name, prod=prod, depth=1)
596 self.visitFieldDeclaration(a, name, prod=prod, depth=1)
597 self.emit("", 0)
599 self.visitField(f, name, prod=prod, depth=1)
601 self.visitField(a, name, prod=prod, depth=1)
604 self.emit("*out = %s(%s);" % (ast_func_name(name), self.buildArgs(args)), 1)
605 self.emit("return 0;", 1)
606 self.emit("failed:", 0)
607 self.emit("Py_XDECREF(tmp);", 1)
608 self.emit("return 1;", 1)
609 self.emit("}", 0)
610 self.emit("", 0)
612 def visitFieldDeclaration(self, field, name, sum=None, prod=None, depth=0):
615 if self.isSimpleType(field):
616 self.emit("asdl_int_seq* %s;" % field.name, depth)
619 self.emit(f"asdl_{field.type}_seq* {field.name};", depth)
622 self.emit("%s %s;" % (ctype, field.name), depth)
624 def isNumeric(self, field):
627 def isSimpleType(self, field):
628 return field.type in self.metadata.simple_sums or self.isNumeric(field)
630 def visitField(self, field, name, sum=None, prod=None, depth=0):
633 self.emit(line % field.name, depth)
634 self.emit("return 1;", depth+1)
635 self.emit("}", depth)
637 self.emit("if (tmp == NULL) {", depth)
640 self.emit(format % message, depth+1, reflow=False)
641 self.emit("return 1;", depth+1)
643 self.emit("if (tmp == NULL || tmp == Py_None) {", depth)
644 self.emit("Py_CLEAR(tmp);", depth+1)
645 if self.isNumeric(field):
646 if field.name in self.attribute_special_defaults:
647 self.emit(
648 "%s = %s;" % (field.name, self.attribute_special_defaults[field.name]),
652 self.emit("%s = 0;" % field.name, depth+1)
653 elif not self.isSimpleType(field):
654 self.emit("%s = NULL;" % field.name, depth+1)
657 self.emit("}", depth)
658 self.emit("else {", depth)
660 self.emit("int res;", depth+1)
662 self.emit("Py_ssize_t len;", depth+1)
663 self.emit("Py_ssize_t i;", depth+1)
664 self.emit("if (!PyList_Check(tmp)) {", depth+1)
665 self.emit("PyErr_Format(PyExc_TypeError, \"%s field \\\"%s\\\" must "
669 self.emit("goto failed;", depth+2)
670 self.emit("}", depth+1)
671 self.emit("len = PyList_GET_SIZE(tmp);", depth+1)
672 if self.isSimpleType(field):
673 self.emit("%s = _Py_asdl_int_seq_new(len, arena);" % field.name, depth+1)
675 self.emit("%s = _Py_asdl_%s_seq_new(len, arena);" % (field.name, field.type), depth+1)
676 self.emit("if (%s == NULL) goto failed;" % field.name, depth+1)
677 self.emit("for (i = 0; i < len; i++) {", depth+1)
678 self.emit("%s val;" % ctype, depth+2)
679 self.emit("PyObject *tmp2 = PyList_GET_ITEM(tmp, i);", depth+2)
680 self.emit("Py_INCREF(tmp2);", depth+2)
681 with self.recursive_call(name, depth+2):
682 self.emit("res = obj2ast_%s(state, tmp2, &val, arena);" %
684 self.emit("Py_DECREF(tmp2);", depth+2)
685 self.emit("if (res != 0) goto failed;", depth+2)
686 self.emit("if (len != PyList_GET_SIZE(tmp)) {", depth+2)
687 self.emit("PyErr_SetString(PyExc_RuntimeError, \"%s field \\\"%s\\\" "
691 self.emit("goto failed;", depth+3)
692 self.emit("}", depth+2)
693 self.emit("asdl_seq_SET(%s, i, val);" % field.name, depth+2)
694 self.emit("}", depth+1)
696 with self.recursive_call(name, depth+1):
697 self.emit("res = obj2ast_%s(state, tmp, &%s, arena);" %
699 self.emit("if (res != 0) goto failed;", depth+1)
701 self.emit("Py_CLEAR(tmp);", depth+1)
702 self.emit("}", depth)
706 def visitModule(self, mod):
708 self.visit(dfn)
710 def visitType(self, type):
711 self.visit(type.value, type.name)
713 def visitProduct(self, prod, name):
714 self.emit_sequence_constructor(name, get_c_type(name))
716 def visitSum(self, sum, name):
718 self.emit_sequence_constructor(name, get_c_type(name))
720 def emit_sequence_constructor(self, name, type):
721 self.emit(f"GENERATE_ASDL_SEQ_CONSTRUCTOR({name}, {type})", depth=0)
725 def visitProduct(self, prod, name):
726 self.emit("static PyObject* ast2obj_%s(struct ast_state *state, void*);" % name, 0)
728 self.emit("static const char * const %s_attributes[] = {" % name, 0)
730 self.emit('"%s",' % a.name, 1)
731 self.emit("};", 0)
733 self.emit("static const char * const %s_fields[]={" % name,0)
735 self.emit('"%s",' % f.name, 1)
736 self.emit("};", 0)
738 def visitSum(self, sum, name):
740 self.emit("static const char * const %s_attributes[] = {" % name, 0)
742 self.emit('"%s",' % a.name, 1)
743 self.emit("};", 0)
747 self.emit("static PyObject* ast2obj_%s(struct ast_state *state, %s);" % (name, ptype), 0)
749 self.visitConstructor(t, name)
751 def visitConstructor(self, cons, name):
753 self.emit("static const char * const %s_fields[]={" % cons.name, 0)
755 self.emit('"%s",' % t.name, 1)
756 self.emit("};",0)
761 def visitModule(self, mod):
762 self.emit("""
770 ast_dealloc(AST_object *self)
773 PyTypeObject *tp = Py_TYPE(self);
774 PyObject_GC_UnTrack(self);
775 Py_CLEAR(self->dict);
778 free_func(self);
783 ast_traverse(AST_object *self, visitproc visit, void *arg)
785 Py_VISIT(Py_TYPE(self));
786 Py_VISIT(self->dict);
791 ast_clear(AST_object *self)
793 Py_CLEAR(self->dict);
798 ast_type_init(PyObject *self, PyObject *args, PyObject *kw)
808 if (_PyObject_LookupAttr((PyObject*)Py_TYPE(self), state->_fields, &fields) < 0) {
822 _PyType_Name(Py_TYPE(self)),
834 res = PyObject_SetAttr(self, name, PyTuple_GET_ITEM(args, i));
856 Py_TYPE(self)->tp_name, key);
861 res = PyObject_SetAttr(self, key, value);
874 ast_type_reduce(PyObject *self, PyObject *unused)
882 if (_PyObject_LookupAttr(self, state->__dict__, &dict) < 0) {
886 return Py_BuildValue("O()N", Py_TYPE(self), dict);
888 return Py_BuildValue("O()", Py_TYPE(self));
1091 self.file.write(textwrap.dedent('''
1114 self.visit(dfn)
1115 self.file.write(textwrap.dedent('''
1123 def visitProduct(self, prod, name):
1128 self.emit('state->%s_type = make_type(state, "%s", state->AST_type, %s, %d,' %
1130 self.emit('%s);' % reflow_c_string(asdl_of(name, prod), 2), 2, reflow=False)
1131 self.emit("if (!state->%s_type) return 0;" % name, 1)
1133 self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" %
1136 self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1)
1137 self.emit_defaults(name, prod.fields, 1)
1138 self.emit_defaults(name, prod.attributes, 1)
1140 def visitSum(self, sum, name):
1141 self.emit('state->%s_type = make_type(state, "%s", state->AST_type, NULL, 0,' %
1143 self.emit('%s);' % reflow_c_string(asdl_of(name, sum), 2), 2, reflow=False)
1144 self.emit("if (!state->%s_type) return 0;" % name, 1)
1146 self.emit("if (!add_attributes(state, state->%s_type, %s_attributes, %d)) return 0;" %
1149 self.emit("if (!add_attributes(state, state->%s_type, NULL, 0)) return 0;" % name, 1)
1150 self.emit_defaults(name, sum.attributes, 1)
1153 self.visitConstructor(t, name, simple)
1155 def visitConstructor(self, cons, name, simple):
1160 self.emit('state->%s_type = make_type(state, "%s", state->%s_type, %s, %d,' %
1162 self.emit('%s);' % reflow_c_string(asdl_of(cons.name, cons), 2), 2, reflow=False)
1163 self.emit("if (!state->%s_type) return 0;" % cons.name, 1)
1164 self.emit_defaults(cons.name, cons.fields, 1)
1166 self.emit("state->%s_singleton = PyType_GenericNew((PyTypeObject *)"
1169 self.emit("if (!state->%s_singleton) return 0;" % cons.name, 1)
1171 def emit_defaults(self, name, fields, depth):
1174 self.emit('if (PyObject_SetAttr(state->%s_type, state->%s, Py_None) == -1)' %
1176 self.emit("return 0;", depth+1)
1181 def visitModule(self, mod):
1182 self.emit("static int", 0)
1183 self.emit("astmodule_exec(PyObject *m)", 0)
1184 self.emit("{", 0)
1185 self.emit('struct ast_state *state = get_ast_state();', 1)
1186 self.emit('if (state == NULL) {', 1)
1187 self.emit('return -1;', 2)
1188 self.emit('}', 1)
1189 self.emit('if (PyModule_AddObjectRef(m, "AST", state->AST_type) < 0) {', 1)
1190 self.emit('return -1;', 2)
1191 self.emit('}', 1)
1192 self.emit('if (PyModule_AddIntMacro(m, PyCF_ALLOW_TOP_LEVEL_AWAIT) < 0) {', 1)
1193 self.emit("return -1;", 2)
1194 self.emit('}', 1)
1195 self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) {', 1)
1196 self.emit("return -1;", 2)
1197 self.emit('}', 1)
1198 self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) {', 1)
1199 self.emit("return -1;", 2)
1200 self.emit('}', 1)
1202 self.visit(dfn)
1203 self.emit("return 0;", 1)
1204 self.emit("}", 0)
1205 self.emit("", 0)
1206 self.emit("""
1227 def visitProduct(self, prod, name):
1228 self.addObj(name)
1230 def visitSum(self, sum, name):
1231 self.addObj(name)
1233 self.visitConstructor(t, name)
1235 def visitConstructor(self, cons, name):
1236 self.addObj(cons.name)
1238 def addObj(self, name):
1239 self.emit("if (PyModule_AddObjectRef(m, \"%s\", "
1241 self.emit("return -1;", 2)
1242 self.emit('}', 1)
1248 def visit(self, object):
1249 self.emit(self.CODE, 0, reflow=False)
1254 def func_begin(self, name):
1256 self.emit("PyObject*", 0)
1257 self.emit("ast2obj_%s(struct ast_state *state, void* _o)" % (name), 0)
1258 self.emit("{", 0)
1259 self.emit("%s o = (%s)_o;" % (ctype, ctype), 1)
1260 self.emit("PyObject *result = NULL, *value = NULL;", 1)
1261 self.emit("PyTypeObject *tp;", 1)
1262 self.emit('if (!o) {', 1)
1263 self.emit("Py_RETURN_NONE;", 2)
1264 self.emit("}", 1)
1265 self.emit("if (++state->recursion_depth > state->recursion_limit) {", 1)
1266 self.emit("PyErr_SetString(PyExc_RecursionError,", 2)
1267 self.emit('"maximum recursion depth exceeded during ast construction");', 3)
1268 self.emit("return 0;", 2)
1269 self.emit("}", 1)
1271 def func_end(self):
1272 self.emit("state->recursion_depth--;", 1)
1273 self.emit("return result;", 1)
1274 self.emit("failed:", 0)
1275 self.emit("Py_XDECREF(value);", 1)
1276 self.emit("Py_XDECREF(result);", 1)
1277 self.emit("return NULL;", 1)
1278 self.emit("}", 0)
1279 self.emit("", 0)
1281 def visitSum(self, sum, name):
1283 self.simpleSum(sum, name)
1285 self.func_begin(name)
1286 self.emit("switch (o->kind) {", 1)
1289 self.visitConstructor(t, i + 1, name)
1290 self.emit("}", 1)
1292 self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1)
1293 self.emit("if (!value) goto failed;", 1)
1294 self.emit('if (PyObject_SetAttr(result, state->%s, value) < 0)' % a.name, 1)
1295 self.emit('goto failed;', 2)
1296 self.emit('Py_DECREF(value);', 1)
1297 self.func_end()
1299 def simpleSum(self, sum, name):
1300 self.emit("PyObject* ast2obj_%s(struct ast_state *state, %s_ty o)" % (name, name), 0)
1301 self.emit("{", 0)
1302 self.emit("switch(o) {", 1)
1304 self.emit("case %s:" % t.name, 2)
1305 self.emit("Py_INCREF(state->%s_singleton);" % t.name, 3)
1306 self.emit("return state->%s_singleton;" % t.name, 3)
1307 self.emit("}", 1)
1308 self.emit("Py_UNREACHABLE();", 1);
1309 self.emit("}", 0)
1311 def visitProduct(self, prod, name):
1312 self.func_begin(name)
1313 self.emit("tp = (PyTypeObject *)state->%s_type;" % name, 1)
1314 self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 1);
1315 self.emit("if (!result) return NULL;", 1)
1317 self.visitField(field, name, 1, True)
1319 self.emit("value = ast2obj_%s(state, o->%s);" % (a.type, a.name), 1)
1320 self.emit("if (!value) goto failed;", 1)
1321 self.emit("if (PyObject_SetAttr(result, state->%s, value) < 0)" % a.name, 1)
1322 self.emit('goto failed;', 2)
1323 self.emit('Py_DECREF(value);', 1)
1324 self.func_end()
1326 def visitConstructor(self, cons, enum, name):
1327 self.emit("case %s_kind:" % cons.name, 1)
1328 self.emit("tp = (PyTypeObject *)state->%s_type;" % cons.name, 2)
1329 self.emit("result = PyType_GenericNew(tp, NULL, NULL);", 2);
1330 self.emit("if (!result) goto failed;", 2)
1332 self.visitField(f, cons.name, 2, False)
1333 self.emit("break;", 2)
1335 def visitField(self, field, name, depth, product):
1337 self.emit(s, depth + d)
1342 self.set(field, value, depth)
1348 def set(self, field, value, depth):
1350 if field.type in self.metadata.simple_sums:
1353 self.emit("{", depth)
1354 self.emit("Py_ssize_t i, n = asdl_seq_LEN(%s);" % value, depth+1)
1355 self.emit("value = PyList_New(n);", depth+1)
1356 self.emit("if (!value) goto failed;", depth+1)
1357 self.emit("for(i = 0; i < n; i++)", depth+1)
1359 self.emit(
1367 self.emit("}", depth)
1369 self.emit("value = ast2obj_list(state, (asdl_seq*)%s, ast2obj_%s);" % (value, field.type), depth)
1371 self.emit("value = ast2obj_%s(state, %s);" % (field.type, value), depth, reflow=False)
1460 def __init__(self, *visitors, metadata = None):
1461 self.visitors = visitors
1462 self.metadata = metadata
1464 def visit(self, object):
1465 for v in self.visitors:
1466 v.metadata = self.metadata