mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
load_inst(), load_obj(): Put the bulk of these into a common new
_instantiate() method.
This commit is contained in:
parent
ceead6d957
commit
d01c1e91c4
1 changed files with 18 additions and 26 deletions
|
@ -1065,15 +1065,17 @@ class Unpickler:
|
||||||
self.stack[k:] = [d]
|
self.stack[k:] = [d]
|
||||||
dispatch[DICT] = load_dict
|
dispatch[DICT] = load_dict
|
||||||
|
|
||||||
def load_inst(self):
|
# INST and OBJ differ only in how they get a class object. It's not
|
||||||
k = self.marker()
|
# only sensible to do the rest in a common routine, the two routines
|
||||||
|
# previously diverged and grew different bugs.
|
||||||
|
# klass is the class to instantiate, and k points to the topmost mark
|
||||||
|
# object, following which are the arguments for klass.__init__.
|
||||||
|
def _instantiate(self, klass, k):
|
||||||
args = tuple(self.stack[k+1:])
|
args = tuple(self.stack[k+1:])
|
||||||
del self.stack[k:]
|
del self.stack[k:]
|
||||||
module = self.readline()[:-1]
|
|
||||||
name = self.readline()[:-1]
|
|
||||||
klass = self.find_class(module, name)
|
|
||||||
instantiated = 0
|
instantiated = 0
|
||||||
if (not args and type(klass) is ClassType and
|
if (not args and
|
||||||
|
type(klass) is ClassType and
|
||||||
not hasattr(klass, "__getinitargs__")):
|
not hasattr(klass, "__getinitargs__")):
|
||||||
try:
|
try:
|
||||||
value = _EmptyClass()
|
value = _EmptyClass()
|
||||||
|
@ -1090,29 +1092,19 @@ class Unpickler:
|
||||||
raise TypeError, "in constructor for %s: %s" % (
|
raise TypeError, "in constructor for %s: %s" % (
|
||||||
klass.__name__, str(err)), sys.exc_info()[2]
|
klass.__name__, str(err)), sys.exc_info()[2]
|
||||||
self.append(value)
|
self.append(value)
|
||||||
|
|
||||||
|
def load_inst(self):
|
||||||
|
module = self.readline()[:-1]
|
||||||
|
name = self.readline()[:-1]
|
||||||
|
klass = self.find_class(module, name)
|
||||||
|
self._instantiate(klass, self.marker())
|
||||||
dispatch[INST] = load_inst
|
dispatch[INST] = load_inst
|
||||||
|
|
||||||
def load_obj(self):
|
def load_obj(self):
|
||||||
stack = self.stack
|
# Stack is ... markobject classobject arg1 arg2 ...
|
||||||
k = self.marker()
|
k = self.marker()
|
||||||
klass = stack[k + 1]
|
klass = self.stack.pop(k+1)
|
||||||
del stack[k + 1]
|
self._instantiate(klass, k)
|
||||||
args = tuple(stack[k + 1:])
|
|
||||||
del stack[k:]
|
|
||||||
instantiated = 0
|
|
||||||
if (not args and type(klass) is ClassType and
|
|
||||||
not hasattr(klass, "__getinitargs__")):
|
|
||||||
try:
|
|
||||||
value = _EmptyClass()
|
|
||||||
value.__class__ = klass
|
|
||||||
instantiated = 1
|
|
||||||
except RuntimeError:
|
|
||||||
# In restricted execution, assignment to inst.__class__ is
|
|
||||||
# prohibited
|
|
||||||
pass
|
|
||||||
if not instantiated:
|
|
||||||
value = klass(*args)
|
|
||||||
self.append(value)
|
|
||||||
dispatch[OBJ] = load_obj
|
dispatch[OBJ] = load_obj
|
||||||
|
|
||||||
def load_newobj(self):
|
def load_newobj(self):
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue