X-Git-Url: https://git.distorted.org.uk/~mdw/pyke/blobdiff_plain/138563a571351c06c09fba7c6ed3d1f79fdd974d..1b026fd1dd2b1565ade497fc9addf0823758430f:/pyke.h diff --git a/pyke.h b/pyke.h index e7a1ece..64608d9 100644 --- a/pyke.h +++ b/pyke.h @@ -208,11 +208,11 @@ extern void *newtype(PyTypeObject */*meta*/, extern void typeready(PyTypeObject *); /* The type object is now ready to be used. */ -extern PyTypeObject *inittype(PyTypeObject */*skel*/, +extern PyTypeObject *inittype(const PyTypeObject */*skel*/, + PyTypeObject */*base*/, PyTypeObject */*meta*/); /* All-in-one function to construct a working type from a type skeleton - * SKEL, with metaclass META. The caller is expected to have filled in the - * direct superclass in SKEL->tp_base. + * SKEL, with known base type BASE (null for `object') and metaclass. */ /* Alias for built-in types, to fit in with Pyke naming conventions. */ @@ -220,8 +220,7 @@ extern PyTypeObject *inittype(PyTypeObject */*skel*/, #define type_pytype &PyType_Type #define INITTYPE_META(ty, base, meta) do { \ - ty##_pytype_skel.tp_base = base##_pytype; \ - ty##_pytype = inittype(&ty##_pytype_skel, meta##_pytype); \ + ty##_pytype = inittype(&ty##_pytype_skel, base##_pytype, meta##_pytype); \ } while (0) #define INITTYPE(ty, base) INITTYPE_META(ty, base, type) /* Macros to initialize a type from its skeleton. */ @@ -271,15 +270,16 @@ extern PyTypeObject *inittype(PyTypeObject */*skel*/, #define GETSET(func, doc) \ { #func, GETSETNAME(get, func), GETSETNAME(set, func), doc }, -/* Convenience wrapper for filling in `PyMemberDef' tables. Define +/* Convenience wrappers for filling in `PyMemberDef' tables. Define * `MEMBERSTRUCT' locally as * * #define MEMBERSTRUCT foo_pyobj * * around the member table. */ -#define MEMBER(name, ty, f, doc) \ - { #name, ty, offsetof(MEMBERSTRUCT, name), f, doc }, +#define MEMRNM(name, ty, mem, f, doc) \ + { #name, ty, offsetof(MEMBERSTRUCT, mem), f, doc }, +#define MEMBER(name, ty, f, doc) MEMRNM(name, ty, name, f, doc) /* Wrappers for filling in pointers in a `PyTypeObject' structure, (a) * following Pyke naming convention, and (b) stripping `const' from the types @@ -321,6 +321,8 @@ extern PyObject *mkexc(PyObject */*mod*/, PyObject */*base*/, struct nameval { const char *name; unsigned f; unsigned long value; }; #define CF_SIGNED 1u extern void setconstants(PyObject *, const struct nameval *); +#define CONST(x) { #x, (x) >= 0 ? 0 : CF_SIGNED, x } +#define CONSTFLAG(f, x) { #x, f, x } #define INSEXC(name, var, base, meth) \ INSERT(name, var = mkexc(mod, base, name, meth))