Model: GusPuffy/sentient-simulations-pydecompiler-3.7-6.7b-v0.9 Source: Original Platform
67 lines
1.9 KiB
Python
67 lines
1.9 KiB
Python
import dis
|
|
import io
|
|
import re
|
|
import sys
|
|
import textwrap
|
|
from op_codes import op_codes_37
|
|
|
|
|
|
def fix_spacing(unformatted_decompiled_python):
|
|
decompiled_python = re.sub(r"[ \t]+", " ", unformatted_decompiled_python)
|
|
decompiled_python = re.sub(r"\n ", "\n", decompiled_python)
|
|
return decompiled_python
|
|
|
|
|
|
def get_byte_code(python_code):
|
|
code_object = compile(python_code, "f.py", "exec")
|
|
|
|
original_stdout = sys.stdout
|
|
string_output = io.StringIO()
|
|
sys.stdout = string_output
|
|
dis.dis(code_object)
|
|
sys.stdout = original_stdout
|
|
disassembled_pyc = string_output.getvalue()
|
|
return fix_spacing(textwrap.dedent(str(disassembled_pyc)).strip())
|
|
|
|
|
|
def extract_text_between_parentheses(input_string):
|
|
start_index = input_string.find("(")
|
|
end_index = input_string.rfind(")")
|
|
|
|
if start_index != -1 and end_index != -1 and start_index < end_index:
|
|
return input_string[start_index + 1 : end_index]
|
|
else:
|
|
return ""
|
|
|
|
|
|
def reformat_bytecode_line(input_string):
|
|
if input_string.startswith("Disassembly of <"):
|
|
return None
|
|
|
|
for code in op_codes_37:
|
|
if code in input_string:
|
|
reformatted_string = extract_text_between_parentheses(input_string)
|
|
return f"{code} {reformatted_string}".strip()
|
|
|
|
return input_string
|
|
|
|
|
|
def format_bytecode(bytecode: str):
|
|
formatted_strings = []
|
|
for line in bytecode.split("\n"):
|
|
reformatted_string = reformat_bytecode_line(line)
|
|
if reformatted_string is not None:
|
|
formatted_strings.append(reformatted_string)
|
|
return "\n".join(formatted_strings).strip()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
file_path = sys.argv[1]
|
|
print(f"Converting python source code to byte code {file_path}")
|
|
with open(file_path, "r") as file:
|
|
file_contents = file.read()
|
|
print(file_contents)
|
|
byte_code = get_byte_code(file_contents)
|
|
|
|
print(format_bytecode(bytecode=byte_code))
|