diff options
Diffstat (limited to 'Python/peephole.c')
| -rw-r--r-- | Python/peephole.c | 15 | 
1 files changed, 12 insertions, 3 deletions
| diff --git a/Python/peephole.c b/Python/peephole.c index c56c8fc..59ad3b7 100644 --- a/Python/peephole.c +++ b/Python/peephole.c @@ -18,7 +18,11 @@      || op==JUMP_IF_FALSE_OR_POP || op==JUMP_IF_TRUE_OR_POP)  #define JUMPS_ON_TRUE(op) (op==POP_JUMP_IF_TRUE || op==JUMP_IF_TRUE_OR_POP)  #define GETJUMPTGT(arr, i) (GETARG(arr,i) + (ABSOLUTE_JUMP(arr[i]) ? 0 : i+3)) -#define SETARG(arr, i, val) arr[i+2] = val>>8; arr[i+1] = val & 255 +#define SETARG(arr, i, val) do {                            \ +    assert(0 <= val && val <= 0xffff);                      \ +    arr[i+2] = (unsigned char)(((unsigned int)val)>>8);     \ +    arr[i+1] = (unsigned char)(((unsigned int)val) & 255);  \ +} while(0)  #define CODESIZE(op)  (HAS_ARG(op) ? 3 : 1)  #define ISBASICBLOCK(blocks, start, bytes) \      (blocks[start]==blocks[start+bytes-1]) @@ -315,6 +319,7 @@ markblocks(unsigned char *code, Py_ssize_t len)              case SETUP_EXCEPT:              case SETUP_FINALLY:              case SETUP_WITH: +            case SETUP_ASYNC_WITH:                  j = GETJUMPTGT(code, i);                  blocks[j] = 1;                  break; @@ -355,7 +360,8 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,      unsigned char *codestr = NULL;      unsigned char *lineno;      int *addrmap = NULL; -    int new_line, cum_orig_line, last_line, tabsiz; +    int new_line, cum_orig_line, last_line; +    Py_ssize_t tabsiz;      PyObject **const_stack = NULL;      Py_ssize_t *load_const_stack = NULL;      Py_ssize_t const_stack_top = -1; @@ -615,6 +621,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,              case SETUP_EXCEPT:              case SETUP_FINALLY:              case SETUP_WITH: +            case SETUP_ASYNC_WITH:                  tgt = GETJUMPTGT(codestr, i);                  /* Replace JUMP_* to a RETURN into just a RETURN */                  if (UNCONDITIONAL_JUMP(opcode) && @@ -660,7 +667,8 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,      /* Fixup linenotab */      for (i=0, nops=0 ; i<codelen ; i += CODESIZE(codestr[i])) { -        addrmap[i] = i - nops; +        assert(i - nops <= INT_MAX); +        addrmap[i] = (int)(i - nops);          if (codestr[i] == NOP)              nops++;      } @@ -698,6 +706,7 @@ PyCode_Optimize(PyObject *code, PyObject* consts, PyObject *names,              case SETUP_EXCEPT:              case SETUP_FINALLY:              case SETUP_WITH: +            case SETUP_ASYNC_WITH:                  j = addrmap[GETARG(codestr, i) + i + 3] - addrmap[i] - 3;                  SETARG(codestr, i, j);                  break; | 
