blob: 23236da0f714fe20ffa3185bc9962aea88f84161 [file] [log] [blame]
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001/* Function object implementation */
2
Guido van Rossum3f5da241990-12-20 15:06:42 +00003#include "allobjects.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00004
Guido van Rossum3f5da241990-12-20 15:06:42 +00005#include "structmember.h"
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00006
7typedef struct {
8 OB_HEAD
Guido van Rossum846e4311990-11-18 17:44:06 +00009 object *func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000010 object *func_globals;
11} funcobject;
12
13object *
Guido van Rossum846e4311990-11-18 17:44:06 +000014newfuncobject(code, globals)
15 object *code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000016 object *globals;
17{
18 funcobject *op = NEWOBJ(funcobject, &Functype);
19 if (op != NULL) {
Guido van Rossum846e4311990-11-18 17:44:06 +000020 INCREF(code);
21 op->func_code = code;
22 INCREF(globals);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000023 op->func_globals = globals;
24 }
25 return (object *)op;
26}
27
Guido van Rossum846e4311990-11-18 17:44:06 +000028object *
29getfunccode(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000030 object *op;
31{
32 if (!is_funcobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000033 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000034 return NULL;
35 }
Guido van Rossum846e4311990-11-18 17:44:06 +000036 return ((funcobject *) op) -> func_code;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000037}
38
39object *
40getfuncglobals(op)
41 object *op;
42{
43 if (!is_funcobject(op)) {
Guido van Rossum2a9096b1990-10-21 22:15:08 +000044 err_badcall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000045 return NULL;
46 }
47 return ((funcobject *) op) -> func_globals;
48}
49
50/* Methods */
51
Guido van Rossum3f5da241990-12-20 15:06:42 +000052#define OFF(x) offsetof(funcobject, x)
53
54static struct memberlist func_memberlist[] = {
55 {"func_code", T_OBJECT, OFF(func_code)},
56 {"func_globals",T_OBJECT, OFF(func_globals)},
57 {NULL} /* Sentinel */
58};
59
60static object *
61func_getattr(op, name)
62 funcobject *op;
63 char *name;
64{
65 return getmember((char *)op, func_memberlist, name);
66}
67
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000068static void
Guido van Rossum3f5da241990-12-20 15:06:42 +000069func_dealloc(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000070 funcobject *op;
71{
Guido van Rossum846e4311990-11-18 17:44:06 +000072 DECREF(op->func_code);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000073 DECREF(op->func_globals);
Guido van Rossum846e4311990-11-18 17:44:06 +000074 DEL(op);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075}
76
77typeobject Functype = {
78 OB_HEAD_INIT(&Typetype)
79 0,
80 "function",
81 sizeof(funcobject),
82 0,
Guido van Rossum3f5da241990-12-20 15:06:42 +000083 func_dealloc, /*tp_dealloc*/
Guido van Rossum846e4311990-11-18 17:44:06 +000084 0, /*tp_print*/
Guido van Rossum3f5da241990-12-20 15:06:42 +000085 func_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 0, /*tp_setattr*/
87 0, /*tp_compare*/
Guido van Rossum846e4311990-11-18 17:44:06 +000088 0, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089};