|
|
@@ -3,11 +3,21 @@ import sys |
|
|
|
|
|
|
|
import func_smash |
|
|
|
|
|
|
|
OP_HASLOAD = {"LOAD_CONST": True, "LOAD_FAST": False, "LOAD_GLOBAL": False} |
|
|
|
OP_HASBINARY = {"BINARY_ADD": "+", "BINARY_SUBTRACT": "-", |
|
|
|
"BINARY_MULTIPLY": "*", "BINARY_DIVIDE": "/", |
|
|
|
"BINARY_POWER": "**", "BINARY_MODULO": "%"} |
|
|
|
OP_HASBUILD = {"BUILD_TUPLE": ("(", ")"), "BUILD_LIST": ("[", "]"), |
|
|
|
OP_LOAD = {"LOAD_CONST": True, "LOAD_FAST": False, "LOAD_GLOBAL": False} |
|
|
|
OP_BINARY = {"BINARY_POWER": "**", "BINARY_MULTIPLY": "*", |
|
|
|
"BINARY_DIVIDE": "/", "BINARY_MODULO": "%", "BINARY_ADD": "+", |
|
|
|
"BINARY_SUBTRACT": "-", "BINARY_FLOOR_DIVIDE": "//", |
|
|
|
"BINARY_TRUE_DIVIDE": "/", "BINARY_LSHIFT": "<<", |
|
|
|
"BINARY_RSHIFT": ">>", "BINARY_AND": "&", "BINARY_XOR": "^", |
|
|
|
"BINARY_OR": "|"} |
|
|
|
OP_INPLACE = {"INPLACE_FLOOR_DIVIDE": "//", "INPLACE_TRUE_DIVIDE": "/", |
|
|
|
"INPLACE_ADD": "+", "INPLACE_SUBTRACT": "-", |
|
|
|
"INPLACE_MULTIPLY": "*", "INPLACE_DIVIDE": "/", |
|
|
|
"INPLACE_MODULO": "%", "INPLACE_POWER": "**", |
|
|
|
"INPLACE_LSHIFT": "<<", "INPLACE_RSHIFT": ">>", |
|
|
|
"INPLACE_AND": "&", "INPLACE_XOR": "^", "INPLACE_OR": "|"} |
|
|
|
OP_SUBSCR = ("BINARY_SUBSCR", "INPLACE_SUBSCR") |
|
|
|
OP_BUILD = {"BUILD_TUPLE": ("(", ")"), "BUILD_LIST": ("[", "]"), |
|
|
|
"BUILD_SET": ("{", "}")} |
|
|
|
|
|
|
|
TAB = 4 |
|
|
@@ -70,17 +80,23 @@ def _parse_codestring(codes): |
|
|
|
lines.append((indent, "pass")) |
|
|
|
block_else_at.remove(x) |
|
|
|
_print(indent, i, opname, arg, debug=True) |
|
|
|
if opname in OP_HASLOAD: |
|
|
|
_push(stack, arg, literal=OP_HASLOAD[opname]) |
|
|
|
elif opname in OP_HASBINARY: |
|
|
|
if opname in OP_LOAD: |
|
|
|
_push(stack, arg, literal=OP_LOAD[opname]) |
|
|
|
elif opname in OP_BINARY: |
|
|
|
tos, tos1 = _pop(stack), _pop(stack) |
|
|
|
_push(stack, " ".join((tos1, OP_HASBINARY[opname], tos))) |
|
|
|
elif opname in OP_HASBUILD: |
|
|
|
_push(stack, " ".join((tos1, OP_BINARY[opname], tos))) |
|
|
|
elif opname in OP_INPLACE: # Works, but doesn't use inplace op magic |
|
|
|
tos, tos1 = _pop(stack), _pop(stack) |
|
|
|
_push(stack, " ".join((tos1, OP_INPLACE[opname], tos))) |
|
|
|
elif opname in OP_SUBSCR: |
|
|
|
tos, tos1 = _pop(stack), _pop(stack) |
|
|
|
_push(stack, "{0}[{1}]".format(tos1, tos)) |
|
|
|
elif opname in OP_BUILD: |
|
|
|
args = [] |
|
|
|
for i in xrange(arg): |
|
|
|
args.append(_pop(stack)) |
|
|
|
args.reverse() |
|
|
|
start, end = OP_HASBUILD[opname] |
|
|
|
start, end = OP_BUILD[opname] |
|
|
|
_push(stack, start + ", ".join(args) + end) |
|
|
|
elif opname == "BUILD_MAP": |
|
|
|
_push(stack, "{}") |
|
|
|