5 #include "structmember.h"
8 PySymtableEntry_New(struct symtable
*st
, char *name
, int type
, int lineno
)
10 PySymtableEntryObject
*ste
= NULL
;
13 k
= PyInt_FromLong(st
->st_nscopes
++);
16 v
= PyDict_GetItem(st
->st_symbols
, k
);
17 if (v
) /* XXX could check that name, type, lineno match */ {
22 ste
= (PySymtableEntryObject
*)PyObject_New(PySymtableEntryObject
,
23 &PySymtableEntry_Type
);
27 v
= PyString_FromString(name
);
40 ste
->ste_varnames
= v
;
45 ste
->ste_children
= v
;
47 ste
->ste_optimized
= 0;
48 ste
->ste_lineno
= lineno
;
52 ste
->ste_type
= TYPE_FUNCTION
;
55 ste
->ste_type
= TYPE_CLASS
;
60 ste
->ste_type
= TYPE_MODULE
;
64 if (st
->st_cur
== NULL
)
66 else if (st
->st_cur
->ste_nested
67 || st
->st_cur
->ste_type
== TYPE_FUNCTION
)
71 ste
->ste_child_free
= 0;
72 ste
->ste_generator
= 0;
74 if (PyDict_SetItem(st
->st_symbols
, ste
->ste_id
, (PyObject
*)ste
) < 0)
77 return (PyObject
*)ste
;
84 ste_repr(PySymtableEntryObject
*ste
)
88 sprintf(buf
, "<symtable entry %.100s(%ld), line %d>",
89 PyString_AS_STRING(ste
->ste_name
),
90 PyInt_AS_LONG(ste
->ste_id
),
92 return PyString_FromString(buf
);
96 ste_dealloc(PySymtableEntryObject
*ste
)
98 ste
->ste_table
= NULL
;
99 Py_XDECREF(ste
->ste_id
);
100 Py_XDECREF(ste
->ste_name
);
101 Py_XDECREF(ste
->ste_symbols
);
102 Py_XDECREF(ste
->ste_varnames
);
103 Py_XDECREF(ste
->ste_children
);
107 #define OFF(x) offsetof(PySymtableEntryObject, x)
109 static struct memberlist ste_memberlist
[] = {
110 {"id", T_OBJECT
, OFF(ste_id
), READONLY
},
111 {"name", T_OBJECT
, OFF(ste_name
), READONLY
},
112 {"symbols", T_OBJECT
, OFF(ste_symbols
), READONLY
},
113 {"varnames", T_OBJECT
, OFF(ste_varnames
), READONLY
},
114 {"children", T_OBJECT
, OFF(ste_children
), READONLY
},
115 {"type", T_INT
, OFF(ste_type
), READONLY
},
116 {"lineno", T_INT
, OFF(ste_lineno
), READONLY
},
117 {"optimized",T_INT
, OFF(ste_optimized
), READONLY
},
118 {"nested", T_INT
, OFF(ste_nested
), READONLY
},
123 ste_getattr(PySymtableEntryObject
*ste
, char *name
)
125 return PyMember_Get((char *)ste
, ste_memberlist
, name
);
128 PyTypeObject PySymtableEntry_Type
= {
129 PyObject_HEAD_INIT(&PyType_Type
)
132 sizeof(PySymtableEntryObject
),
134 (destructor
)ste_dealloc
, /* tp_dealloc */
136 (getattrfunc
)ste_getattr
, /* tp_getattr */
139 (reprfunc
)ste_repr
, /* tp_repr */
140 0, /* tp_as_number */
141 0, /* tp_as_sequence */
142 0, /* tp_as_mapping */
148 0, /* tp_as_buffer */
149 Py_TPFLAGS_DEFAULT
, /* tp_flags */