blob: 33e1a579087906a0163de888e99c60c6828e93f8 [file] [log] [blame]
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00001#include "Python.h"
Jeremy Hylton4db62b12001-02-27 19:07:02 +00002#include "compile.h"
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +00003#include "symtable.h"
4#include "graminit.h"
5#include "structmember.h"
6
7PyObject *
8PySymtableEntry_New(struct symtable *st, char *name, int type, int lineno)
9{
10 PySymtableEntryObject *ste = NULL;
11 PyObject *k, *v;
12
13 k = PyInt_FromLong(st->st_nscopes++);
14 if (k == NULL)
15 goto fail;
16 v = PyDict_GetItem(st->st_symbols, k);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000017 if (v) /* XXX could check that name, type, lineno match */ {
Tim Peters0f2d4b82001-12-08 23:40:38 +000018 Py_DECREF(k);
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000019 Py_INCREF(v);
20 return v;
21 }
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000022
23 ste = (PySymtableEntryObject *)PyObject_New(PySymtableEntryObject,
24 &PySymtableEntry_Type);
25 ste->ste_table = st;
26 ste->ste_id = k;
27
28 v = PyString_FromString(name);
29 if (v == NULL)
30 goto fail;
31 ste->ste_name = v;
32
33 v = PyDict_New();
34 if (v == NULL)
35 goto fail;
36 ste->ste_symbols = v;
37
38 v = PyList_New(0);
39 if (v == NULL)
40 goto fail;
41 ste->ste_varnames = v;
42
43 v = PyList_New(0);
44 if (v == NULL)
45 goto fail;
46 ste->ste_children = v;
47
Jeremy Hylton29906ee2001-02-27 04:23:34 +000048 ste->ste_optimized = 0;
Jeremy Hylton86424e32001-12-04 02:41:46 +000049 ste->ste_opt_lineno = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000050 ste->ste_lineno = lineno;
51 switch (type) {
52 case funcdef:
53 case lambdef:
54 ste->ste_type = TYPE_FUNCTION;
55 break;
56 case classdef:
57 ste->ste_type = TYPE_CLASS;
58 break;
59 case single_input:
60 case eval_input:
61 case file_input:
62 ste->ste_type = TYPE_MODULE;
63 break;
64 }
65
66 if (st->st_cur == NULL)
67 ste->ste_nested = 0;
68 else if (st->st_cur->ste_nested
69 || st->st_cur->ste_type == TYPE_FUNCTION)
70 ste->ste_nested = 1;
71 else
72 ste->ste_nested = 0;
73 ste->ste_child_free = 0;
Tim Peters5ca576e2001-06-18 22:08:13 +000074 ste->ste_generator = 0;
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000075
76 if (PyDict_SetItem(st->st_symbols, ste->ste_id, (PyObject *)ste) < 0)
77 goto fail;
Jeremy Hylton74b3bc42001-02-23 17:55:27 +000078
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000079 return (PyObject *)ste;
80 fail:
81 Py_XDECREF(ste);
82 return NULL;
83}
84
85static PyObject *
86ste_repr(PySymtableEntryObject *ste)
87{
88 char buf[256];
89
Barry Warsaw4b4ab202001-11-28 21:36:28 +000090 PyOS_snprintf(buf, sizeof(buf),
91 "<symtable entry %.100s(%ld), line %d>",
92 PyString_AS_STRING(ste->ste_name),
93 PyInt_AS_LONG(ste->ste_id),
94 ste->ste_lineno);
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +000095 return PyString_FromString(buf);
96}
97
98static void
99ste_dealloc(PySymtableEntryObject *ste)
100{
101 ste->ste_table = NULL;
102 Py_XDECREF(ste->ste_id);
103 Py_XDECREF(ste->ste_name);
104 Py_XDECREF(ste->ste_symbols);
105 Py_XDECREF(ste->ste_varnames);
106 Py_XDECREF(ste->ste_children);
107 PyObject_Del(ste);
108}
109
110#define OFF(x) offsetof(PySymtableEntryObject, x)
111
Guido van Rossum6f799372001-09-20 20:46:19 +0000112static PyMemberDef ste_memberlist[] = {
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000113 {"id", T_OBJECT, OFF(ste_id), READONLY},
114 {"name", T_OBJECT, OFF(ste_name), READONLY},
115 {"symbols", T_OBJECT, OFF(ste_symbols), READONLY},
116 {"varnames", T_OBJECT, OFF(ste_varnames), READONLY},
117 {"children", T_OBJECT, OFF(ste_children), READONLY},
118 {"type", T_INT, OFF(ste_type), READONLY},
119 {"lineno", T_INT, OFF(ste_lineno), READONLY},
120 {"optimized",T_INT, OFF(ste_optimized), READONLY},
121 {"nested", T_INT, OFF(ste_nested), READONLY},
122 {NULL}
123};
124
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000125PyTypeObject PySymtableEntry_Type = {
126 PyObject_HEAD_INIT(&PyType_Type)
127 0,
128 "symtable entry",
129 sizeof(PySymtableEntryObject),
130 0,
131 (destructor)ste_dealloc, /* tp_dealloc */
132 0, /* tp_print */
Guido van Rossum6f799372001-09-20 20:46:19 +0000133 0, /* tp_getattr */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000134 0, /* tp_setattr */
135 0, /* tp_compare */
136 (reprfunc)ste_repr, /* tp_repr */
137 0, /* tp_as_number */
138 0, /* tp_as_sequence */
139 0, /* tp_as_mapping */
140 0, /* tp_hash */
141 0, /* tp_call */
142 0, /* tp_str */
Guido van Rossum6f799372001-09-20 20:46:19 +0000143 PyObject_GenericGetAttr, /* tp_getattro */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000144 0, /* tp_setattro */
145 0, /* tp_as_buffer */
146 Py_TPFLAGS_DEFAULT, /* tp_flags */
147 0, /* tp_doc */
Guido van Rossum6f799372001-09-20 20:46:19 +0000148 0, /* tp_traverse */
149 0, /* tp_clear */
150 0, /* tp_richcompare */
151 0, /* tp_weaklistoffset */
152 0, /* tp_iter */
153 0, /* tp_iternext */
154 0, /* tp_methods */
155 ste_memberlist, /* tp_members */
156 0, /* tp_getset */
157 0, /* tp_base */
158 0, /* tp_dict */
159 0, /* tp_descr_get */
160 0, /* tp_descr_set */
161 0, /* tp_dictoffset */
162 0, /* tp_init */
163 0, /* tp_alloc */
164 0, /* tp_new */
Jeremy Hyltoncb17ae82001-02-09 22:22:18 +0000165};