@@ -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 )])
0 commit comments