Author: Armin Rigo <[email protected]>
Branch:
Changeset: r89123:7904f63e30ef
Date: 2016-12-17 18:36 +0100
http://bitbucket.org/pypy/pypy/changeset/7904f63e30ef/
Log: Add a minimal amount of ll_assert_not_none(), notably on the
popvalue() method
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -4,6 +4,7 @@
import sys
from rpython.rlib import jit
from rpython.rlib.debug import make_sure_not_resized, check_nonneg
+from rpython.rlib.debug import ll_assert_not_none
from rpython.rlib.jit import hint
from rpython.rlib.objectmodel import instantiate, specialize, we_are_translated
from rpython.rlib.rarithmetic import intmask, r_uint
@@ -298,7 +299,13 @@
# stack manipulation helpers
def pushvalue(self, w_object):
depth = self.valuestackdepth
- self.locals_cells_stack_w[depth] = w_object
+ self.locals_cells_stack_w[depth] = ll_assert_not_none(w_object)
+ self.valuestackdepth = depth + 1
+
+ def pushvalue_none(self):
+ depth = self.valuestackdepth
+ # the entry is already None, and remains None
+ assert self.locals_cells_stack_w[depth] is None
self.valuestackdepth = depth + 1
def _check_stack_index(self, index):
@@ -311,6 +318,9 @@
return index >= stackstart
def popvalue(self):
+ return ll_assert_not_none(self.popvalue_maybe_none())
+
+ def popvalue_maybe_none(self):
depth = self.valuestackdepth - 1
assert self._check_stack_index(depth)
assert depth >= 0
@@ -385,6 +395,9 @@
def peekvalue(self, index_from_top=0):
# NOTE: top of the stack is peekvalue(0).
# Contrast this with CPython where it's PEEK(-1).
+ return ll_assert_not_none(self.peekvalue_maybe_none(index_from_top))
+
+ def peekvalue_maybe_none(self, index_from_top=0):
index_from_top = hint(index_from_top, promote=True)
index = self.valuestackdepth + ~index_from_top
assert self._check_stack_index(index)
@@ -396,7 +409,7 @@
index = self.valuestackdepth + ~index_from_top
assert self._check_stack_index(index)
assert index >= 0
- self.locals_cells_stack_w[index] = w_object
+ self.locals_cells_stack_w[index] = ll_assert_not_none(w_object)
@jit.unroll_safe
def dropvaluesuntil(self, finaldepth):
diff --git a/pypy/objspace/std/callmethod.py b/pypy/objspace/std/callmethod.py
--- a/pypy/objspace/std/callmethod.py
+++ b/pypy/objspace/std/callmethod.py
@@ -80,14 +80,14 @@
if w_value is None:
w_value = space.getattr(w_obj, w_name)
f.pushvalue(w_value)
- f.pushvalue(None)
+ f.pushvalue_none()
@jit.unroll_safe
def CALL_METHOD(f, oparg, *ignored):
# opargs contains the arg, and kwarg count, excluding the implicit 'self'
n_args = oparg & 0xff
n_kwargs = (oparg >> 8) & 0xff
- w_self = f.peekvalue(n_args + (2 * n_kwargs))
+ w_self = f.peekvalue_maybe_none(n_args + (2 * n_kwargs))
n = n_args + (w_self is not None)
if not n_kwargs:
@@ -115,7 +115,7 @@
arguments, keywords, keywords_w, None, None,
methodcall=w_self is not None)
if w_self is None:
- f.popvalue() # removes w_self, which is None
+ f.popvalue_maybe_none() # removes w_self, which is None
w_callable = f.popvalue()
if f.get_is_being_profiled() and function.is_builtin_code(w_callable):
w_result = f.space.call_args_and_c_profile(f, w_callable, args)
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit