@@ -180,6 +180,32 @@ def _builtin_type(name):
180180 return getattr (types , name )
181181
182182
183+ def _make__new__factory (type_ ):
184+ def _factory ():
185+ return type_ .__new__
186+ return _factory
187+
188+
189+ # NOTE: These need to be module globals so that they're pickleable as globals.
190+ _get_dict_new = _make__new__factory (dict )
191+ _get_frozenset_new = _make__new__factory (frozenset )
192+ _get_list_new = _make__new__factory (list )
193+ _get_set_new = _make__new__factory (set )
194+ _get_tuple_new = _make__new__factory (tuple )
195+ _get_object_new = _make__new__factory (object )
196+
197+ # Pre-defined set of builtin_function_or_method instances that can be
198+ # serialized.
199+ _BUILTIN_TYPE_ATTRS = {
200+ dict .__new__ : _get_dict_new ,
201+ frozenset .__new__ : _get_frozenset_new ,
202+ set .__new__ : _get_set_new ,
203+ list .__new__ : _get_list_new ,
204+ tuple .__new__ : _get_tuple_new ,
205+ object .__new__ : _get_object_new ,
206+ }
207+
208+
183209if sys .version_info < (3 , 4 ):
184210 def _walk_global_ops (code ):
185211 """
@@ -579,6 +605,8 @@ def extract_func_data(self, func):
579605 def save_builtin_function (self , obj ):
580606 if obj .__module__ == "__builtin__" :
581607 return self .save_global (obj )
608+ elif obj in _BUILTIN_TYPE_ATTRS :
609+ return self .save_reduce (_BUILTIN_TYPE_ATTRS [obj ], (), obj = obj )
582610 return self .save_function (obj )
583611 dispatch [types .BuiltinFunctionType ] = save_builtin_function
584612
0 commit comments