Skip to content

Commit 05c8448

Browse files
author
vbuell
committed
Enum deserialization has been added
1 parent 2124aef commit 05c8448

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

javaobj.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,8 @@ def __init__(self, stream=None):
146146
self.TC_ARRAY: self.do_array,
147147
self.TC_CLASS: self.do_class,
148148
self.TC_BLOCKDATA: self.do_blockdata,
149-
self.TC_REFERENCE: self.do_reference
149+
self.TC_REFERENCE: self.do_reference,
150+
self.TC_ENUM: self.do_enum
150151
}
151152
self.current_object = None
152153
self.reference_counter = 0
@@ -182,7 +183,10 @@ def _read_and_exec_opcode(self, ident=0, expect=None):
182183
log_debug("OpCode: 0x%X" % opid, ident)
183184
if expect and opid not in expect:
184185
raise IOError("Unexpected opcode 0x%X" % opid)
185-
return self.opmap.get(opid, self.do_unknown)(ident=ident)
186+
handler = self.opmap.get(opid)
187+
if not handler:
188+
raise RuntimeError("Unknown OpCode in the stream: 0x%x" % opid)
189+
return handler(ident=ident)
186190

187191
def _readStruct(self, unpack):
188192
length = struct.calcsize(unpack)
@@ -378,8 +382,13 @@ def do_reference(self, parent=None, ident=0):
378382
def do_null(self, parent=None, ident=0):
379383
return None
380384

381-
def do_unknown(self, parent=None, ident=0):
382-
raise RuntimeError("Unknown OpCode")
385+
def do_enum(self, parent=None, ident=0):
386+
# TC_ENUM classDesc newHandle enumConstantName
387+
enum = JavaObject()
388+
classdesc = self._read_and_exec_opcode(ident=ident+1, expect=[self.TC_CLASSDESC, self.TC_PROXYCLASSDESC, self.TC_NULL, self.TC_REFERENCE])
389+
self._add_reference(enum)
390+
enumConstantName = self._read_and_exec_opcode(ident=ident+1, expect=[self.TC_STRING, self.TC_REFERENCE])
391+
return enumConstantName
383392

384393
def _create_hexdump(self, src, length=16):
385394
FILTER=''.join([(len(repr(chr(x)))==3) and chr(x) or '.' for x in range(256)])

tests.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
class TestJavaobj(unittest.TestCase):
66

77
def setUp(self):
8-
logging.basicConfig(level=logging.DEBUG)
8+
import sys
9+
logging.basicConfig(level=logging.DEBUG, stream=sys.stdout)
910

1011
def read_file(self, filename):
1112
file = open(filename, 'rb')

0 commit comments

Comments
 (0)