#?description=Reload and apply basic refactoring data on loaded code units
#?shortcut=
import json
import os
import time
from com.pnfsoftware.jeb.client.api import IScript
from com.pnfsoftware.jeb.core import RuntimeProjectUtil
from com.pnfsoftware.jeb.core.units.code import ICodeUnit
"""
Sample script for JEB Decompiler.
JEB script to reload and apply basic refactoring data onto loaded code units.
- Data file: [JEB]/bin/codedata.txt
- See converse script to persist such data on disk: CodeSave.py
"""
class CodeLoad(IScript):
def run(self, ctx):
prj = ctx.getMainProject()
assert prj, 'Need a project'
prjname = prj.getName()
prgdir = ctx.getProgramDirectory()
datafile = os.path.join(prgdir, 'codedata.txt')
data = {}
if os.path.exists(datafile):
with open(datafile, 'r') as f:
try:
data = json.load(f)
except:
pass
print('Current data:', data)
d = data.get(prjname, None)
if not d:
print('Nothing to reload')
return
units = RuntimeProjectUtil.findUnitsByType(prj, ICodeUnit, False)
if not units:
print('No code unit available')
return
for unit in units:
if not unit.isProcessed():
continue
a = d.get(unit.getName(), None)
if a:
renamed_classes = a['renamed_classes']
renamed_fields = a['renamed_fields']
renamed_methods = a['renamed_methods']
comments = a['comments']
for sig, name in renamed_classes.items():
unit.getClass(sig).setName(name)
for sig, name in renamed_fields.items():
unit.getField(sig).setName(name)
for sig, name in renamed_methods.items():
unit.getMethod(sig).setName(name)
# note: comments are applied last since `addr` can be a refactored one here
for addr, comment in comments.items():
unit.setInlineComment(addr, comment)
print('Basic refactoring data was applied')