Removed all uses of the out-of-favor __safe_for_unpickling__ magic

attr, and copy_reg.safe_constructors.
This commit is contained in:
Tim Peters 2003-02-01 02:16:37 +00:00
parent 371935fc06
commit 1f1b2d2e68
5 changed files with 5 additions and 79 deletions

View File

@ -10,7 +10,6 @@ __all__ = ["pickle", "constructor",
"add_extension", "remove_extension", "clear_extension_cache"]
dispatch_table = {}
safe_constructors = {}
def pickle(ob_type, pickle_function, constructor_ob=None):
if type(ob_type) is _ClassType:
@ -26,7 +25,6 @@ def pickle(ob_type, pickle_function, constructor_ob=None):
def constructor(object):
if not callable(object):
raise TypeError("constructors must be callable")
safe_constructors[object] = 1
# Example: provide pickling support for complex numbers.
@ -41,7 +39,6 @@ def _reconstructor(cls, base, state):
obj = base.__new__(cls, state)
base.__init__(obj, state)
return obj
_reconstructor.__safe_for_unpickling__ = 1
_HEAPTYPE = 1<<9

View File

@ -15,8 +15,6 @@ class myint(int):
class initarg(C):
__safe_for_unpickling__ = 1
def __init__(self, a, b):
self.a = a
self.b = b

View File

@ -92,14 +92,13 @@ static PyObject *BadPickleGet;
static PyObject *dispatch_table;
static PyObject *safe_constructors;
static PyObject *empty_tuple;
static PyObject *__class___str, *__getinitargs___str, *__dict___str,
*__getstate___str, *__setstate___str, *__name___str, *__reduce___str,
*write_str, *__safe_for_unpickling___str, *append_str,
*write_str, *append_str,
*read_str, *readline_str, *__main___str, *__basicnew___str,
*copy_reg_str, *dispatch_table_str, *safe_constructors_str;
*copy_reg_str, *dispatch_table_str;
/*************************************************************************
Internal Data type for pickle data. */
@ -306,7 +305,6 @@ typedef struct Unpicklerobject {
int (*readline_func)(struct Unpicklerobject *, char **);
int buf_size;
char *buf;
PyObject *safe_constructors;
PyObject *find_class;
} Unpicklerobject;
@ -3078,8 +3076,7 @@ load_dict(Unpicklerobject *self)
static PyObject *
Instance_New(PyObject *cls, PyObject *args)
{
int has_key;
PyObject *safe=0, *r=0;
PyObject *r = 0;
if (PyClass_Check(cls)) {
int l;
@ -3107,21 +3104,6 @@ Instance_New(PyObject *cls, PyObject *args)
else goto err;
}
/* Is safe_constructors always a dict? */
has_key = cPickle_PyMapping_HasKey(safe_constructors, cls);
if (!has_key) {
safe = PyObject_GetAttr(cls, __safe_for_unpickling___str);
if (!safe ||
!PyObject_IsTrue(safe)) {
cPickle_ErrFormat(UnpicklingError,
"%s is not safe for unpickling",
"O", cls);
Py_XDECREF(safe);
return NULL;
}
Py_DECREF(safe);
}
if (args==Py_None) {
/* Special case, call cls.__basicnew__() */
PyObject *basicnew;
@ -4332,7 +4314,6 @@ newUnpicklerobject(PyObject *f)
self->buf_size = 0;
self->read = NULL;
self->readline = NULL;
self->safe_constructors = NULL;
self->find_class = NULL;
if (!( self->memo = PyDict_New()))
@ -4373,21 +4354,6 @@ newUnpicklerobject(PyObject *f)
}
}
if (PyEval_GetRestricted()) {
/* Restricted execution, get private tables */
PyObject *m;
if (!( m=PyImport_Import(copy_reg_str))) goto err;
self->safe_constructors=PyObject_GetAttr(m,
safe_constructors_str);
Py_DECREF(m);
if (!( self->safe_constructors )) goto err;
}
else {
self->safe_constructors=safe_constructors;
Py_INCREF(safe_constructors);
}
return self;
err:
@ -4418,7 +4384,6 @@ Unpickler_dealloc(Unpicklerobject *self)
Py_XDECREF(self->pers_func);
Py_XDECREF(self->arg);
Py_XDECREF(self->last_string);
Py_XDECREF(self->safe_constructors);
if (self->marks) {
free(self->marks);
@ -4693,28 +4658,22 @@ init_stuff(PyObject *module_dict)
INIT_STR(__main__);
INIT_STR(__reduce__);
INIT_STR(write);
INIT_STR(__safe_for_unpickling__);
INIT_STR(append);
INIT_STR(read);
INIT_STR(readline);
INIT_STR(copy_reg);
INIT_STR(dispatch_table);
INIT_STR(safe_constructors);
INIT_STR(__basicnew__);
if (!( copy_reg = PyImport_ImportModule("copy_reg")))
return -1;
/* These next few are special because we want to use different
ones in restricted mode. */
/* This is special because we want to use a different
one in restricted mode. */
dispatch_table = PyObject_GetAttr(copy_reg, dispatch_table_str);
if (!dispatch_table)
return -1;
if (!( safe_constructors = PyObject_GetAttr(copy_reg,
safe_constructors_str)))
return -1;
Py_DECREF(copy_reg);
/* Down to here ********************************** */

View File

@ -4516,13 +4516,6 @@ initdatetime(void)
PyObject *d; /* its dict */
PyObject *x;
/* Types that use __reduce__ for pickling need to set the following
* magical attr in the type dict, with a true value.
*/
PyObject *safepickle = PyString_FromString("__safe_for_unpickling__");
if (safepickle == NULL)
return;
m = Py_InitModule3("datetime", module_methods,
"Fast implementation of the datetime type.");
@ -4577,18 +4570,9 @@ initdatetime(void)
}
}
/* tzinfo values */
d = PyDateTime_TZInfoType.tp_dict;
if (PyDict_SetItem(d, safepickle, Py_True) < 0)
return;
/* timedelta values */
d = PyDateTime_DeltaType.tp_dict;
if (PyDict_SetItem(d, safepickle, Py_True) < 0)
return;
x = new_delta(0, 0, 1, 0);
if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)
return;
@ -4607,9 +4591,6 @@ initdatetime(void)
/* date values */
d = PyDateTime_DateType.tp_dict;
if (PyDict_SetItem(d, safepickle, Py_True) < 0)
return;
x = new_date(1, 1, 1);
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
return;
@ -4628,9 +4609,6 @@ initdatetime(void)
/* time values */
d = PyDateTime_TimeType.tp_dict;
if (PyDict_SetItem(d, safepickle, Py_True) < 0)
return;
x = new_time(0, 0, 0, 0, Py_None);
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
return;
@ -4649,9 +4627,6 @@ initdatetime(void)
/* datetime values */
d = PyDateTime_DateTimeType.tp_dict;
if (PyDict_SetItem(d, safepickle, Py_True) < 0)
return;
x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None);
if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)
return;
@ -4667,8 +4642,6 @@ initdatetime(void)
return;
Py_DECREF(x);
Py_DECREF(safepickle);
/* module initialization */
PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);
PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);

View File

@ -392,5 +392,4 @@ PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)
PyInt_FromLong((long) n_members));
PyDict_SetItemString(dict, unnamed_fields_key,
PyInt_FromLong((long) n_unnamed_members));
PyDict_SetItemString(dict, "__safe_for_unpickling__", Py_True);
}