Skip to content

Commit 7f1b856

Browse files
committed
Merge pull request #6 from iciclespider/master
Store the new object reference before processing it's members.
2 parents f286dee + c3595c9 commit 7f1b856

File tree

1 file changed

+22
-54
lines changed

1 file changed

+22
-54
lines changed

javaobj.py

Lines changed: 22 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -306,16 +306,6 @@ def __eq__(self, other):
306306
return False
307307
return True
308308

309-
def copy(self, new_object):
310-
"""
311-
Returns a shallow copy of this object
312-
"""
313-
new_object.classdesc = self.classdesc
314-
new_object.annotations = self.annotations
315-
316-
for name in self.classdesc.fields_names:
317-
new_object.__setattr__(name, getattr(self, name))
318-
319309

320310
class JavaString(str):
321311
"""
@@ -768,16 +758,22 @@ def do_object(self, parent=None, ident=0):
768758
self.TC_NULL, self.TC_REFERENCE))
769759
# self.TC_REFERENCE hasn't shown in spec, but actually is here
770760

771-
# classdata[]
761+
# Create object
762+
for transformer in self.object_transformers:
763+
java_object = transformer.create(classdesc)
764+
if java_object:
765+
break
772766

773767
# Store classdesc of this object
774768
java_object.classdesc = classdesc
775769

770+
# Store the reference
771+
self._add_reference(java_object, ident)
772+
773+
# classdata[]
774+
776775
if classdesc.flags & self.SC_EXTERNALIZABLE \
777776
and not classdesc.flags & self.SC_BLOCK_DATA:
778-
# Store the reference anyway (to avoid a delta in indices)
779-
self._add_reference(java_object, ident)
780-
781777
# TODO:
782778
raise NotImplementedError("externalContents isn't implemented yet")
783779

@@ -839,16 +835,6 @@ def do_object(self, parent=None, ident=0):
839835
log_debug("java_object.annotations after: {0}"
840836
.format(java_object.annotations), ident)
841837

842-
# Transform object
843-
for transformer in self.object_transformers:
844-
tmp_object = transformer.transform(java_object)
845-
if tmp_object is not java_object:
846-
java_object = tmp_object
847-
break
848-
849-
# Store the reference
850-
self._add_reference(java_object, ident)
851-
852838
log_debug(">>> java_object: {0}".format(java_object), ident)
853839
return java_object
854840

@@ -900,12 +886,6 @@ def do_array(self, parent=None, ident=0):
900886
(size,) = self._readStruct(">i")
901887
log_debug("size: {0}".format(size), ident)
902888

903-
if isinstance(classdesc, JavaArray):
904-
# Issue #5 (JCEKS): It seems that a similar array can be referred
905-
# instead of its type
906-
log_debug("JavaArray referred instead of a classdesc...", ident)
907-
classdesc = classdesc.classdesc
908-
909889
type_char = classdesc.name[0]
910890
assert type_char == self.TYPE_ARRAY
911891
type_char = classdesc.name[1]
@@ -1425,48 +1405,36 @@ def __init__(self, *args, **kwargs):
14251405
dict.__init__(self, *args, **kwargs)
14261406
JavaObject.__init__(self)
14271407

1428-
def transform(self, java_object):
1408+
def create(self, classdesc):
14291409
"""
14301410
Transforms a deserialized Java object into a Python object
14311411
14321412
:param java_object: A JavaObject instance
14331413
:return: The Python form of the object, or the original JavaObject
14341414
"""
1435-
# Get the Java java_object class name
1436-
classname = java_object.get_class().name
14371415

1438-
if classname in ("java.util.ArrayList", "java.util.LinkedList"):
1416+
if classdesc.name in ("java.util.ArrayList", "java.util.LinkedList"):
14391417
# @serialData The length of the array backing the <tt>ArrayList</tt>
14401418
# instance is emitted (int), followed by all of its
14411419
# elements (each an <tt>Object</tt>) in the proper order
14421420
log_debug("---")
1443-
log_debug(classname)
1444-
log_debug(java_object.annotations)
1421+
log_debug(classdesc.name)
14451422
log_debug("---")
14461423

1447-
new_object = self.JavaList()
1448-
java_object.copy(new_object)
1449-
new_object.extend(java_object.annotations[1:])
1424+
java_object = self.JavaList()
14501425

1451-
log_debug(">>> java_object: {0}".format(new_object))
1452-
return new_object
1426+
log_debug(">>> java_object: {0}".format(java_object))
1427+
return java_object
14531428

1454-
elif java_object.get_class().name == "java.util.HashMap":
1429+
if classdesc.name == "java.util.HashMap":
14551430
log_debug("---")
14561431
log_debug("java.util.HashMap")
1457-
log_debug(java_object.annotations)
14581432
log_debug("---")
14591433

1460-
new_object = self.JavaMap()
1461-
java_object.copy(new_object)
1462-
1463-
for i in range((len(java_object.annotations) - 1) // 2):
1464-
new_object[java_object.annotations[i * 2 + 1]] = \
1465-
java_object.annotations[i * 2 + 2]
1434+
java_object = self.JavaMap()
14661435

1467-
log_debug(">>> java_object: {0}".format(new_object))
1468-
return new_object
1469-
1470-
else:
1471-
# Return the JavaObject by default
1436+
log_debug(">>> java_object: {0}".format(java_object))
14721437
return java_object
1438+
1439+
# Return a JavaObject by default
1440+
return JavaObject()

0 commit comments

Comments
 (0)