[pypy-dev] [PATCH] Fix segmentation fault on parsing empty list-assignments

Greg Price greg at quora.com
Wed Mar 9 13:29:15 CET 2011


This same patch is on bitbucket at https://bitbucket.org/price/pypy,
where I've sent a pull request. Holger Krekel suggested on IRC that I
send mail here. If others have different preferences for how to submit
a patch, let me know.

Before this patch, "[] = []" would abort the interpreter, with a
segmentation fault if in pypy-c. A segmentation fault is always bad,
but in this case further the code is valid Python, if not very useful.
(In my commit message on bitbucket, I incorrectly said it only affects
invalid Python, like "[] += []".)

Greg


diff -r eb44d135f334 -r 0db4ac049ea2 pypy/interpreter/astcompiler/asthelpers.py
--- a/pypy/interpreter/astcompiler/asthelpers.py Tue Mar 08 11:14:36 2011 -0800
+++ b/pypy/interpreter/astcompiler/asthelpers.py Wed Mar 09 03:26:54 2011 -0800
@@ -40,9 +40,10 @@
         return self.elts

     def set_context(self, ctx):
-        for elt in self.elts:
-            elt.set_context(ctx)
-        self.ctx = ctx
+        if self.elts:
+            for elt in self.elts:
+                elt.set_context(ctx)
+            self.ctx = ctx


 class __extend__(ast.Attribute):
diff -r eb44d135f334 -r 0db4ac049ea2
pypy/interpreter/astcompiler/test/test_compiler.py
--- a/pypy/interpreter/astcompiler/test/test_compiler.py Tue Mar 08
11:14:36 2011 -0800
+++ b/pypy/interpreter/astcompiler/test/test_compiler.py Wed Mar 09
03:26:54 2011 -0800
@@ -70,6 +70,9 @@

     st = simple_test

+    def error_test(self, source, exc_type):
+        py.test.raises(exc_type, self.simple_test, source, None, None)
+
     def test_long_jump(self):
         func = """def f(x):
     y = 0
@@ -98,11 +101,13 @@
         self.simple_test(stmt, "type(x)", int)

     def test_tuple_assign(self):
+        yield self.error_test, "() = 1", SyntaxError
         yield self.simple_test, "x,= 1,", "x", 1
         yield self.simple_test, "x,y = 1,2", "x,y", (1, 2)
         yield self.simple_test, "x,y,z = 1,2,3", "x,y,z", (1, 2, 3)
         yield self.simple_test, "x,y,z,t = 1,2,3,4", "x,y,z,t", (1, 2, 3, 4)
         yield self.simple_test, "x,y,x,t = 1,2,3,4", "x,y,t", (3, 2, 4)
+        yield self.simple_test, "[] = []", "1", 1
         yield self.simple_test, "[x]= 1,", "x", 1
         yield self.simple_test, "[x,y] = [1,2]", "x,y", (1, 2)
         yield self.simple_test, "[x,y,z] = 1,2,3", "x,y,z", (1, 2, 3)



More information about the Pypy-dev mailing list