blob: 29269d052e34251ddaa76011228e65d92411113a [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Generic object operations; and implementation of None (NoObject) */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000033
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000035
Guido van Rossum6f9e4331995-03-29 16:57:48 +000036#if defined( Py_TRACE_REFS ) || defined( Py_REF_DEBUG )
Guido van Rossumc0b618a1997-05-02 03:12:38 +000037long _Py_RefTotal;
Guido van Rossum3f5da241990-12-20 15:06:42 +000038#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000039
Guido van Rossum3f5da241990-12-20 15:06:42 +000040/* Object allocation routines used by NEWOBJ and NEWVAROBJ macros.
41 These are used by the individual routines for object creation.
42 Do not call them otherwise, they do not initialize the object! */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000043
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000044#ifdef COUNT_ALLOCS
Guido van Rossumc0b618a1997-05-02 03:12:38 +000045static PyTypeObject *type_list;
Sjoerd Mullender842d2cc1993-10-15 16:18:48 +000046extern int tuple_zero_allocs, fast_tuple_allocs;
47extern int quick_int_allocs, quick_neg_int_allocs;
Sjoerd Mullender3bb8a051993-10-22 12:04:32 +000048extern int null_strings, one_strings;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000049void
50dump_counts()
51{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000052 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000053
54 for (tp = type_list; tp; tp = tp->tp_next)
Sjoerd Mullender52c1f511993-10-25 08:40:52 +000055 fprintf(stderr, "%s alloc'd: %d, freed: %d, max in use: %d\n",
56 tp->tp_name, tp->tp_alloc, tp->tp_free,
57 tp->tp_maxalloc);
58 fprintf(stderr, "fast tuple allocs: %d, empty: %d\n",
59 fast_tuple_allocs, tuple_zero_allocs);
60 fprintf(stderr, "fast int allocs: pos: %d, neg: %d\n",
61 quick_int_allocs, quick_neg_int_allocs);
62 fprintf(stderr, "null strings: %d, 1-strings: %d\n",
63 null_strings, one_strings);
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000064}
65
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +000066PyObject *
67get_counts()
68{
69 PyTypeObject *tp;
70 PyObject *result;
71 PyObject *v;
72
73 result = PyList_New(0);
74 if (result == NULL)
75 return NULL;
76 for (tp = type_list; tp; tp = tp->tp_next) {
77 v = Py_BuildValue("(siii)", tp->tp_name, tp->tp_alloc,
78 tp->tp_free, tp->tp_maxalloc);
79 if (v == NULL) {
80 Py_DECREF(result);
81 return NULL;
82 }
83 if (PyList_Append(result, v) < 0) {
84 Py_DECREF(v);
85 Py_DECREF(result);
86 return NULL;
87 }
88 Py_DECREF(v);
89 }
90 return result;
91}
92
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000093void
94inc_count(tp)
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095 PyTypeObject *tp;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000096{
97 if (tp->tp_alloc == 0) {
Guido van Rossumd8953cb1995-04-06 14:46:26 +000098 /* first time; insert in linked list */
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +000099 if (tp->tp_next != NULL) /* sanity check */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000100 Py_FatalError("XXX inc_count sanity check");
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000101 tp->tp_next = type_list;
102 type_list = tp;
103 }
104 tp->tp_alloc++;
105 if (tp->tp_alloc - tp->tp_free > tp->tp_maxalloc)
106 tp->tp_maxalloc = tp->tp_alloc - tp->tp_free;
107}
108#endif
109
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000110#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000111PyObject *
112_PyObject_New(tp)
113 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000114#else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000115PyObject *
116_PyObject_New(tp,op)
117 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000118 PyObject *op;
119#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000120{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000121#ifndef MS_COREDLL
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000122 PyObject *op = (PyObject *) malloc(tp->tp_basicsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000123#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000124 if (op == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126 op->ob_type = tp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000127 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000128 return op;
129}
130
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000131#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000132PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133_PyObject_NewVar(tp, size)
134 PyTypeObject *tp;
Guido van Rossum2497ead1995-02-10 17:00:27 +0000135 int size;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000136#else
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000137PyVarObject *
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000138_PyObject_NewVar(tp, size, op)
139 PyTypeObject *tp;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000140 int size;
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000141 PyVarObject *op;
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000142#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000143{
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000144#ifndef MS_COREDLL
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000145 PyVarObject *op = (PyVarObject *)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 malloc(tp->tp_basicsize + size * tp->tp_itemsize);
Guido van Rossumf5030ab1996-07-21 02:30:39 +0000147#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000148 if (op == NULL)
Guido van Rossumd0c87ee1997-05-15 21:31:03 +0000149 return (PyVarObject *)PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 op->ob_type = tp;
151 op->ob_size = size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000152 _Py_NewReference(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 return op;
154}
155
Guido van Rossum90933611991-06-07 16:10:43 +0000156int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157PyObject_Print(op, fp, flags)
158 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159 FILE *fp;
160 int flags;
161{
Guido van Rossum278ef591991-07-27 21:40:24 +0000162 int ret = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000164 return -1;
Guido van Rossum90933611991-06-07 16:10:43 +0000165 if (op == NULL) {
166 fprintf(fp, "<nil>");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000167 }
Guido van Rossum90933611991-06-07 16:10:43 +0000168 else {
169 if (op->ob_refcnt <= 0)
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000170 fprintf(fp, "<refcnt %u at %lx>",
171 op->ob_refcnt, (long)op);
172 else if (op->ob_type->tp_print == NULL) {
173 if (op->ob_type->tp_repr == NULL) {
174 fprintf(fp, "<%s object at %lx>",
175 op->ob_type->tp_name, (long)op);
176 }
177 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 PyObject *s;
179 if (flags & Py_PRINT_RAW)
180 s = PyObject_Str(op);
Guido van Rossumc6004111993-11-05 10:22:19 +0000181 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000182 s = PyObject_Repr(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000183 if (s == NULL)
184 ret = -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185 else if (!PyString_Check(s)) {
186 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000187 "repr not string");
188 ret = -1;
189 }
190 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 fprintf(fp, "%s",
192 PyString_AsString(s));
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 Py_XDECREF(s);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000195 }
196 }
Guido van Rossum90933611991-06-07 16:10:43 +0000197 else
Guido van Rossum278ef591991-07-27 21:40:24 +0000198 ret = (*op->ob_type->tp_print)(op, fp, flags);
Guido van Rossum90933611991-06-07 16:10:43 +0000199 }
Guido van Rossum278ef591991-07-27 21:40:24 +0000200 if (ret == 0) {
201 if (ferror(fp)) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum278ef591991-07-27 21:40:24 +0000203 clearerr(fp);
204 ret = -1;
205 }
206 }
207 return ret;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000210PyObject *
211PyObject_Repr(v)
212 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000213{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 if (PyErr_CheckSignals())
Guido van Rossum90933611991-06-07 16:10:43 +0000215 return NULL;
Guido van Rossum90933611991-06-07 16:10:43 +0000216 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000217 return PyString_FromString("<NULL>");
Guido van Rossum90933611991-06-07 16:10:43 +0000218 else if (v->ob_type->tp_repr == NULL) {
219 char buf[120];
220 sprintf(buf, "<%.80s object at %lx>",
221 v->ob_type->tp_name, (long)v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000222 return PyString_FromString(buf);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000223 }
Guido van Rossum90933611991-06-07 16:10:43 +0000224 else
225 return (*v->ob_type->tp_repr)(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000226}
227
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000228PyObject *
229PyObject_Str(v)
230 PyObject *v;
Guido van Rossumc6004111993-11-05 10:22:19 +0000231{
232 if (v == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000233 return PyString_FromString("<NULL>");
234 else if (PyString_Check(v)) {
235 Py_INCREF(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000236 return v;
237 }
Guido van Rossum32b582b1995-01-17 16:35:13 +0000238 else if (v->ob_type->tp_str != NULL)
239 return (*v->ob_type->tp_str)(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000240 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000241 PyObject *func;
242 PyObject *res;
243 if (!PyInstance_Check(v) ||
244 (func = PyObject_GetAttrString(v, "__str__")) == NULL) {
245 PyErr_Clear();
246 return PyObject_Repr(v);
Guido van Rossumc6004111993-11-05 10:22:19 +0000247 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000248 res = PyEval_CallObject(func, (PyObject *)NULL);
249 Py_DECREF(func);
Guido van Rossumc6004111993-11-05 10:22:19 +0000250 return res;
251 }
252}
253
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000254static PyObject *
Guido van Rossum20566841995-01-12 11:26:10 +0000255do_cmp(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256 PyObject *v, *w;
Guido van Rossum20566841995-01-12 11:26:10 +0000257{
258 /* __rcmp__ actually won't be called unless __cmp__ isn't defined,
259 because the check in cmpobject() reverses the objects first.
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 This is intentional -- it makes no sense to define cmp(x,y)
261 different than -cmp(y,x). */
262 if (PyInstance_Check(v) || PyInstance_Check(w))
263 return PyInstance_DoBinOp(v, w, "__cmp__", "__rcmp__", do_cmp);
264 return PyInt_FromLong((long)PyObject_Compare(v, w));
Guido van Rossum20566841995-01-12 11:26:10 +0000265}
266
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000268PyObject_Compare(v, w)
269 PyObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000270{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000271 PyTypeObject *tp;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000272 if (v == w)
273 return 0;
274 if (v == NULL)
275 return -1;
276 if (w == NULL)
277 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000278 if (PyInstance_Check(v) || PyInstance_Check(w)) {
279 PyObject *res;
Guido van Rossum20566841995-01-12 11:26:10 +0000280 int c;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000281 if (!PyInstance_Check(v))
282 return -PyObject_Compare(w, v);
Guido van Rossum20566841995-01-12 11:26:10 +0000283 res = do_cmp(v, w);
284 if (res == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000285 PyErr_Clear();
Guido van Rossum20566841995-01-12 11:26:10 +0000286 return (v < w) ? -1 : 1;
287 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 if (!PyInt_Check(res)) {
289 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000290 return (v < w) ? -1 : 1;
291 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000292 c = PyInt_AsLong(res);
293 Py_DECREF(res);
Guido van Rossum20566841995-01-12 11:26:10 +0000294 return (c < 0) ? -1 : (c > 0) ? 1 : 0;
295 }
Guido van Rossum9fb03681991-07-01 18:48:04 +0000296 if ((tp = v->ob_type) != w->ob_type) {
297 if (tp->tp_as_number != NULL &&
298 w->ob_type->tp_as_number != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000299 if (PyNumber_Coerce(&v, &w) != 0) {
300 PyErr_Clear();
Guido van Rossum9fb03681991-07-01 18:48:04 +0000301 /* XXX Should report the error,
302 XXX but the interface isn't there... */
303 }
304 else {
305 int cmp = (*v->ob_type->tp_compare)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000306 Py_DECREF(v);
307 Py_DECREF(w);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000308 return cmp;
309 }
310 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000311 return strcmp(tp->tp_name, w->ob_type->tp_name);
Guido van Rossum9fb03681991-07-01 18:48:04 +0000312 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 if (tp->tp_compare == NULL)
314 return (v < w) ? -1 : 1;
Guido van Rossum9fb03681991-07-01 18:48:04 +0000315 return (*tp->tp_compare)(v, w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316}
317
Guido van Rossum9bfef441993-03-29 10:43:31 +0000318long
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319PyObject_Hash(v)
320 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000321{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000322 PyTypeObject *tp = v->ob_type;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000323 if (tp->tp_hash != NULL)
324 return (*tp->tp_hash)(v);
325 if (tp->tp_compare == NULL)
326 return (long) v; /* Use address as hash value */
327 /* If there's a cmp but no hash defined, the object can't be hashed */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328 PyErr_SetString(PyExc_TypeError, "unhashable type");
Guido van Rossum9bfef441993-03-29 10:43:31 +0000329 return -1;
330}
331
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000332PyObject *
333PyObject_GetAttrString(v, name)
334 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000335 char *name;
336{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000337 if (v->ob_type->tp_getattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000338 PyObject *w, *res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000339 w = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000340 if (w == NULL)
341 return NULL;
342 res = (*v->ob_type->tp_getattro)(v, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 Py_XDECREF(w);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000344 return res;
345 }
346
Guido van Rossum3f5da241990-12-20 15:06:42 +0000347 if (v->ob_type->tp_getattr == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 PyErr_SetString(PyExc_AttributeError, "attribute-less object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000349 return NULL;
350 }
351 else {
352 return (*v->ob_type->tp_getattr)(v, name);
353 }
354}
355
356int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000357PyObject_HasAttrString(v, name)
358 PyObject *v;
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000359 char *name;
360{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 PyObject *res = PyObject_GetAttrString(v, name);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000362 if (res != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 Py_DECREF(res);
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000364 return 1;
365 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyErr_Clear();
Guido van Rossumed18fdc1993-07-11 19:55:34 +0000367 return 0;
368}
369
370int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371PyObject_SetAttrString(v, name, w)
372 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000373 char *name;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000374 PyObject *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000375{
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000376 if (v->ob_type->tp_setattro != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 PyObject *s;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000378 int res;
Guido van Rossumc6d06701997-01-18 07:57:16 +0000379 s = PyString_InternFromString(name);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000380 if (s == NULL)
Guido van Rossumb7fc3041996-09-11 22:51:25 +0000381 return -1;
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000382 res = (*v->ob_type->tp_setattro)(v, s, w);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 Py_XDECREF(s);
Guido van Rossumd8eb1b31996-08-09 20:52:03 +0000384 return res;
385 }
386
Guido van Rossum3f5da241990-12-20 15:06:42 +0000387 if (v->ob_type->tp_setattr == NULL) {
388 if (v->ob_type->tp_getattr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000390 "attribute-less object (assign or del)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyErr_SetString(PyExc_TypeError,
Guido van Rossum3ea74121991-12-24 13:28:03 +0000393 "object has read-only attributes");
Guido van Rossum73531a31990-12-20 23:12:40 +0000394 return -1;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 }
396 else {
397 return (*v->ob_type->tp_setattr)(v, name, w);
398 }
399}
400
Guido van Rossum98ff96a1997-05-20 18:34:44 +0000401PyObject *
402PyObject_GetAttr(v, name)
403 PyObject *v;
404 PyObject *name;
405{
406 if (v->ob_type->tp_getattro != NULL)
407 return (*v->ob_type->tp_getattro)(v, name);
408 else
409 return PyObject_GetAttrString(v, PyString_AsString(name));
410}
411
412int
413PyObject_HasAttr(v, name)
414 PyObject *v;
415 PyObject *name;
416{
417 PyObject *res = PyObject_GetAttr(v, name);
418 if (res != NULL) {
419 Py_DECREF(res);
420 return 1;
421 }
422 PyErr_Clear();
423 return 0;
424}
425
426int
427PyObject_SetAttr(v, name, value)
428 PyObject *v;
429 PyObject *name;
430 PyObject *value;
431{
432 int err;
433 Py_INCREF(name);
434 PyString_InternInPlace(&name);
435 if (v->ob_type->tp_setattro != NULL)
436 err = (*v->ob_type->tp_setattro)(v, name, value);
437 else
438 err = PyObject_SetAttrString(
439 v, PyString_AsString(name), value);
440 Py_DECREF(name);
441 return err;
442}
443
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000444/* Test a value used as condition, e.g., in a for or if statement.
445 Return -1 if an error occurred */
446
447int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448PyObject_IsTrue(v)
449 PyObject *v;
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000450{
451 int res;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 if (v == Py_None)
Guido van Rossum6ac258d1993-05-12 08:24:20 +0000453 res = 0;
454 else if (v->ob_type->tp_as_number != NULL)
455 res = (*v->ob_type->tp_as_number->nb_nonzero)(v);
456 else if (v->ob_type->tp_as_mapping != NULL)
457 res = (*v->ob_type->tp_as_mapping->mp_length)(v);
458 else if (v->ob_type->tp_as_sequence != NULL)
459 res = (*v->ob_type->tp_as_sequence->sq_length)(v);
460 else
461 res = 1;
462 if (res > 0)
463 res = 1;
464 return res;
465}
466
Guido van Rossum5524a591995-01-10 15:26:20 +0000467/* Coerce two numeric types to the "larger" one.
468 Increment the reference count on each argument.
469 Return -1 and raise an exception if no coercion is possible
470 (and then no reference count is incremented).
471*/
472
473int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474PyNumber_Coerce(pv, pw)
475 PyObject **pv, **pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000476{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 register PyObject *v = *pv;
478 register PyObject *w = *pw;
Guido van Rossum5524a591995-01-10 15:26:20 +0000479 int res;
480
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 if (v->ob_type == w->ob_type && !PyInstance_Check(v)) {
482 Py_INCREF(v);
483 Py_INCREF(w);
Guido van Rossum5524a591995-01-10 15:26:20 +0000484 return 0;
485 }
486 if (v->ob_type->tp_as_number && v->ob_type->tp_as_number->nb_coerce) {
487 res = (*v->ob_type->tp_as_number->nb_coerce)(pv, pw);
488 if (res <= 0)
489 return res;
490 }
491 if (w->ob_type->tp_as_number && w->ob_type->tp_as_number->nb_coerce) {
492 res = (*w->ob_type->tp_as_number->nb_coerce)(pw, pv);
493 if (res <= 0)
494 return res;
495 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyErr_SetString(PyExc_TypeError, "number coercion failed");
Guido van Rossum5524a591995-01-10 15:26:20 +0000497 return -1;
498}
499
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000500
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000501/* Test whether an object can be called */
502
503int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000504PyCallable_Check(x)
505 PyObject *x;
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000506{
507 if (x == NULL)
508 return 0;
509 if (x->ob_type->tp_call != NULL ||
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 PyFunction_Check(x) ||
511 PyMethod_Check(x) ||
512 PyCFunction_Check(x) ||
513 PyClass_Check(x))
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000514 return 1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 if (PyInstance_Check(x)) {
516 PyObject *call = PyObject_GetAttrString(x, "__call__");
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000517 if (call == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000518 PyErr_Clear();
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000519 return 0;
520 }
521 /* Could test recursively but don't, for fear of endless
522 recursion if some joker sets self.__call__ = self */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 Py_DECREF(call);
Guido van Rossum49b11fe1995-01-26 00:38:22 +0000524 return 1;
525 }
526 return 0;
527}
528
529
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000530/*
531NoObject is usable as a non-NULL undefined value, used by the macro None.
532There is (and should be!) no way to create other objects of this type,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000533so there is exactly one (which is indestructible, by the way).
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000534*/
535
Guido van Rossum0c182a11992-03-27 17:26:13 +0000536/* ARGSUSED */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +0000538none_repr(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000540{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541 return PyString_FromString("None");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542}
543
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544static PyTypeObject PyNothing_Type = {
545 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +0000547 "None",
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548 0,
549 0,
550 0, /*tp_dealloc*/ /*never called*/
Guido van Rossum7066dd71992-09-17 17:54:56 +0000551 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000552 0, /*tp_getattr*/
553 0, /*tp_setattr*/
554 0, /*tp_compare*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000555 (reprfunc)none_repr, /*tp_repr*/
Guido van Rossum3f5da241990-12-20 15:06:42 +0000556 0, /*tp_as_number*/
557 0, /*tp_as_sequence*/
558 0, /*tp_as_mapping*/
Guido van Rossum9bfef441993-03-29 10:43:31 +0000559 0, /*tp_hash */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560};
561
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000562PyObject _Py_NoneStruct = {
563 PyObject_HEAD_INIT(&PyNothing_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564};
565
566
Guido van Rossum84a90321996-05-22 16:34:47 +0000567#ifdef Py_TRACE_REFS
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569static PyObject refchain = {&refchain, &refchain};
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000570
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000571void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000572_Py_NewReference(op)
573 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575 _Py_RefTotal++;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000576 op->ob_refcnt = 1;
577 op->_ob_next = refchain._ob_next;
578 op->_ob_prev = &refchain;
579 refchain._ob_next->_ob_prev = op;
580 refchain._ob_next = op;
Sjoerd Mullendera9c3c221993-10-11 12:54:31 +0000581#ifdef COUNT_ALLOCS
582 inc_count(op->ob_type);
583#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000584}
585
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000586void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000587_Py_ForgetReference(op)
588 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000589{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 register PyObject *p;
Guido van Rossumd7047b31995-01-02 19:07:15 +0000591 if (op->ob_refcnt < 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000592 Py_FatalError("UNREF negative refcnt");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000593 if (op == &refchain ||
Guido van Rossumd7047b31995-01-02 19:07:15 +0000594 op->_ob_prev->_ob_next != op || op->_ob_next->_ob_prev != op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 Py_FatalError("UNREF invalid object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000596#ifdef SLOW_UNREF_CHECK
Guido van Rossum3f5da241990-12-20 15:06:42 +0000597 for (p = refchain._ob_next; p != &refchain; p = p->_ob_next) {
598 if (p == op)
599 break;
600 }
Guido van Rossumd7047b31995-01-02 19:07:15 +0000601 if (p == &refchain) /* Not found */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000602 Py_FatalError("UNREF unknown object");
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000603#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000604 op->_ob_next->_ob_prev = op->_ob_prev;
605 op->_ob_prev->_ob_next = op->_ob_next;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000606 op->_ob_next = op->_ob_prev = NULL;
Guido van Rossumd8953cb1995-04-06 14:46:26 +0000607#ifdef COUNT_ALLOCS
608 op->ob_type->tp_free++;
609#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +0000610}
611
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000612void
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000613_Py_Dealloc(op)
614 PyObject *op;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000615{
Guido van Rossum9776adf1994-09-07 14:36:45 +0000616 destructor dealloc = op->ob_type->tp_dealloc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000617 _Py_ForgetReference(op);
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000618 op->ob_type = NULL;
Guido van Rossum9776adf1994-09-07 14:36:45 +0000619 (*dealloc)(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000620}
621
Guido van Rossumaacdc9d1996-08-12 21:32:12 +0000622void
Guido van Rossumded690f1996-05-24 20:48:31 +0000623_Py_PrintReferences(fp)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000624 FILE *fp;
625{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000626 PyObject *op;
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000627 fprintf(fp, "Remaining objects (except strings referenced once):\n");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000628 for (op = refchain._ob_next; op != &refchain; op = op->_ob_next) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000629 if (op->ob_refcnt == 1 && PyString_Check(op))
Guido van Rossum2e8f6141992-09-03 20:32:55 +0000630 continue; /* Will be printed elsewhere */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000631 fprintf(fp, "[%d] ", op->ob_refcnt);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000632 if (PyObject_Print(op, fp, 0) != 0)
633 PyErr_Clear();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000634 putc('\n', fp);
635 }
636}
637
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000638PyObject *
Guido van Rossumded690f1996-05-24 20:48:31 +0000639_Py_GetObjects(self, args)
Sjoerd Mullender6ec3c651995-08-29 09:18:14 +0000640 PyObject *self;
641 PyObject *args;
642{
643 int i, n;
644 PyObject *t = NULL;
645 PyObject *res, *op;
646
647 if (!PyArg_ParseTuple(args, "i|O", &n, &t))
648 return NULL;
649 op = refchain._ob_next;
650 res = PyList_New(0);
651 if (res == NULL)
652 return NULL;
653 for (i = 0; (n == 0 || i < n) && op != &refchain; i++) {
654 while (op == self || op == args || op == res || op == t ||
655 t != NULL && op->ob_type != (PyTypeObject *) t) {
656 op = op->_ob_next;
657 if (op == &refchain)
658 return res;
659 }
660 if (PyList_Append(res, op) < 0) {
661 Py_DECREF(res);
662 return NULL;
663 }
664 op = op->_ob_next;
665 }
666 return res;
667}
668
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000669#endif
Guido van Rossum97ead3f1996-01-12 01:24:09 +0000670
671
672/* Hack to force loading of cobject.o */
Guido van Rossumda9c2711996-12-05 21:58:58 +0000673PyTypeObject *_Py_cobject_hack = &PyCObject_Type;
Guido van Rossum84a90321996-05-22 16:34:47 +0000674
675
676/* Hack to force loading of abstract.o */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000677int (*_Py_abstract_hack) Py_FPROTO((PyObject *)) = &PyObject_Length;