summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1991-12-16 13:07:24 (GMT)
committerGuido van Rossum <guido@python.org>1991-12-16 13:07:24 (GMT)
commitc06022966f58b7130e0a8b7150d1955865c84dc8 (patch)
tree61b860da9f4a15dd879cc7bc1cd0395108e1fc92
parent3ddee714d1d4473f8fa04a6d8356d3eafb695a50 (diff)
downloadcpython-c06022966f58b7130e0a8b7150d1955865c84dc8.zip
cpython-c06022966f58b7130e0a8b7150d1955865c84dc8.tar.gz
cpython-c06022966f58b7130e0a8b7150d1955865c84dc8.tar.bz2
Add "varargs" attribute.
-rw-r--r--Include/methodobject.h8
-rw-r--r--Objects/methodobject.c25
-rw-r--r--Python/modsupport.c2
3 files changed, 26 insertions, 9 deletions
diff --git a/Include/methodobject.h b/Include/methodobject.h
index 262208d..e8d795e 100644
--- a/Include/methodobject.h
+++ b/Include/methodobject.h
@@ -30,13 +30,15 @@ extern typeobject Methodtype;
typedef object *(*method) FPROTO((object *, object *));
-extern object *newmethodobject PROTO((char *, method, object *));
+extern object *newmethodobject PROTO((char *, method, object *, int));
extern method getmethod PROTO((object *));
extern object *getself PROTO((object *));
+extern int getvarargs PROTO((object *));
struct methodlist {
- char *ml_name;
- method ml_meth;
+ char *ml_name;
+ method ml_meth;
+ int ml_varargs;
};
extern object *findmethod PROTO((struct methodlist *, object *, char *));
diff --git a/Objects/methodobject.c b/Objects/methodobject.c
index 3ebdb37..98b70a6 100644
--- a/Objects/methodobject.c
+++ b/Objects/methodobject.c
@@ -30,16 +30,18 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
typedef struct {
OB_HEAD
- char *m_name;
- method m_meth;
- object *m_self;
+ char *m_name;
+ method m_meth;
+ object *m_self;
+ int m_varargs;
} methodobject;
object *
-newmethodobject(name, meth, self)
+newmethodobject(name, meth, self, varargs)
char *name; /* static string */
method meth;
object *self;
+ int varargs;
{
methodobject *op = NEWOBJ(methodobject, &Methodtype);
if (op != NULL) {
@@ -48,6 +50,7 @@ newmethodobject(name, meth, self)
if (self != NULL)
INCREF(self);
op->m_self = self;
+ op->m_varargs = varargs;
}
return (object *)op;
}
@@ -74,6 +77,17 @@ getself(op)
return ((methodobject *)op) -> m_self;
}
+int
+getvarargs(op)
+ object *op;
+{
+ if (!is_methodobject(op)) {
+ err_badcall();
+ return -1;
+ }
+ return ((methodobject *)op) -> m_varargs;
+}
+
/* Methods (the standard built-in methods, that is) */
static void
@@ -168,7 +182,8 @@ findmethod(ml, op, name)
return listmethods(ml);
for (; ml->ml_name != NULL; ml++) {
if (strcmp(name, ml->ml_name) == 0)
- return newmethodobject(ml->ml_name, ml->ml_meth, op);
+ return newmethodobject(ml->ml_name, ml->ml_meth,
+ op, ml->ml_varargs);
}
err_setstr(AttributeError, name);
return NULL;
diff --git a/Python/modsupport.c b/Python/modsupport.c
index 5d56241..7deded4 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -45,7 +45,7 @@ initmodule(name, methods)
for (ml = methods; ml->ml_name != NULL; ml++) {
sprintf(namebuf, "%s.%s", name, ml->ml_name);
v = newmethodobject(strdup(namebuf), ml->ml_meth,
- (object *)NULL);
+ (object *)NULL, ml->ml_varargs);
/* XXX The strdup'ed memory is never freed */
if (v == NULL || dictinsert(d, ml->ml_name, v) != 0) {
fprintf(stderr, "initializing module: %s\n", name);