| @@ -3,11 +3,21 @@ import sys | |||||
| import func_smash | 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": ("{", "}")} | "BUILD_SET": ("{", "}")} | ||||
| TAB = 4 | TAB = 4 | ||||
| @@ -70,17 +80,23 @@ def _parse_codestring(codes): | |||||
| lines.append((indent, "pass")) | lines.append((indent, "pass")) | ||||
| block_else_at.remove(x) | block_else_at.remove(x) | ||||
| _print(indent, i, opname, arg, debug=True) | _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) | 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 = [] | args = [] | ||||
| for i in xrange(arg): | for i in xrange(arg): | ||||
| args.append(_pop(stack)) | args.append(_pop(stack)) | ||||
| args.reverse() | args.reverse() | ||||
| start, end = OP_HASBUILD[opname] | |||||
| start, end = OP_BUILD[opname] | |||||
| _push(stack, start + ", ".join(args) + end) | _push(stack, start + ", ".join(args) + end) | ||||
| elif opname == "BUILD_MAP": | elif opname == "BUILD_MAP": | ||||
| _push(stack, "{}") | _push(stack, "{}") | ||||