From aa32070f4d7b7151974e70b407b0f0dc2a836313 Mon Sep 17 00:00:00 2001 From: Tim Peters Date: Sat, 18 Aug 2001 20:18:49 +0000 Subject: [PATCH] Expose the CO_xxx flags via the "new" module (re-solving a problem "the right way"). Fiddle __future__.py to use them. Jeremy's pyassem.py may also want to use them (by-hand duplication of magic numbers is brittle), but leaving that to his judgment. Beef up __future__'s test to verify the exported feature names appear correct. --- Lib/__future__.py | 15 ++++----------- Lib/test/test___future__.py | 13 +++++++++++++ Modules/newmodule.c | 33 +++++++++++++++++++++++++++++++-- 3 files changed, 48 insertions(+), 13 deletions(-) diff --git a/Lib/__future__.py b/Lib/__future__.py index ef9fd3607cf..5a6483832e8 100644 --- a/Lib/__future__.py +++ b/Lib/__future__.py @@ -55,14 +55,7 @@ all_feature_names = [ __all__ = ["all_feature_names"] + all_feature_names - -# The CO_xxx symbols are defined here under the same names used by -# compile.h, so that an editor search will find them here. However, -# they're not exported in __all__, because they don't really belong to -# this module. -CO_NESTED = 0x0010 # nested_scopes -CO_GENERATOR_ALLOWED = 0x1000 # generators -CO_FUTURE_DIVISION = 0x2000 # division +import new as _new # for CO_xxx symbols class _Feature: def __init__(self, optionalRelease, mandatoryRelease, compiler_flag): @@ -93,12 +86,12 @@ class _Feature: nested_scopes = _Feature((2, 1, 0, "beta", 1), (2, 2, 0, "alpha", 0), - CO_NESTED) + _new.CO_NESTED) generators = _Feature((2, 2, 0, "alpha", 1), (2, 3, 0, "final", 0), - CO_GENERATOR_ALLOWED) + _new.CO_GENERATOR_ALLOWED) division = _Feature((2, 2, 0, "alpha", 2), (3, 0, 0, "alpha", 0), - CO_FUTURE_DIVISION) + _new.CO_FUTURE_DIVISION) diff --git a/Lib/test/test___future__.py b/Lib/test/test___future__.py index 1897c14b7ff..fa8224f7b02 100644 --- a/Lib/test/test___future__.py +++ b/Lib/test/test___future__.py @@ -6,6 +6,19 @@ import __future__ GOOD_SERIALS = ("alpha", "beta", "candidate", "final") features = __future__.all_feature_names + +# Verify that all_feature_names appears correct. +given_feature_names = features[:] +for name in dir(__future__): + obj = getattr(__future__, name, None) + if obj is not None and isinstance(obj, __future__._Feature): + verify(name in given_feature_names, + "%r should have been in all_feature_names" % name) + given_feature_names.remove(name) +verify(len(given_feature_names) == 0, + "all_feature_names has too much: %r" % given_feature_names) +del given_feature_names + for feature in features: value = getattr(__future__, feature) if verbose: diff --git a/Modules/newmodule.c b/Modules/newmodule.c index 7b91fb8bc3e..d1869e5a550 100644 --- a/Modules/newmodule.c +++ b/Modules/newmodule.c @@ -220,9 +220,38 @@ char new_doc[] = \n\ You need to know a great deal about the interpreter to use this!"; +static void +insertint(PyObject *d, char *name, int value) +{ + PyObject *v = PyInt_FromLong((long) value); + if (v == NULL) { + /* Don't bother reporting this error */ + PyErr_Clear(); + } + else { + PyDict_SetItemString(d, name, v); + Py_DECREF(v); + } +} + DL_EXPORT(void) initnew(void) { - Py_InitModule4("new", new_methods, new_doc, (PyObject *)NULL, - PYTHON_API_VERSION); + PyObject *m; + PyObject *d; + + m = Py_InitModule4("new", new_methods, new_doc, (PyObject *)NULL, + PYTHON_API_VERSION); + d = PyModule_GetDict(m); + +#define ADDSYM(TOKEN) insertint(d, #TOKEN, TOKEN) + ADDSYM(CO_OPTIMIZED); + ADDSYM(CO_NEWLOCALS); + ADDSYM(CO_VARARGS); + ADDSYM(CO_VARKEYWORDS); + ADDSYM(CO_NESTED); + ADDSYM(CO_GENERATOR); + ADDSYM(CO_GENERATOR_ALLOWED); + ADDSYM(CO_FUTURE_DIVISION); +#undef ADDSYM }