blob: c67d6d32879879bd45bf030fd80c76cf10af2652 [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 Rossum85a5fbb1990-10-14 12:07:46 +000032/* Function object implementation */
33
Guido van Rossum3f5da241990-12-20 15:06:42 +000034#include "allobjects.h"
Guido van Rossum9bfef441993-03-29 10:43:31 +000035#include "compile.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000036#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000038object *
Guido van Rossum846e4311990-11-18 17:44:06 +000039newfuncobject(code, globals)
40 object *code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041 object *globals;
42{
43 funcobject *op = NEWOBJ(funcobject, &Functype);
44 if (op != NULL) {
Guido van Rossum5bd38051995-01-07 12:01:30 +000045 object *doc;
46 object *consts;
Guido van Rossum846e4311990-11-18 17:44:06 +000047 INCREF(code);
48 op->func_code = code;
49 INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000050 op->func_globals = globals;
Guido van Rossum5bd38051995-01-07 12:01:30 +000051 op->func_name = ((codeobject *)code)->co_name;
Guido van Rossum25831651993-05-19 14:50:45 +000052 INCREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +000053 op->func_defaults = NULL; /* No default arguments */
Guido van Rossum5bd38051995-01-07 12:01:30 +000054 consts = ((codeobject *)code)->co_consts;
55 if (gettuplesize(consts) >= 1) {
56 doc = gettupleitem(consts, 0);
57 if (!is_stringobject(doc))
58 doc = None;
59 }
60 else
61 doc = None;
62 INCREF(doc);
63 op->func_doc = doc;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 }
65 return (object *)op;
66}
67
Guido van Rossum846e4311990-11-18 17:44:06 +000068object *
69getfunccode(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 object *op;
71{
72 if (!is_funcobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000073 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 return NULL;
75 }
Guido van Rossum846e4311990-11-18 17:44:06 +000076 return ((funcobject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077}
78
79object *
80getfuncglobals(op)
81 object *op;
82{
83 if (!is_funcobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000084 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 return NULL;
86 }
87 return ((funcobject *) op) -> func_globals;
88}
89
Guido van Rossum1d5735e1994-08-30 08:27:36 +000090object *
Guido van Rossum2271bf71995-07-18 14:30:34 +000091PyFunction_GetDefaults(op)
Guido van Rossum1d5735e1994-08-30 08:27:36 +000092 object *op;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000093{
94 if (!is_funcobject(op)) {
95 err_badcall();
96 return NULL;
97 }
Guido van Rossum2271bf71995-07-18 14:30:34 +000098 return ((funcobject *) op) -> func_defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +000099}
100
101int
Guido van Rossum2271bf71995-07-18 14:30:34 +0000102PyFunction_SetDefaults(op, defaults)
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000103 object *op;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000104 object *defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000105{
Guido van Rossum2271bf71995-07-18 14:30:34 +0000106 if (!is_funcobject(op)) {
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000107 err_badcall();
108 return -1;
109 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000110 if (defaults == None)
111 defaults = NULL;
112 else if (is_tupleobject(defaults))
113 XINCREF(defaults);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000114 else {
115 err_setstr(SystemError, "non-tuple default args");
116 return -1;
117 }
Guido van Rossum2271bf71995-07-18 14:30:34 +0000118 XDECREF(((funcobject *) op) -> func_defaults);
119 ((funcobject *) op) -> func_defaults = defaults;
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000120 return 0;
121}
122
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123/* Methods */
124
Guido van Rossum3f5da241990-12-20 15:06:42 +0000125#define OFF(x) offsetof(funcobject, x)
126
127static struct memberlist func_memberlist[] = {
Guido van Rossuma38c0ff1992-01-14 18:32:20 +0000128 {"func_code", T_OBJECT, OFF(func_code), READONLY},
129 {"func_globals",T_OBJECT, OFF(func_globals), READONLY},
Guido van Rossum25831651993-05-19 14:50:45 +0000130 {"func_name", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum10393b11995-01-10 10:39:49 +0000131 {"__name__", T_OBJECT, OFF(func_name), READONLY},
Guido van Rossum2271bf71995-07-18 14:30:34 +0000132 {"func_defaults",T_OBJECT, OFF(func_defaults), READONLY},
Guido van Rossum5bd38051995-01-07 12:01:30 +0000133 {"func_doc", T_OBJECT, OFF(func_doc)},
134 {"__doc__", T_OBJECT, OFF(func_doc)},
Guido van Rossum3f5da241990-12-20 15:06:42 +0000135 {NULL} /* Sentinel */
136};
137
138static object *
139func_getattr(op, name)
140 funcobject *op;
141 char *name;
142{
Guido van Rossum10393b11995-01-10 10:39:49 +0000143 if (name[0] != '_' && getrestricted()) {
144 err_setstr(RuntimeError,
145 "function attributes not accessible in restricted mode");
146 return NULL;
147 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000148 return getmember((char *)op, func_memberlist, name);
149}
150
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151static void
Guido van Rossum3f5da241990-12-20 15:06:42 +0000152func_dealloc(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000153 funcobject *op;
154{
Guido van Rossum846e4311990-11-18 17:44:06 +0000155 DECREF(op->func_code);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 DECREF(op->func_globals);
Guido van Rossume9c6bcd1995-01-20 16:58:19 +0000157 DECREF(op->func_name);
Guido van Rossum2271bf71995-07-18 14:30:34 +0000158 XDECREF(op->func_defaults);
Guido van Rossum5bd38051995-01-07 12:01:30 +0000159 XDECREF(op->func_doc);
Guido van Rossum846e4311990-11-18 17:44:06 +0000160 DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000161}
162
Guido van Rossum9bfef441993-03-29 10:43:31 +0000163static object*
164func_repr(op)
165 funcobject *op;
166{
167 char buf[140];
Guido van Rossum590baa41993-11-30 13:40:46 +0000168 if (op->func_name == None)
169 sprintf(buf, "<anonymous function at %lx>", (long)op);
170 else
171 sprintf(buf, "<function %.100s at %lx>",
172 getstringvalue(op->func_name),
173 (long)op);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000174 return newstringobject(buf);
175}
176
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000177static int
178func_compare(f, g)
179 funcobject *f, *g;
180{
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000181 int c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000182 if (f->func_globals != g->func_globals)
183 return (f->func_globals < g->func_globals) ? -1 : 1;
Guido van Rossum2271bf71995-07-18 14:30:34 +0000184 c = cmpobject(f->func_defaults, g->func_defaults);
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000185 if (c != 0)
186 return c;
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000187 return cmpobject(f->func_code, g->func_code);
188}
189
190static long
191func_hash(f)
192 funcobject *f;
193{
194 long h;
195 h = hashobject(f->func_code);
196 if (h == -1) return h;
197 h = h ^ (long)f->func_globals;
198 if (h == -1) h = -2;
199 return h;
200}
201
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202typeobject Functype = {
203 OB_HEAD_INIT(&Typetype)
204 0,
205 "function",
206 sizeof(funcobject),
207 0,
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000208 (destructor)func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +0000209 0, /*tp_print*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000210 (getattrfunc)func_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000211 0, /*tp_setattr*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000212 (cmpfunc)func_compare, /*tp_compare*/
213 (reprfunc)func_repr, /*tp_repr*/
Guido van Rossum2e8f8a31993-11-05 10:20:10 +0000214 0, /*tp_as_number*/
215 0, /*tp_as_sequence*/
216 0, /*tp_as_mapping*/
Guido van Rossum1d5735e1994-08-30 08:27:36 +0000217 (hashfunc)func_hash, /*tp_hash*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000218};