Author: Armin Rigo <[email protected]>
Branch: fix-descrmismatch-crash
Changeset: r97770:9acddd120236
Date: 2019-10-14 11:25 +0200
http://bitbucket.org/pypy/pypy/changeset/9acddd120236/
Log: Make a new helper method for the common code, and move there the
logic that should safely fetch the first argument. Includes tests
but like the old SystemError these new cases are probably not
reachable from app-level
diff --git a/pypy/interpreter/gateway.py b/pypy/interpreter/gateway.py
--- a/pypy/interpreter/gateway.py
+++ b/pypy/interpreter/gateway.py
@@ -755,10 +755,7 @@
except DescrMismatch:
if w_obj is not None:
args = args.prepend(w_obj)
- return scope_w[0].descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
- args)
+ return self.descr_call_mismatch(space, args)
except Exception as e:
self.handle_exception(space, e)
w_result = None
@@ -766,6 +763,15 @@
w_result = space.w_None
return w_result
+ def descr_call_mismatch(self, space, args):
+ w_obj = args.firstarg()
+ if w_obj is None:
+ raise oefmt(space.w_SystemError, "unexpected DescrMismatch error")
+ return w_obj.descr_call_mismatch(space,
+ self.descrmismatch_op,
+ self.descr_reqcls,
+ args)
+
def handle_exception(self, space, e):
try:
if not we_are_translated():
@@ -788,10 +794,7 @@
try:
w_result = self.func__args__(space, args)
except DescrMismatch:
- return args.firstarg().descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
- args)
+ return self.descr_call_mismatch(space, args)
except Exception as e:
self.handle_exception(space, e)
w_result = None
@@ -809,10 +812,7 @@
try:
w_result = self.func__args__(space, w_obj, args)
except DescrMismatch:
- return w_obj.descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
- args.prepend(w_obj))
+ return self.descr_call_mismatch(space, args.prepend(w_obj))
except Exception as e:
self.handle_exception(space, e)
w_result = None
@@ -852,9 +852,7 @@
try:
w_result = self.fastfunc_1(space, w1)
except DescrMismatch:
- return w1.descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
+ return self.descr_call_mismatch(space,
Arguments(space, [w1]))
except Exception as e:
self.handle_exception(space, e)
@@ -878,9 +876,7 @@
try:
w_result = self.fastfunc_2(space, w1, w2)
except DescrMismatch:
- return w1.descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
+ return self.descr_call_mismatch(space,
Arguments(space, [w1, w2]))
except Exception as e:
self.handle_exception(space, e)
@@ -905,9 +901,7 @@
try:
w_result = self.fastfunc_3(space, w1, w2, w3)
except DescrMismatch:
- return w1.descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
+ return self.descr_call_mismatch(space,
Arguments(space, [w1, w2, w3]))
except Exception as e:
self.handle_exception(space, e)
@@ -933,9 +927,7 @@
try:
w_result = self.fastfunc_4(space, w1, w2, w3, w4)
except DescrMismatch:
- return w1.descr_call_mismatch(space,
- self.descrmismatch_op,
- self.descr_reqcls,
+ return self.descr_call_mismatch(space,
Arguments(space,
[w1, w2, w3, w4]))
except Exception as e:
diff --git a/pypy/interpreter/test/test_gateway.py
b/pypy/interpreter/test/test_gateway.py
--- a/pypy/interpreter/test/test_gateway.py
+++ b/pypy/interpreter/test/test_gateway.py
@@ -966,6 +966,29 @@
# white-box check for opt
assert called[0] is args
+ def test_base_regular_descr_mismatch(self):
+ space = self.space
+
+ def f():
+ raise gateway.DescrMismatch
+
+ w_f = space.wrap(gateway.interp2app_temp(f,
+ unwrap_spec=[]))
+ args = argument.Arguments(space, [])
+ space.raises_w(space.w_SystemError, space.call_args, w_f, args)
+
+ def test_pass_trough_arguments0_descr_mismatch(self):
+ space = self.space
+
+ def f(space, __args__):
+ raise gateway.DescrMismatch
+
+ w_f = space.wrap(gateway.interp2app_temp(f,
+ unwrap_spec=[gateway.ObjSpace,
+ gateway.Arguments]))
+ args = argument.Arguments(space, [])
+ space.raises_w(space.w_SystemError, space.call_args, w_f, args)
+
class AppTestKeywordsToBuiltinSanity(object):
def test_type(self):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit