[Python-3000-checkins] r55181 - in python/branches/py3k-struni: Lib/pickletools.py Lib/test/test_exceptions.py Modules/cPickle.c Python/getargs.c

guido.van.rossum python-3000-checkins at python.org
Tue May 8 01:57:12 CEST 2007


Author: guido.van.rossum
Date: Tue May  8 01:57:08 2007
New Revision: 55181

Modified:
   python/branches/py3k-struni/Lib/pickletools.py
   python/branches/py3k-struni/Lib/test/test_exceptions.py
   python/branches/py3k-struni/Modules/cPickle.c
   python/branches/py3k-struni/Python/getargs.c
Log:
Checkpoint.  A b it closer to working pickles and pickletools.
Added 'Y' getargs opcode which requires a bytes object.

Modified: python/branches/py3k-struni/Lib/pickletools.py
==============================================================================
--- python/branches/py3k-struni/Lib/pickletools.py	(original)
+++ python/branches/py3k-struni/Lib/pickletools.py	Tue May  8 01:57:08 2007
@@ -1760,11 +1760,12 @@
                 print("skipping %r: it doesn't look like an opcode name" % name)
             continue
         picklecode = getattr(pickle, name)
-        if not isinstance(picklecode, str) or len(picklecode) != 1:
+        if not isinstance(picklecode, bytes) or len(picklecode) != 1:
             if verbose:
                 print(("skipping %r: value %r doesn't look like a pickle "
                        "code" % (name, picklecode)))
             continue
+        picklecode = picklecode.decode("latin-1")
         if picklecode in copy:
             if verbose:
                 print("checking name %r w/ code %r for consistency" % (

Modified: python/branches/py3k-struni/Lib/test/test_exceptions.py
==============================================================================
--- python/branches/py3k-struni/Lib/test/test_exceptions.py	(original)
+++ python/branches/py3k-struni/Lib/test/test_exceptions.py	Tue May  8 01:57:08 2007
@@ -251,12 +251,12 @@
                  'print_file_and_line' : None, 'msg' : 'msgStr',
                  'filename' : None, 'lineno' : None, 'offset' : None}),
             (UnicodeError, (), {'message' : '', 'args' : (),}),
-            (UnicodeEncodeError, ('ascii', 'a', 0, 1, 'ordinal not in range'),
+            (UnicodeEncodeError, (str8('ascii'), 'a', 0, 1, str8('ordinal not in range')),
                 {'message' : '', 'args' : ('ascii', 'a', 0, 1,
                                            'ordinal not in range'),
                  'encoding' : 'ascii', 'object' : 'a',
                  'start' : 0, 'reason' : 'ordinal not in range'}),
-            (UnicodeDecodeError, ('ascii', '\xff', 0, 1, 'ordinal not in range'),
+            (UnicodeDecodeError, (str8('ascii'), b'\xff', 0, 1, str8('ordinal not in range')),
                 {'message' : '', 'args' : ('ascii', '\xff', 0, 1,
                                            'ordinal not in range'),
                  'encoding' : 'ascii', 'object' : '\xff',
@@ -278,6 +278,7 @@
 
         for exc, args, expected in exceptionList:
             try:
+                print("exc=%r, args=%r" % (exc, args))
                 raise exc(*args)
             except BaseException as e:
                 if type(e) is not exc:
@@ -297,7 +298,9 @@
                     if p is None:
                         continue # cPickle not found -- skip it
                     for protocol in range(p.HIGHEST_PROTOCOL + 1):
-                        new = p.loads(p.dumps(e, protocol))
+                        ##print("p=%s, protocol=%s, e=%r" % (p.__name__, protocol, e))
+                        s = p.dumps(e, protocol)
+                        new = p.loads(s)
                         for checkArgName in expected:
                             got = repr(getattr(new, checkArgName))
                             want = repr(expected[checkArgName])

Modified: python/branches/py3k-struni/Modules/cPickle.c
==============================================================================
--- python/branches/py3k-struni/Modules/cPickle.c	(original)
+++ python/branches/py3k-struni/Modules/cPickle.c	Tue May  8 01:57:08 2007
@@ -1335,7 +1335,8 @@
 		if (!( repr = PyUnicode_AsUTF8String(args)))
 			return -1;
 
-		if ((size = PyString_Size(repr)) < 0)
+		assert(PyBytes_Check(repr));
+		if ((size = PyBytes_Size(repr)) < 0)
 			goto err;
 		if (size > INT_MAX)
 			return -1;   /* string too large */
@@ -1354,7 +1355,7 @@
 			PDATA_APPEND(self->file, repr, -1);
 		}
 		else {
-			if (self->write_func(self, PyString_AS_STRING(repr),
+			if (self->write_func(self, PyBytes_AS_STRING(repr),
 					     size) < 0)
 				goto err;
 		}
@@ -5275,8 +5276,11 @@
 	PyObject *ob, *file = 0, *res = NULL;
 	Unpicklerobject *unpickler = 0;
 
-	if (!( PyArg_ParseTuple(args, "S:loads", &ob)))
-		goto finally;
+	if (!( PyArg_ParseTuple(args, "S:loads", &ob))) {
+		PyErr_Clear();
+		if (!PyArg_ParseTuple(args, "Y:loads", &ob))
+			goto finally;
+	}
 
 	if (!( file = PycStringIO->NewInput(ob)))
 		goto finally;

Modified: python/branches/py3k-struni/Python/getargs.c
==============================================================================
--- python/branches/py3k-struni/Python/getargs.c	(original)
+++ python/branches/py3k-struni/Python/getargs.c	Tue May  8 01:57:08 2007
@@ -1099,6 +1099,15 @@
 			return converterr("string", arg, msgbuf, bufsize);
 		break;
 	}
+
+	case 'Y': { /* bytes object */
+		PyObject **p = va_arg(*p_va, PyObject **);
+		if (PyBytes_Check(arg))
+			*p = arg;
+		else
+			return converterr("bytes", arg, msgbuf, bufsize);
+		break;
+	}
 	
 	case 'U': { /* Unicode object */
 		PyObject **p = va_arg(*p_va, PyObject **);
@@ -1640,6 +1649,7 @@
 	/* object codes */
 
 	case 'S': /* string object */
+	case 'Y': /* string object */
 	case 'U': /* unicode string object */
 		{
 			(void) va_arg(*p_va, PyObject **);


More information about the Python-3000-checkins mailing list