summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2004-07-16 12:16:48 (GMT)
committerRaymond Hettinger <python@rcn.com>2004-07-16 12:16:48 (GMT)
commit76d962d7007387914f7ea52ec659045f9b536dfa (patch)
treea6f01d96b13b8aac134d9cbc6fe2e45f6b835581
parent11d9b0628396749eaf9bc7f8a0e37f0cd46d75bf (diff)
downloadcpython-76d962d7007387914f7ea52ec659045f9b536dfa.zip
cpython-76d962d7007387914f7ea52ec659045f9b536dfa.tar.gz
cpython-76d962d7007387914f7ea52ec659045f9b536dfa.tar.bz2
Treat None as a constant.
-rw-r--r--Misc/NEWS2
-rw-r--r--Python/compile.c24
2 files changed, 22 insertions, 4 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 1619d06..151d3bf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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);