Skip to content

Commit c173b47

Browse files
committed
improve jvdasm output
1 parent 751dc23 commit c173b47

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

refinery/lib/java.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ def __init__(self, reader: StructReader, **kwargs):
115115
super().__init__(reader, **kwargs)
116116
self.value = reader.u16()
117117

118-
def __repr__(self): return repr(self.value)
118+
def __repr__(self):
119+
return repr(self.value)
119120

120-
def __str__(self): return self.value
121+
def __str__(self):
122+
return self.value
121123

122124

123125
class JvClassProperty(_HasPoolAndTag):
@@ -129,7 +131,10 @@ def __init__(self, reader: StructReader, **kwargs):
129131
self.name = reader.u16()
130132
self.info = reader.u16()
131133

132-
def __repr__(self): return F'{self.name}::{self.info}'
134+
def __repr__(self):
135+
name: str = str(self.name)
136+
name = '.'.join(name.split('/'))
137+
return F'{name}::{self.info}'
133138

134139

135140
class JvMethodHandle(_HasPoolAndTag):

refinery/units/formats/java/jvdasm.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,36 @@
1010
from refinery.lib.java import JvClassFile, JvCode, opc
1111

1212

13+
def _parse_descriptor(descriptor: str):
14+
def parse_type_list(args: str):
15+
while args:
16+
suffix = ''
17+
while args.startswith('['):
18+
args = args[1:]
19+
suffix += '[]'
20+
code, args = args[0], args[1:]
21+
if code == 'L':
22+
spec, _, args = args.partition(';')
23+
spec = spec.replace('/', '.')
24+
else:
25+
spec = {
26+
'Z': 'boolean',
27+
'B': 'byte',
28+
'S': 'short',
29+
'I': 'int',
30+
'J': 'long',
31+
'F': 'float',
32+
'D': 'double',
33+
'C': 'char',
34+
'V': 'void',
35+
}[code]
36+
yield spec + suffix
37+
38+
args, retval = re.match(R'^\((.*?)\)(.*?)$', descriptor).groups()
39+
retval, = parse_type_list(retval)
40+
return retval, tuple(parse_type_list(args))
41+
42+
1343
class jvdasm(PathExtractorUnit):
1444
"""
1545
Disassembles the JVM bytecode instructions of methods of classes defined in Java class
@@ -33,8 +63,9 @@ def unpack(self, data):
3363
continue
3464
code: JvCode = attribute.parse(JvCode)
3565
with io.StringIO() as display:
36-
args, retval = re.match(R'^\((.*?)\)(.*?)$', method.descriptor).groups()
37-
print(F'{jc.this!s}::{method!s}{method.descriptor}', file=display)
66+
rv, args = _parse_descriptor(method.descriptor)
67+
args = ', '.join(args)
68+
print(F'{rv} {jc.this!s}::{method!s}({args})', file=display)
3869
for op in code.disassembly:
3970
olen = len(op.raw)
4071
if op.table is None:

0 commit comments

Comments
 (0)