Author: Carl Friedrich Bolz <[email protected]>
Branch: py3.5-refactor-sys_exc_info
Changeset: r88415:d45402cf7644
Date: 2016-11-16 18:38 +0000
http://bitbucket.org/pypy/pypy/changeset/d45402cf7644/
Log: (half cfbolz half arigo) kill some more dead code, and fix
fset_f_lineno
diff --git a/pypy/interpreter/generator.py b/pypy/interpreter/generator.py
--- a/pypy/interpreter/generator.py
+++ b/pypy/interpreter/generator.py
@@ -46,44 +46,6 @@
self.get_qualname(),
unicode(addrstring)))
- def descr__reduce__(self, space):
- # DEAD CODE, see frame.__reduce__
- from pypy.interpreter.mixedmodule import MixedModule
- w_mod = space.getbuiltinmodule('_pickle_support')
- mod = space.interp_w(MixedModule, w_mod)
- new_inst = mod.get(self.KIND + '_new')
- w = space.wrap
- if self.frame:
- w_frame = self.frame._reduce_state(space)
- else:
- w_frame = space.w_None
-
- tup = [w_frame, w(self.running)]
- return space.newtuple([new_inst, space.newtuple([]),
- space.newtuple(tup)])
-
- def descr__setstate__(self, space, w_args):
- # DEAD CODE, see frame.__reduce__
- from rpython.rlib.objectmodel import instantiate
- args_w = space.unpackiterable(w_args)
- w_framestate, w_running = args_w
- if space.is_w(w_framestate, space.w_None):
- self.frame = None
- self.space = space
- self.pycode = None
- self._name = None
- self._qualname = None
- else:
- frame = instantiate(space.FrameClass) # XXX fish
- frame.descr__setstate__(space, w_framestate)
- if isinstance(self, GeneratorIterator):
- GeneratorIterator.__init__(self, frame)
- elif isinstance(self, Coroutine):
- Coroutine.__init__(self, frame)
- else:
- assert False
- self.running = self.space.is_true(w_running)
-
def descr_send(self, w_arg):
"""send(arg) -> send 'arg' into generator/coroutine,
return next yielded value or raise StopIteration."""
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -21,7 +21,7 @@
# Define some opcodes used
for op in '''DUP_TOP POP_TOP SETUP_LOOP SETUP_EXCEPT SETUP_FINALLY SETUP_WITH
-POP_BLOCK END_FINALLY'''.split():
+SETUP_ASYNC_WITH POP_BLOCK END_FINALLY'''.split():
globals()[op] = stdlib_opcode.opmap[op]
HAVE_ARGUMENT = stdlib_opcode.HAVE_ARGUMENT
@@ -455,136 +455,6 @@
self.space, arguments, keywords, keywords_w, w_star,
w_starstar, methodcall=methodcall)
- @jit.dont_look_inside
- def descr__reduce__(self, space):
- # DEAD CODE AHEAD: frame.__reduce__() has been removed.
- # Either re-add at some point, or kill this code.
- dead_code
- from pypy.interpreter.mixedmodule import MixedModule
- w_mod = space.getbuiltinmodule('_pickle_support')
- mod = space.interp_w(MixedModule, w_mod)
- new_inst = mod.get('frame_new')
- w_tup_state = self._reduce_state(space)
- nt = space.newtuple
- return nt([new_inst, nt([]), w_tup_state])
-
- @jit.dont_look_inside
- def _reduce_state(self, space):
- # DEAD CODE AHEAD: frame.__reduce__() has been removed.
- dead_code
- from pypy.module._pickle_support import maker # helper fns
- w = space.wrap
- nt = space.newtuple
-
- if self.get_w_f_trace() is None:
- f_lineno = self.get_last_lineno()
- else:
- f_lineno = self.getorcreatedebug().f_lineno
-
- nlocals = self.pycode.co_nlocals
- values_w = self.locals_cells_stack_w
- w_locals_cells_stack = maker.slp_into_tuple_with_nulls(space, values_w)
-
- w_blockstack = nt([block._get_state_(space) for block in
self.get_blocklist()])
- if self.last_exception is None:
- w_exc_value = space.w_None
- w_tb = space.w_None
- else:
- w_exc_value = self.last_exception.get_w_value(space)
- w_tb = w(self.last_exception.get_traceback())
-
- d = self.getorcreatedebug()
- tup_state = [
- w(self.f_backref()),
- w(self.get_builtin()),
- w(self.pycode),
- w_locals_cells_stack,
- w_blockstack,
- w_exc_value, # last_exception
- w_tb, #
- self.get_w_globals(),
- w(self.last_instr),
- w(self.frame_finished_execution),
- w(f_lineno),
- space.w_None, #XXX placeholder for f_locals
-
- #f_restricted requires no additional data!
- space.w_None,
-
- w(d.instr_lb),
- w(d.instr_ub),
- w(d.instr_prev_plus_one),
- w(self.valuestackdepth),
- ]
- return nt(tup_state)
-
- @jit.dont_look_inside
- def descr__setstate__(self, space, w_args):
- # DEAD CODE AHEAD: frame.__reduce__() has been removed.
- # Either re-add at some point, or kill this code.
- dead_code
- from pypy.module._pickle_support import maker # helper fns
- from pypy.interpreter.pycode import PyCode
- from pypy.interpreter.module import Module
- args_w = space.unpackiterable(w_args, 17)
- w_f_back, w_builtin, w_pycode, w_locals_cells_stack, w_blockstack,
w_exc_value, w_tb,\
- w_globals, w_last_instr, w_finished, w_f_lineno, w_f_locals, \
- w_f_trace, w_instr_lb, w_instr_ub, w_instr_prev_plus_one,
w_stackdepth = args_w
-
- new_frame = self
- pycode = space.interp_w(PyCode, w_pycode)
-
- values_w = maker.slp_from_tuple_with_nulls(space, w_locals_cells_stack)
- nfreevars = len(pycode.co_freevars)
- closure = None
- if nfreevars:
- base = pycode.co_nlocals + len(pycode.co_cellvars)
- closure = values_w[base: base + nfreevars]
-
- # do not use the instance's __init__ but the base's, because we set
- # everything like cells from here
- # XXX hack
- from pypy.interpreter.function import Function
- outer_func = Function(space, None, closure=closure,
- forcename="fake")
- PyFrame.__init__(self, space, pycode, w_globals, outer_func)
- f_back = space.interp_w(PyFrame, w_f_back, can_be_None=True)
- new_frame.f_backref = jit.non_virtual_ref(f_back)
-
- if space.config.objspace.honor__builtins__:
- new_frame.builtin = space.interp_w(Module, w_builtin)
- else:
- assert space.interp_w(Module, w_builtin) is space.builtin
- new_frame.set_blocklist([unpickle_block(space, w_blk)
- for w_blk in
space.unpackiterable(w_blockstack)])
- self.locals_cells_stack_w = values_w[:]
- valuestackdepth = space.int_w(w_stackdepth)
- if not self._check_stack_index(valuestackdepth):
- raise oefmt(space.w_ValueError, "invalid stackdepth")
- assert valuestackdepth >= 0
- self.valuestackdepth = valuestackdepth
- if space.is_w(w_exc_value, space.w_None):
- new_frame.last_exception = None
- else:
- from pypy.interpreter.pytraceback import PyTraceback
- tb = space.interp_w(PyTraceback, w_tb)
- new_frame.last_exception = OperationError(space.type(w_exc_value),
- w_exc_value, tb
- )
- new_frame.last_instr = space.int_w(w_last_instr)
- new_frame.frame_finished_execution = space.is_true(w_finished)
- d = new_frame.getorcreatedebug()
- d.f_lineno = space.int_w(w_f_lineno)
-
- if space.is_w(w_f_trace, space.w_None):
- d.w_f_trace = None
- else:
- d.w_f_trace = w_f_trace
-
- d.instr_lb = space.int_w(w_instr_lb) #the three for tracing
- d.instr_ub = space.int_w(w_instr_ub)
- d.instr_prev_plus_one = space.int_w(w_instr_prev_plus_one)
-
def hide(self):
return self.pycode.hidden_applevel
@@ -729,7 +599,7 @@
return space.wrap(self.getorcreatedebug().f_lineno)
def fset_f_lineno(self, space, w_new_lineno):
- "Returns the line number of the instruction currently being executed."
+ "Change the line number of the instruction currently being executed."
try:
new_lineno = space.int_w(w_new_lineno)
except OperationError:
@@ -768,35 +638,41 @@
"can't jump to 'except' line as there's no exception")
# Don't jump into or out of a finally block.
- f_lasti_setup_addr = -1
- new_lasti_setup_addr = -1
- blockstack = []
+ # Unlike CPython, we can't jump into or out of an except block
+ # either---there would be a mess with SysExcInfoRestorer.
+ f_lasti_handler_addr = -1
+ new_lasti_handler_addr = -1
+ blockstack = [-1] # list of odd length:
+ # * addr of most recent outermost handler
+ # [ * addr of start of outermost block
+ # * addr of most recent handler in that block
+ # (last two items repeated) ]
addr = 0
while addr < len(code):
op = ord(code[addr])
- if op in (SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH):
- blockstack.append([addr, False])
+ if op in (SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH,
+ SETUP_ASYNC_WITH):
+ blockstack.append(addr)
+ blockstack.append(-1)
elif op == POP_BLOCK:
- setup_op = ord(code[blockstack[-1][0]])
- if setup_op == SETUP_FINALLY or setup_op == SETUP_WITH:
- blockstack[-1][1] = True
- else:
- blockstack.pop()
- elif op == END_FINALLY:
- if len(blockstack) > 0:
- setup_op = ord(code[blockstack[-1][0]])
- if setup_op == SETUP_FINALLY or setup_op == SETUP_WITH:
- blockstack.pop()
+ assert len(blockstack) >= 3
+ blockstack.pop()
+ setup_op = ord(code[blockstack.pop()])
+ if setup_op != SETUP_LOOP:
+ blockstack[-1] = addr
+ elif op == END_FINALLY: # "async for" nests blocks
+ blockstack[-1] = -1 # strangely, careful here
if addr == new_lasti or addr == self.last_instr:
- for ii in range(len(blockstack)):
- setup_addr, in_finally = blockstack[~ii]
- if in_finally:
- if addr == new_lasti:
- new_lasti_setup_addr = setup_addr
- if addr == self.last_instr:
- f_lasti_setup_addr = setup_addr
- break
+ ii = len(blockstack) - 1
+ while ii > 0 and blockstack[ii] == -1:
+ ii -= 2
+ assert ii >= 0
+ handler_addr = blockstack[ii]
+ if addr == new_lasti:
+ new_lasti_setup_addr = handler_addr
+ if addr == self.last_instr:
+ f_lasti_setup_addr = handler_addr
if op >= HAVE_ARGUMENT:
addr += 3
@@ -805,11 +681,15 @@
assert len(blockstack) == 0
- if new_lasti_setup_addr != f_lasti_setup_addr:
+ if new_lasti_handler_addr != f_lasti_handler_addr:
raise oefmt(space.w_ValueError,
- "can't jump into or out of a 'finally' block %d -> %d",
- f_lasti_setup_addr, new_lasti_setup_addr)
+ "can't jump into or out of an 'expect' or "
+ "'finally' block (%d -> %d)",
+ f_lasti_handler_addr, new_lasti_setup_addr)
+ # now we know we're not jumping into or out of a place which
+ # needs a SysExcInfoRestorer. Check that we're not jumping
+ # *into* a block, but only (potentially) out of some blocks.
if new_lasti < self.last_instr:
min_addr = new_lasti
max_addr = self.last_instr
@@ -817,42 +697,40 @@
min_addr = self.last_instr
max_addr = new_lasti
- delta_iblock = min_delta_iblock = 0
+ delta_iblock = min_delta_iblock = 0 # see below for comment
addr = min_addr
while addr < max_addr:
op = ord(code[addr])
- if op in (SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH):
+ if op in (SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, SETUP_WITH,
+ SETUP_ASYNC_WITH):
delta_iblock += 1
elif op == POP_BLOCK:
delta_iblock -= 1
if delta_iblock < min_delta_iblock:
min_delta_iblock = delta_iblock
- if op >= stdlib_opcode.HAVE_ARGUMENT:
+ if op >= HAVE_ARGUMENT:
addr += 3
else:
addr += 1
- f_iblock = 0
- block = self.lastblock
- while block:
- f_iblock += 1
- block = block.previous
- min_iblock = f_iblock + min_delta_iblock
+ # 'min_delta_iblock' is <= 0; its absolute value is the number of
+ # blocks we exit. 'go_iblock' is the delta number of blocks
+ # between the last_instr and the new_lasti, in this order.
if new_lasti > self.last_instr:
- new_iblock = f_iblock + delta_iblock
+ go_iblock = delta_iblock
else:
- new_iblock = f_iblock - delta_iblock
+ go_iblock = -delta_iblock
- if new_iblock > min_iblock:
+ if go_iblock > min_delta_iblock:
raise oefmt(space.w_ValueError,
"can't jump into the middle of a block")
+ assert go_iblock <= 0
- while f_iblock > new_iblock:
+ for ii in range(-go_iblock):
block = self.pop_block()
- block.cleanup(self)
- f_iblock -= 1
+ block.cleanupstack(self)
self.getorcreatedebug().f_lineno = new_lineno
self.last_instr = new_lasti
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -810,8 +810,8 @@
Coroutine.typedef = TypeDef("coroutine",
__repr__ = interp2app(Coroutine.descr__repr__),
- __reduce__ = interp2app(Coroutine.descr__reduce__),
- __setstate__ = interp2app(Coroutine.descr__setstate__),
+ #__reduce__ = interp2app(Coroutine.descr__reduce__),
+ #__setstate__ = interp2app(Coroutine.descr__setstate__),
send = interp2app(Coroutine.descr_send,
descrmismatch='send'),
throw = interp2app(Coroutine.descr_throw,
diff --git a/pypy/module/_pickle_support/__init__.py
b/pypy/module/_pickle_support/__init__.py
--- a/pypy/module/_pickle_support/__init__.py
+++ b/pypy/module/_pickle_support/__init__.py
@@ -22,5 +22,4 @@
'intrangeiter_new': 'maker.intrangeiter_new',
'builtin_code': 'maker.builtin_code',
'builtin_function' : 'maker.builtin_function',
- 'operationerror_new': 'maker.operationerror_new',
}
diff --git a/pypy/module/_pickle_support/maker.py
b/pypy/module/_pickle_support/maker.py
--- a/pypy/module/_pickle_support/maker.py
+++ b/pypy/module/_pickle_support/maker.py
@@ -69,10 +69,6 @@
new_iter = W_IntRangeIterator(space, current, remaining, step)
return space.wrap(new_iter)
-def operationerror_new(space):
- from pypy.interpreter.pyopcode import W_OperationError
- return W_OperationError(None)
-
@unwrap_spec(identifier=str)
def builtin_code(space, identifier):
from pypy.interpreter import gateway
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit