SOURCES: python-bug-1557232.patch (NEW), python-bug-1572832.patch ...
arekm
arekm at pld-linux.org
Mon Jan 8 11:51:15 CET 2007
Author: arekm Date: Mon Jan 8 10:51:15 2007 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- three segfault fixes
---- Files affected:
SOURCES:
python-bug-1557232.patch (NONE -> 1.1) (NEW), python-bug-1572832.patch (NONE -> 1.1) (NEW), python-segfault-onwarn.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/python-bug-1557232.patch
diff -u /dev/null SOURCES/python-bug-1557232.patch:1.1
--- /dev/null Mon Jan 8 11:51:15 2007
+++ SOURCES/python-bug-1557232.patch Mon Jan 8 11:51:10 2007
@@ -0,0 +1,158 @@
+Index: Python/ast.c
+===================================================================
+--- Python/ast.c (wersja 51998)
++++ Python/ast.c (wersja 51999)
+@@ -566,10 +566,17 @@
+ if (!args)
+ return NULL;
+
++ /* fpdef: NAME | '(' fplist ')'
++ fplist: fpdef (',' fpdef)* [',']
++ */
+ REQ(n, fplist);
+ for (i = 0; i < len; i++) {
+- const node *child = CHILD(CHILD(n, 2*i), 0);
++ const node *fpdef_node = CHILD(n, 2*i);
++ const node *child;
+ expr_ty arg;
++set_name:
++ /* fpdef_node is either a NAME or an fplist */
++ child = CHILD(fpdef_node, 0);
+ if (TYPE(child) == NAME) {
+ if (!strcmp(STR(child), "None")) {
+ ast_error(child, "assignment to None");
+@@ -579,7 +586,17 @@
+ child->n_col_offset, c->c_arena);
+ }
+ else {
+- arg = compiler_complex_args(c, CHILD(CHILD(n, 2*i), 1));
++ assert(TYPE(fpdef_node) == fpdef);
++ /* fpdef_node[0] is not a name, so it must be a '(', get CHILD[1] */
++ child = CHILD(fpdef_node, 1);
++ assert(TYPE(child) == fplist);
++ /* NCH == 1 means we have (x), we need to elide the extra parens */
++ if (NCH(child) == 1) {
++ fpdef_node = CHILD(child, 0);
++ assert(TYPE(fpdef_node) == fpdef);
++ goto set_name;
++ }
++ arg = compiler_complex_args(c, child);
+ }
+ asdl_seq_SET(args, i, arg);
+ }
+@@ -637,6 +654,7 @@
+ ch = CHILD(n, i);
+ switch (TYPE(ch)) {
+ case fpdef:
++ handle_fpdef:
+ /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
+ anything other than EQUAL or a comma? */
+ /* XXX Should NCH(n) check be made a separate check? */
+@@ -662,7 +680,11 @@
+ asdl_seq_SET(args, k++, compiler_complex_args(c, ch));
+ } else {
+ /* def foo((x)): setup for checking NAME below. */
++ /* Loop because there can be many parens and tuple
++ upacking mixed in. */
+ ch = CHILD(ch, 0);
++ assert(TYPE(ch) == fpdef);
++ goto handle_fpdef;
+ }
+ }
+ if (TYPE(CHILD(ch, 0)) == NAME) {
+Index: Lib/test/test_complex_args.py
+===================================================================
+--- Lib/test/test_complex_args.py (wersja 0)
++++ Lib/test/test_complex_args.py (wersja 51999)
+@@ -0,0 +1,91 @@
++
++import unittest
++from test import test_support
++
++class ComplexArgsTestCase(unittest.TestCase):
++
++ def check(self, func, expected, *args):
++ self.assertEqual(func(*args), expected)
++
++ # These functions are tested below as lambdas too. If you add a function test,
++ # also add a similar lambda test.
++
++ def test_func_parens_no_unpacking(self):
++ def f(((((x))))): return x
++ self.check(f, 1, 1)
++ # Inner parens are elided, same as: f(x,)
++ def f(((x)),): return x
++ self.check(f, 2, 2)
++
++ def test_func_1(self):
++ def f(((((x),)))): return x
++ self.check(f, 3, (3,))
++ def f(((((x)),))): return x
++ self.check(f, 4, (4,))
++ def f(((((x))),)): return x
++ self.check(f, 5, (5,))
++ def f(((x),)): return x
++ self.check(f, 6, (6,))
++
++ def test_func_2(self):
++ def f(((((x)),),)): return x
++ self.check(f, 2, ((2,),))
++
++ def test_func_3(self):
++ def f((((((x)),),),)): return x
++ self.check(f, 3, (((3,),),))
++
++ def test_func_complex(self):
++ def f((((((x)),),),), a, b, c): return x, a, b, c
++ self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++ def f(((((((x)),)),),), a, b, c): return x, a, b, c
++ self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++ def f(a, b, c, ((((((x)),)),),)): return a, b, c, x
++ self.check(f, (9, 8, 7, 3), 9, 8, 7, (((3,),),))
++
++ # Duplicate the tests above, but for lambda. If you add a lambda test,
++ # also add a similar function test above.
++
++ def test_lambda_parens_no_unpacking(self):
++ f = lambda (((((x))))): x
++ self.check(f, 1, 1)
++ # Inner parens are elided, same as: f(x,)
++ f = lambda ((x)),: x
++ self.check(f, 2, 2)
++
++ def test_lambda_1(self):
++ f = lambda (((((x),)))): x
++ self.check(f, 3, (3,))
++ f = lambda (((((x)),))): x
++ self.check(f, 4, (4,))
++ f = lambda (((((x))),)): x
++ self.check(f, 5, (5,))
++ f = lambda (((x),)): x
++ self.check(f, 6, (6,))
++
++ def test_lambda_2(self):
++ f = lambda (((((x)),),)): x
++ self.check(f, 2, ((2,),))
++
++ def test_lambda_3(self):
++ f = lambda ((((((x)),),),)): x
++ self.check(f, 3, (((3,),),))
++
++ def test_lambda_complex(self):
++ f = lambda (((((x)),),),), a, b, c: (x, a, b, c)
++ self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++ f = lambda ((((((x)),)),),), a, b, c: (x, a, b, c)
++ self.check(f, (3, 9, 8, 7), (((3,),),), 9, 8, 7)
++
++ f = lambda a, b, c, ((((((x)),)),),): (a, b, c, x)
++ self.check(f, (9, 8, 7, 3), 9, 8, 7, (((3,),),))
++
++
++def test_main():
++ test_support.run_unittest(ComplexArgsTestCase)
++
++if __name__ == "__main__":
++ test_main()
================================================================
Index: SOURCES/python-bug-1572832.patch
diff -u /dev/null SOURCES/python-bug-1572832.patch:1.1
--- /dev/null Mon Jan 8 11:51:15 2007
+++ SOURCES/python-bug-1572832.patch Mon Jan 8 11:51:10 2007
@@ -0,0 +1,89 @@
+Index: Lib/test/test_multibytecodec.py
+===================================================================
+--- Lib/test/test_multibytecodec.py (wersja 52224)
++++ Lib/test/test_multibytecodec.py (wersja 52225)
+@@ -208,6 +208,16 @@
+ e = u'\u3406'.encode(encoding)
+ self.failIf(filter(lambda x: x >= '\x80', e))
+
++ def test_bug1572832(self):
++ if sys.maxunicode >= 0x10000:
++ myunichr = unichr
++ else:
++ myunichr = lambda x: unichr(0xD7C0+(x>>10)) + unichr(0xDC00+(x&0x3FF))
++
++ for x in xrange(0x10000, 0x110000):
++ # Any ISO 2022 codec will cause the segfault
++ myunichr(x).encode('iso_2022_jp', 'ignore')
++
+ def test_main():
+ suite = unittest.TestSuite()
+ suite.addTest(unittest.makeSuite(Test_MultibyteCodec))
+Index: Modules/cjkcodecs/_codecs_iso2022.c
+===================================================================
+--- Modules/cjkcodecs/_codecs_iso2022.c (wersja 52224)
++++ Modules/cjkcodecs/_codecs_iso2022.c (wersja 52225)
+@@ -592,9 +592,11 @@
+ {
+ DBCHAR coded;
+ assert(*length == 1);
+- TRYMAP_ENC(cp949, coded, *data)
+- if (!(coded & 0x8000))
+- return coded;
++ if (*data < 0x10000) {
++ TRYMAP_ENC(cp949, coded, *data)
++ if (!(coded & 0x8000))
++ return coded;
++ }
+ return MAP_UNMAPPABLE;
+ }
+
+@@ -628,11 +630,13 @@
+ {
+ DBCHAR coded;
+ assert(*length == 1);
+- if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
+- return 0x2140;
+- else TRYMAP_ENC(jisxcommon, coded, *data) {
+- if (!(coded & 0x8000))
+- return coded;
++ if (*data < 0x10000) {
++ if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
++ return 0x2140;
++ else TRYMAP_ENC(jisxcommon, coded, *data) {
++ if (!(coded & 0x8000))
++ return coded;
++ }
+ }
+ return MAP_UNMAPPABLE;
+ }
+@@ -665,9 +669,11 @@
+ {
+ DBCHAR coded;
+ assert(*length == 1);
+- TRYMAP_ENC(jisxcommon, coded, *data) {
+- if (coded & 0x8000)
+- return coded & 0x7fff;
++ if (*data < 0x10000) {
++ TRYMAP_ENC(jisxcommon, coded, *data) {
++ if (coded & 0x8000)
++ return coded & 0x7fff;
++ }
+ }
+ return MAP_UNMAPPABLE;
+ }
+@@ -970,9 +976,11 @@
+ {
+ DBCHAR coded;
+ assert(*length == 1);
+- TRYMAP_ENC(gbcommon, coded, *data) {
+- if (!(coded & 0x8000))
+- return coded;
++ if (*data < 0x10000) {
++ TRYMAP_ENC(gbcommon, coded, *data) {
++ if (!(coded & 0x8000))
++ return coded;
++ }
+ }
+ return MAP_UNMAPPABLE;
+ }
================================================================
Index: SOURCES/python-segfault-onwarn.patch
diff -u /dev/null SOURCES/python-segfault-onwarn.patch:1.1
--- /dev/null Mon Jan 8 11:51:15 2007
+++ SOURCES/python-segfault-onwarn.patch Mon Jan 8 11:51:10 2007
@@ -0,0 +1,15 @@
+Index: Python/errors.c
+===================================================================
+--- Python/errors.c (wersja 53255)
++++ Python/errors.c (wersja 53256)
+@@ -640,7 +640,8 @@
+
+ if (warnings_module != NULL) {
+ dict = PyModule_GetDict(warnings_module);
+- func = PyDict_GetItemString(dict, "warn");
++ if (dict != NULL)
++ func = PyDict_GetItemString(dict, "warn");
+ }
+ if (func == NULL) {
+ PySys_WriteStderr("warning: %s\n", message);
+
================================================================
More information about the pld-cvs-commit
mailing list