| /* Function object implementation */ |
| |
| #include <stdio.h> |
| |
| #include "PROTO.h" |
| #include "object.h" |
| #include "node.h" |
| #include "stringobject.h" |
| #include "funcobject.h" |
| #include "objimpl.h" |
| #include "token.h" |
| |
| typedef struct { |
| OB_HEAD |
| node *func_node; |
| object *func_globals; |
| } funcobject; |
| |
| object * |
| newfuncobject(n, globals) |
| node *n; |
| object *globals; |
| { |
| funcobject *op = NEWOBJ(funcobject, &Functype); |
| if (op != NULL) { |
| op->func_node = n; |
| if (globals != NULL) |
| INCREF(globals); |
| op->func_globals = globals; |
| } |
| return (object *)op; |
| } |
| |
| node * |
| getfuncnode(op) |
| object *op; |
| { |
| if (!is_funcobject(op)) { |
| err_badcall(); |
| return NULL; |
| } |
| return ((funcobject *) op) -> func_node; |
| } |
| |
| object * |
| getfuncglobals(op) |
| object *op; |
| { |
| if (!is_funcobject(op)) { |
| err_badcall(); |
| return NULL; |
| } |
| return ((funcobject *) op) -> func_globals; |
| } |
| |
| /* Methods */ |
| |
| static void |
| funcdealloc(op) |
| funcobject *op; |
| { |
| /* XXX free node? */ |
| DECREF(op->func_globals); |
| free((char *)op); |
| } |
| |
| static void |
| funcprint(op, fp, flags) |
| funcobject *op; |
| FILE *fp; |
| int flags; |
| { |
| node *n = op->func_node; |
| n = CHILD(n, 1); |
| fprintf(fp, "<user function %s>", STR(n)); |
| } |
| |
| static object * |
| funcrepr(op) |
| funcobject *op; |
| { |
| char buf[100]; |
| node *n = op->func_node; |
| n = CHILD(n, 1); |
| sprintf(buf, "<user function %.80s>", STR(n)); |
| return newstringobject(buf); |
| } |
| |
| typeobject Functype = { |
| OB_HEAD_INIT(&Typetype) |
| 0, |
| "function", |
| sizeof(funcobject), |
| 0, |
| funcdealloc, /*tp_dealloc*/ |
| funcprint, /*tp_print*/ |
| 0, /*tp_getattr*/ |
| 0, /*tp_setattr*/ |
| 0, /*tp_compare*/ |
| funcrepr, /*tp_repr*/ |
| }; |