diff options
author | Raymond Hettinger <python@rcn.com> | 2004-07-16 12:16:48 (GMT) |
---|---|---|
committer | Raymond Hettinger <python@rcn.com> | 2004-07-16 12:16:48 (GMT) |
commit | 76d962d7007387914f7ea52ec659045f9b536dfa (patch) | |
tree | a6f01d96b13b8aac134d9cbc6fe2e45f6b835581 | |
parent | 11d9b0628396749eaf9bc7f8a0e37f0cd46d75bf (diff) | |
download | cpython-76d962d7007387914f7ea52ec659045f9b536dfa.zip cpython-76d962d7007387914f7ea52ec659045f9b536dfa.tar.gz cpython-76d962d7007387914f7ea52ec659045f9b536dfa.tar.bz2 |
Treat None as a constant.
-rw-r--r-- | Misc/NEWS | 2 | ||||
-rw-r--r-- | Python/compile.c | 24 |
2 files changed, 22 insertions, 4 deletions
@@ -26,6 +26,8 @@ Core and builtins - Added C macros Py_CLEAR and Py_VISIT to ease the implementation of types that support garbage collection. +- Compiler now treats None as a constant. + Extension modules ----------------- diff --git a/Python/compile.c b/Python/compile.c index 0d230d6..ca8dd26 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -363,12 +363,13 @@ markblocks(unsigned char *code, int len) } static PyObject * -optimize_code(PyObject *code, PyObject* consts) +optimize_code(PyObject *code, PyObject* consts, PyObject *names) { int i, j, codelen; int tgt, tgttgt, opcode; unsigned char *codestr; unsigned int *blocks; + char *name; /* Make a modifiable copy of the code string */ if (!PyString_Check(code)) @@ -418,6 +419,21 @@ optimize_code(PyObject *code, PyObject* consts) continue; SETARG(codestr, i, (j^1)); codestr[i+3] = NOP; + + /* Replace LOAD_GLOBAL/LOAD_NAME None with LOAD_CONST None */ + case LOAD_NAME: + case LOAD_GLOBAL: + j = GETARG(codestr, i); + name = PyString_AsString(PyTuple_GET_ITEM(names, j)); + if (name == NULL || strcmp(name, "None") != 0) + continue; + for (j=0 ; j < PyTuple_GET_SIZE(consts) ; j++) { + if (PyTuple_GET_ITEM(consts, j) == Py_None) { + codestr[i] = LOAD_CONST; + SETARG(codestr, i, j); + break; + } + } break; /* Skip over LOAD_CONST trueconst JUMP_IF_FALSE xx POP_TOP. @@ -441,7 +457,7 @@ optimize_code(PyObject *code, PyObject* consts) continue; if (!ISBASICBLOCK(blocks,i,6)) continue; - if (GETARG(codestr, i) == 2 && \ + if (GETARG(codestr, i) == 2 && GETARG(codestr, i+3) == 2) { codestr[i] = ROT_TWO; codestr[i+1] = JUMP_FORWARD; @@ -450,7 +466,7 @@ optimize_code(PyObject *code, PyObject* consts) codestr[i+5] = NOP; continue; } - if (GETARG(codestr, i) == 3 && \ + if (GETARG(codestr, i) == 3 && GETARG(codestr, i+3) == 3) { codestr[i] = ROT_THREE; codestr[i+1] = ROT_TWO; @@ -542,7 +558,7 @@ PyCode_New(int argcount, int nlocals, int stacksize, int flags, co->co_nlocals = nlocals; co->co_stacksize = stacksize; co->co_flags = flags; - co->co_code = optimize_code(code, consts); + co->co_code = optimize_code(code, consts, names); Py_INCREF(consts); co->co_consts = consts; Py_INCREF(names); |