diff options
Diffstat (limited to 'Python/peephole.c')
-rw-r--r-- | Python/peephole.c | 54 |
1 files changed, 6 insertions, 48 deletions
diff --git a/Python/peephole.c b/Python/peephole.c index 5d53677..a49790a 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -327,37 +327,6 @@ markblocks(unsigned char *code, Py_ssize_t len) return blocks; } -/* Helper to replace LOAD_NAME None/True/False with LOAD_CONST - Returns: 0 if no change, 1 if change, -1 if error */ -static int -load_global(unsigned char *codestr, Py_ssize_t i, char *name, PyObject *consts) -{ - Py_ssize_t j; - PyObject *obj; - if (name == NULL) - return 0; - if (strcmp(name, "None") == 0) - obj = Py_None; - else if (strcmp(name, "True") == 0) - obj = Py_True; - else if (strcmp(name, "False") == 0) - obj = Py_False; - else - return 0; - for (j = 0; j < PyList_GET_SIZE(consts); j++) { - if (PyList_GET_ITEM(consts, j) == obj) - break; - } - if (j == PyList_GET_SIZE(consts)) { - if (PyList_Append(consts, obj) < 0) - return -1; - } - assert(PyList_GET_ITEM(consts, j) == obj); - codestr[i] = LOAD_CONST; - SETARG(codestr, i, j); - return 1; -} - /* Perform basic peephole optimizations to components of a code object. The consts object should still be in list form to allow new constants to be appended. @@ -392,7 +361,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, Py_ssize_t const_stack_size = 0; int in_consts = 0; /* whether we are in a LOAD_CONST sequence */ unsigned int *blocks = NULL; - char *name; /* Bail out if an exception is set */ if (PyErr_Occurred()) @@ -413,8 +381,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Make a modifiable copy of the code string */ codestr = (unsigned char *)PyMem_Malloc(codelen); - if (codestr == NULL) + if (codestr == NULL) { + PyErr_NoMemory(); goto exitError; + } codestr = (unsigned char *)memcpy(codestr, PyBytes_AS_STRING(code), codelen); @@ -428,8 +398,10 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, /* Mapping to new jump targets after NOPs are removed */ addrmap = (int *)PyMem_Malloc(codelen * sizeof(int)); - if (addrmap == NULL) + if (addrmap == NULL) { + PyErr_NoMemory(); goto exitError; + } blocks = markblocks(codestr, codelen); if (blocks == NULL) @@ -475,20 +447,6 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names, codestr[i+3] = NOP; break; - /* Replace LOAD_GLOBAL/LOAD_NAME None/True/False - with LOAD_CONST None/True/False */ - case LOAD_NAME: - case LOAD_GLOBAL: - j = GETARG(codestr, i); - name = _PyUnicode_AsString(PyTuple_GET_ITEM(names, j)); - h = load_global(codestr, i, name, consts); - if (h < 0) - goto exitError; - else if (h == 0) - continue; - CONST_STACK_PUSH_OP(i); - break; - /* Skip over LOAD_CONST trueconst POP_JUMP_IF_FALSE xx. This improves "while 1" performance. */ |