commit da046a9a9004a570da5822fb6bc44128f3a03899 Author: Michael Hansen Date: Fri Jul 24 08:35:21 2009 +0000 Code so far diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bfe88a3 --- /dev/null +++ b/Makefile @@ -0,0 +1,53 @@ +CXX = g++ +CXXFLAGS = -g -Wall + +COMMON = \ + out/module.o \ + out/data.o \ + out/bytecode.o \ + out/object.o \ + out/numeric.o \ + out/code.o \ + out/sequence.o \ + out/string.o + +ALL = \ + bin/pycdas + +PREFIX = /usr/local + +all: $(ALL) + +clean: + rm -f $(COMMON) + +install: + mkdir -p $(PREFIX)/bin + cp $(ALL) $(PREFIX)/bin + +bin/pycdas: pycdas.cpp $(COMMON) + $(CXX) $(CXXFLAGS) $(COMMON) pycdas.cpp -o $@ + +out/module.o: module.h module.cpp + $(CXX) $(CXXFLAGS) -c module.cpp -o $@ + +out/data.o: data.h data.cpp + $(CXX) $(CXXFLAGS) -c data.cpp -o $@ + +out/bytecode.o: bytecode.h bytecode.cpp + $(CXX) $(CXXFLAGS) -c bytecode.cpp -o $@ + +out/object.o: object.h object.cpp + $(CXX) $(CXXFLAGS) -c object.cpp -o $@ + +out/numeric.o: numeric.h numeric.cpp + $(CXX) $(CXXFLAGS) -c numeric.cpp -o $@ + +out/code.o: code.h code.cpp + $(CXX) $(CXXFLAGS) -c code.cpp -o $@ + +out/sequence.o: sequence.h sequence.cpp + $(CXX) $(CXXFLAGS) -c sequence.cpp -o $@ + +out/string.o: string.h string.cpp + $(CXX) $(CXXFLAGS) -c string.cpp -o $@ diff --git a/PythonBytecode.txt b/PythonBytecode.txt new file mode 100644 index 0000000..16425b6 --- /dev/null +++ b/PythonBytecode.txt @@ -0,0 +1,594 @@ +Python MAGIC Python MAGIC Python MAGIC +1.0 0x00999902 2.0 0x0A0DC687 3.0 0x0A0D0C3A +1.1 0x00999903 2.1 0x0A0DEB2A 3.1 0x0A0D0C4E +1.2 0x00999903 2.2 0x0A0DED2D +1.3 0x0A0D2E89 2.3 0x0A0DF23B +1.4 0x0A0D1704 2.4 0x0A0DF26D +1.5 0x0A0D4E99 2.5 0x0A0DF2B3 +1.6 0x0A0DC4FC 2.6 0x0A0DF2D1 + + + 1.0 1.1 1.2 1.3 1.4 1.5 1.6 +STOP_CODE [X] [X] [X] [X] [X] [X] [X] +POP_TOP [X] [X] [X] [X] [X] [X] [X] +ROT_TWO [X] [X] [X] [X] [X] [X] [X] +ROT_THREE [X] [X] [X] [X] [X] [X] [X] +DUP_TOP [X] [X] [X] [X] [X] [X] [X] +<5> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<6> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<7> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<8> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<9> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +UNARY_POSITIVE [X] [X] [X] [X] [X] [X] [X] +UNARY_NEGATIVE [X] [X] [X] [X] [X] [X] [X] +UNARY_NOT [X] [X] [X] [X] [X] [X] [X] +UNARY_CONVERT [X] [X] [X] [X] [X] [X] [X] +UNARY_CALL [X] [X] [X] [X] [X] [ ] [ ] +UNARY_INVERT [X] [X] [X] [X] [X] [X] [X] +<16> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<17> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<18> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +BINARY_POWER [ ] [ ] [ ] [ ] [X] [X] [X] +BINARY_MULTIPLY [X] [X] [X] [X] [X] [X] [X] +BINARY_DIVIDE [X] [X] [X] [X] [X] [X] [X] +BINARY_MODULO [X] [X] [X] [X] [X] [X] [X] +BINARY_ADD [X] [X] [X] [X] [X] [X] [X] +BINARY_SUBTRACT [X] [X] [X] [X] [X] [X] [X] +BINARY_SUBSCR [X] [X] [X] [X] [X] [X] [X] +BINARY_CALL [X] [X] [X] [X] [X] [ ] [ ] +<27> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<28> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<29> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +SLICE+0 [X] [X] [X] [X] [X] [X] [X] +SLICE+1 [X] [X] [X] [X] [X] [X] [X] +SLICE+2 [X] [X] [X] [X] [X] [X] [X] +SLICE+3 [X] [X] [X] [X] [X] [X] [X] +<34> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<35> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<36> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<37> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<38> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<39> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +STORE_SLICE+0 [X] [X] [X] [X] [X] [X] [X] +STORE_SLICE+1 [X] [X] [X] [X] [X] [X] [X] +STORE_SLICE+2 [X] [X] [X] [X] [X] [X] [X] +STORE_SLICE+3 [X] [X] [X] [X] [X] [X] [X] +<44> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<45> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<46> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<47> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<48> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<49> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +DELETE_SLICE+0 [X] [X] [X] [X] [X] [X] [X] +DELETE_SLICE+1 [X] [X] [X] [X] [X] [X] [X] +DELETE_SLICE+2 [X] [X] [X] [X] [X] [X] [X] +DELETE_SLICE+3 [X] [X] [X] [X] [X] [X] [X] +<54> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<55> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<56> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<57> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<58> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<59> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +STORE_SUBSCR [X] [X] [X] [X] [X] [X] [X] +DELETE_SUBSCR [X] [X] [X] [X] [X] [X] [X] +BINARY_LSHIFT [ ] [ ] [ ] [ ] [ ] [X] [X] +BINARY_RSHIFT [ ] [ ] [ ] [ ] [ ] [X] [X] +BINARY_AND [ ] [ ] [ ] [ ] [ ] [X] [X] +BINARY_XOR [ ] [ ] [ ] [ ] [ ] [X] [X] +BINARY_OR [ ] [ ] [ ] [ ] [ ] [X] [X] +<67> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<68> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<69> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +PRINT_EXPR [X] [X] [X] [X] [X] [X] [X] +PRINT_ITEM [X] [X] [X] [X] [X] [X] [X] +PRINT_NEWLINE [X] [X] [X] [X] [X] [X] [X] +<73> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<74> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<75> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<76> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<77> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<78> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<79> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +BREAK_LOOP [X] [X] [X] [X] [X] [X] [X] +RAISE_EXCEPTION [X] [X] [X] [X] [X] [ ] [ ] +LOAD_LOCALS [X] [X] [X] [X] [X] [X] [X] +RETURN_VALUE [X] [X] [X] [X] [X] [X] [X] +LOAD_GLOBALS [ ] [X] [X] [X] [ ] [ ] [ ] +EXEC_STMT [ ] [X] [X] [X] [X] [X] [X] +BUILD_FUNCTION [X] [X] [X] [X] [X] [ ] [ ] +POP_BLOCK [X] [X] [X] [X] [X] [X] [X] +END_FINALLY [X] [X] [X] [X] [X] [X] [X] +BUILD_CLASS [X] [X] [X] [X] [X] [X] [X] +STORE_NAME [X] [X] [X] [X] [X] [X] [X] +DELETE_NAME [X] [X] [X] [X] [X] [X] [X] +UNPACK_TUPLE [X] [X] [X] [X] [X] [X] [X] +UNPACK_LIST [X] [X] [X] [X] [X] [X] [X] +UNPACK_ARG [X] [X] [X] [X] [X] [ ] [ ] +STORE_ATTR [X] [X] [X] [X] [X] [X] [X] +DELETE_ATTR [X] [X] [X] [X] [X] [X] [X] +STORE_GLOBAL [X] [X] [X] [X] [X] [X] [X] +DELETE_GLOBAL [X] [X] [X] [X] [X] [X] [X] +UNPACK_VARARG [X] [X] [X] [X] [X] [ ] [ ] +LOAD_CONST [X] [X] [X] [X] [X] [X] [X] +LOAD_NAME [X] [X] [X] [X] [X] [X] [X] +BUILD_TUPLE [X] [X] [X] [X] [X] [X] [X] +BUILD_LIST [X] [X] [X] [X] [X] [X] [X] +BUILD_MAP [X] [X] [X] [X] [X] [X] [X] +LOAD_ATTR [X] [X] [X] [X] [X] [X] [X] +COMPARE_OP [X] [X] [X] [X] [X] [X] [X] +IMPORT_NAME [X] [X] [X] [X] [X] [X] [X] +IMPORT_FROM [X] [X] [X] [X] [X] [X] [X] +<109> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +JUMP_FORWARD [X] [X] [X] [X] [X] [X] [X] +JUMP_IF_FALSE [X] [X] [X] [X] [X] [X] [X] +JUMP_IF_TRUE [X] [X] [X] [X] [X] [X] [X] +JUMP_ABSOLUTE [X] [X] [X] [X] [X] [X] [X] +FOR_LOOP [X] [X] [X] [X] [X] [X] [X] +LOAD_LOCAL [X] [X] [X] [X] [X] [ ] [ ] +LOAD_GLOBAL [X] [X] [X] [X] [X] [X] [X] +SET_FUNC_ARGS [ ] [X] [X] [X] [X] [ ] [ ] +<118> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<119> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +SETUP_LOOP [X] [X] [X] [X] [X] [X] [X] +SETUP_EXCEPT [X] [X] [X] [X] [X] [X] [X] +SETUP_FINALLY [X] [X] [X] [X] [X] [X] [X] +RESERVE_FAST [X] [X] [X] [X] [X] [ ] [ ] +LOAD_FAST [X] [X] [X] [X] [X] [X] [X] +STORE_FAST [X] [X] [X] [X] [X] [X] [X] +DELETE_FAST [X] [X] [X] [X] [X] [X] [X] +SET_LINENO [X] [X] [X] [X] [X] [X] [X] +<128> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<129> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +RAISE_VARARGS [ ] [ ] [ ] [ ] [X] [X] [X] +CALL_FUNCTION [ ] [ ] [ ] [ ] [X] [X] [X] +MAKE_FUNCTION [ ] [ ] [ ] [ ] [X] [X] [X] +BUILD_SLICE [ ] [ ] [ ] [ ] [X] [X] [X] +<134> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<135> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<136> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<137> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<138> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<139> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +CALL_FUNCTION_VAR [ ] [ ] [ ] [ ] [ ] [ ] [X] +CALL_FUNCTION_KW [ ] [ ] [ ] [ ] [ ] [ ] [X] +CALL_FUNCTION_VAR_KW [ ] [ ] [ ] [ ] [ ] [ ] [X] +<143> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<144> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<145> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<146> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<147> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<148> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<149> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<150> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<151> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<152> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<153> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<154> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<155> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<156> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<157> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<158> [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<159> [ ] [ ] [ ] [ ] [ ] [ ] [ ] + . + . + . + + + 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 +STOP_CODE [X] [X] [X] [X] [X] [X] [X] [ ] +POP_TOP [X] [X] [X] [X] [X] [X] [X] [ ] +ROT_TWO [X] [X] [X] [X] [X] [X] [X] [ ] +ROT_THREE [X] [X] [X] [X] [X] [X] [X] [ ] +DUP_TOP [X] [X] [X] [X] [X] [X] [X] [ ] +ROT_FOUR [X] [X] [X] [X] [X] [X] [X] [ ] +<6> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<7> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<8> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +NOP [ ] [ ] [ ] [ ] [X] [X] [X] [ ] +UNARY_POSITIVE [X] [X] [X] [X] [X] [X] [X] [ ] +UNARY_NEGATIVE [X] [X] [X] [X] [X] [X] [X] [ ] +UNARY_NOT [X] [X] [X] [X] [X] [X] [X] [ ] +UNARY_CONVERT [X] [X] [X] [X] [X] [X] [X] [ ] +<14> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +UNARY_INVERT [X] [X] [X] [X] [X] [X] [X] [ ] +<16> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<17> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +LIST_APPEND [ ] [ ] [ ] [ ] [X] [X] [X] [ ] +BINARY_POWER [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_MULTIPLY [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_DIVIDE [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_MODULO [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_ADD [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_SUBTRACT [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_SUBSCR [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_FLOOR_DIVIDE [ ] [ ] [X] [X] [X] [X] [X] [ ] +BINARY_TRUE_DIVIDE [ ] [ ] [X] [X] [X] [X] [X] [ ] +INPLACE_FLOOR_DIVIDE [ ] [ ] [X] [X] [X] [X] [X] [ ] +INPLACE_TRUE_DIVIDE [ ] [ ] [X] [X] [X] [X] [X] [ ] +SLICE+0 [X] [X] [X] [X] [X] [X] [X] [ ] +SLICE+1 [X] [X] [X] [X] [X] [X] [X] [ ] +SLICE+2 [X] [X] [X] [X] [X] [X] [X] [ ] +SLICE+3 [X] [X] [X] [X] [X] [X] [X] [ ] +<34> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<35> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<36> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<37> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<38> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<39> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +STORE_SLICE+0 [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_SLICE+1 [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_SLICE+2 [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_SLICE+3 [X] [X] [X] [X] [X] [X] [X] [ ] +<44> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<45> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<46> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<47> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<48> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<49> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +DELETE_SLICE+0 [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_SLICE+1 [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_SLICE+2 [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_SLICE+3 [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_MAP [ ] [ ] [ ] [ ] [ ] [ ] [X] [ ] +INPLACE_ADD [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_SUBTRACT [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_MULTIPLY [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_DIVIDE [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_MODULO [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_SUBSCR [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_SUBSCR [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_LSHIFT [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_RSHIFT [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_AND [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_XOR [X] [X] [X] [X] [X] [X] [X] [ ] +BINARY_OR [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_POWER [X] [X] [X] [X] [X] [X] [X] [ ] +GET_ITER [ ] [ ] [X] [X] [X] [X] [X] [ ] +<69> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +PRINT_EXPR [X] [X] [X] [X] [X] [X] [X] [ ] +PRINT_ITEM [X] [X] [X] [X] [X] [X] [X] [ ] +PRINT_NEWLINE [X] [X] [X] [X] [X] [X] [X] [ ] +PRINT_ITEM_TO [X] [X] [X] [X] [X] [X] [X] [ ] +PRINT_NEWLINE_TO [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_LSHIFT [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_RSHIFT [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_AND [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_XOR [X] [X] [X] [X] [X] [X] [X] [ ] +INPLACE_OR [X] [X] [X] [X] [X] [X] [X] [ ] +BREAK_LOOP [X] [X] [X] [X] [X] [X] [X] [ ] +WITH_CLEANUP [ ] [ ] [ ] [ ] [ ] [X] [X] [ ] +LOAD_LOCALS [X] [X] [X] [X] [X] [X] [X] [ ] +RETURN_VALUE [X] [X] [X] [X] [X] [X] [X] [ ] +IMPORT_STAR [X] [X] [X] [X] [X] [X] [X] [ ] +EXEC_STMT [X] [X] [X] [X] [X] [X] [X] [ ] +YIELD_VALUE [ ] [ ] [X] [X] [X] [X] [X] [ ] +POP_BLOCK [X] [X] [X] [X] [X] [X] [X] [ ] +END_FINALLY [X] [X] [X] [X] [X] [X] [X] [ ] +BUILD_CLASS [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_NAME [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_NAME [X] [X] [X] [X] [X] [X] [X] [ ] +UNPACK_SEQUENCE [X] [X] [X] [X] [X] [X] [X] [ ] +FOR_ITER [ ] [ ] [X] [X] [X] [X] [X] [ ] +<94> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +STORE_ATTR [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_ATTR [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_GLOBAL [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_GLOBAL [X] [X] [X] [X] [X] [X] [X] [ ] +DUP_TOPX [X] [X] [X] [X] [X] [X] [X] [ ] +LOAD_CONST [X] [X] [X] [X] [X] [X] [X] [ ] +LOAD_NAME [X] [X] [X] [X] [X] [X] [X] [ ] +BUILD_TUPLE [X] [X] [X] [X] [X] [X] [X] [ ] +BUILD_LIST [X] [X] [X] [X] [X] [X] [X] [ ] +BUILD_MAP [X] [X] [X] [X] [X] [X] [X] [ ] +LOAD_ATTR [X] [X] [X] [X] [X] [X] [X] [ ] +COMPARE_OP [X] [X] [X] [X] [X] [X] [X] [ ] +IMPORT_NAME [X] [X] [X] [X] [X] [X] [X] [ ] +IMPORT_FROM [X] [X] [X] [X] [X] [X] [X] [ ] +<109> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +JUMP_FORWARD [X] [X] [X] [X] [X] [X] [X] [ ] +JUMP_IF_FALSE [X] [X] [X] [X] [X] [X] [X] [ ] +JUMP_IF_TRUE [X] [X] [X] [X] [X] [X] [X] [ ] +JUMP_ABSOLUTE [X] [X] [X] [X] [X] [X] [X] [ ] +FOR_LOOP [X] [X] [X] [ ] [ ] [ ] [ ] [ ] +<115> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +LOAD_GLOBAL [X] [X] [X] [X] [X] [X] [X] [ ] +<117> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<118> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +CONTINUE_LOOP [ ] [X] [X] [X] [X] [X] [X] [ ] +SETUP_LOOP [X] [X] [X] [X] [X] [X] [X] [ ] +SETUP_EXCEPT [X] [X] [X] [X] [X] [X] [X] [ ] +SETUP_FINALLY [X] [X] [X] [X] [X] [X] [X] [ ] +<123> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +LOAD_FAST [X] [X] [X] [X] [X] [X] [X] [ ] +STORE_FAST [X] [X] [X] [X] [X] [X] [X] [ ] +DELETE_FAST [X] [X] [X] [X] [X] [X] [X] [ ] +SET_LINENO [X] [X] [X] [ ] [ ] [ ] [ ] [ ] +<128> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<129> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +RAISE_VARARGS [X] [X] [X] [X] [X] [X] [X] [ ] +CALL_FUNCTION [X] [X] [X] [X] [X] [X] [X] [ ] +MAKE_FUNCTION [X] [X] [X] [X] [X] [X] [X] [ ] +BUILD_SLICE [X] [X] [X] [X] [X] [X] [X] [ ] +MAKE_CLOSURE [ ] [X] [X] [X] [X] [X] [X] [ ] +LOAD_CLOSURE [ ] [X] [X] [X] [X] [X] [X] [ ] +LOAD_DEREF [ ] [X] [X] [X] [X] [X] [X] [ ] +STORE_DEREF [ ] [X] [X] [X] [X] [X] [X] [ ] +<138> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<139> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +CALL_FUNCTION_VAR [X] [X] [X] [X] [X] [X] [X] [ ] +CALL_FUNCTION_KW [X] [X] [X] [X] [X] [X] [X] [ ] +CALL_FUNCTION_VAR_KW [X] [X] [X] [X] [X] [X] [X] [ ] +EXTENDED_ARG [X] [X] [X] [X] [X] [X] [X] [ ] +<144> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<145> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<146> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<147> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<148> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<149> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<150> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<151> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<152> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<153> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<154> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<155> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<156> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<157> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<158> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] +<159> [ ] [ ] [ ] [ ] [ ] [ ] [ ] [ ] + . + . + . + + + 3.0 3.1 3.2 +STOP_CODE [X] [X] [ ] +POP_TOP [X] [X] [ ] +ROT_TWO [X] [X] [ ] +ROT_THREE [X] [X] [ ] +DUP_TOP [X] [X] [ ] +ROT_FOUR [X] [X] [ ] +<6> [ ] [ ] [ ] +<7> [ ] [ ] [ ] +<8> [ ] [ ] [ ] +NOP [X] [X] [ ] +UNARY_POSITIVE [X] [X] [ ] +UNARY_NEGATIVE [X] [X] [ ] +UNARY_NOT [X] [X] [ ] +<13> [ ] [ ] [ ] +<14> [ ] [ ] [ ] +UNARY_INVERT [X] [X] [ ] +<16> [ ] [ ] [ ] +SET_ADD [X] [ ] [ ] +LIST_APPEND [X] [ ] [ ] +BINARY_POWER [X] [X] [ ] +BINARY_MULTIPLY [X] [X] [ ] +<21> [ ] [ ] [ ] +BINARY_MODULO [X] [X] [ ] +BINARY_ADD [X] [X] [ ] +BINARY_SUBTRACT [X] [X] [ ] +BINARY_SUBSCR [X] [X] [ ] +BINARY_FLOOR_DIVIDE [X] [X] [ ] +BINARY_TRUE_DIVIDE [X] [X] [ ] +INPLACE_FLOOR_DIVIDE [X] [X] [ ] +INPLACE_TRUE_DIVIDE [X] [X] [ ] +<30> [ ] [ ] [ ] +<31> [ ] [ ] [ ] +<32> [ ] [ ] [ ] +<33> [ ] [ ] [ ] +<34> [ ] [ ] [ ] +<35> [ ] [ ] [ ] +<36> [ ] [ ] [ ] +<37> [ ] [ ] [ ] +<38> [ ] [ ] [ ] +<39> [ ] [ ] [ ] +<40> [ ] [ ] [ ] +<41> [ ] [ ] [ ] +<42> [ ] [ ] [ ] +<43> [ ] [ ] [ ] +<44> [ ] [ ] [ ] +<45> [ ] [ ] [ ] +<46> [ ] [ ] [ ] +<47> [ ] [ ] [ ] +<48> [ ] [ ] [ ] +<49> [ ] [ ] [ ] +<50> [ ] [ ] [ ] +<51> [ ] [ ] [ ] +<52> [ ] [ ] [ ] +<53> [ ] [ ] [ ] +STORE_MAP [X] [X] [ ] +INPLACE_ADD [X] [X] [ ] +INPLACE_SUBTRACT [X] [X] [ ] +INPLACE_MULTIPLY [X] [X] [ ] +<58> [ ] [ ] [ ] +INPLACE_MODULO [X] [X] [ ] +STORE_SUBSCR [X] [X] [ ] +DELETE_SUBSCR [X] [X] [ ] +BINARY_LSHIFT [X] [X] [ ] +BINARY_RSHIFT [X] [X] [ ] +BINARY_AND [X] [X] [ ] +BINARY_XOR [X] [X] [ ] +BINARY_OR [X] [X] [ ] +INPLACE_POWER [X] [X] [ ] +GET_ITER [X] [X] [ ] +STORE_LOCALS [X] [X] [ ] +PRINT_EXPR [X] [X] [ ] +LOAD_BUILD_CLASS [X] [X] [ ] +<72> [ ] [ ] [ ] +<73> [ ] [ ] [ ] +<74> [ ] [ ] [ ] +INPLACE_LSHIFT [X] [X] [ ] +INPLACE_RSHIFT [X] [X] [ ] +INPLACE_AND [X] [X] [ ] +INPLACE_XOR [X] [X] [ ] +INPLACE_OR [X] [X] [ ] +BREAK_LOOP [X] [X] [ ] +WITH_CLEANUP [X] [X] [ ] +<82> [ ] [ ] [ ] +RETURN_VALUE [X] [X] [ ] +IMPORT_STAR [X] [X] [ ] +<85> [ ] [ ] [ ] +YIELD_VALUE [X] [X] [ ] +POP_BLOCK [X] [X] [ ] +END_FINALLY [X] [X] [ ] +POP_EXCEPT [X] [X] [ ] +STORE_NAME [X] [X] [ ] +DELETE_NAME [X] [X] [ ] +UNPACK_SEQUENCE [X] [X] [ ] +FOR_ITER [X] [X] [ ] +UNPACK_EX [X] [X] [ ] +STORE_ATTR [X] [X] [ ] +DELETE_ATTR [X] [X] [ ] +STORE_GLOBAL [X] [X] [ ] +DELETE_GLOBAL [X] [X] [ ] +DUP_TOPX [X] [X] [ ] +LOAD_CONST [X] [X] [ ] +LOAD_NAME [X] [X] [ ] +BUILD_TUPLE [X] [X] [ ] +BUILD_LIST [X] [X] [ ] +BUILD_SET [X] [X] [ ] +BUILD_MAP [X] [X] [ ] +LOAD_ATTR [X] [X] [ ] +COMPARE_OP [X] [X] [ ] +IMPORT_NAME [X] [X] [ ] +IMPORT_FROM [X] [X] [ ] +JUMP_FORWARD [X] [X] [ ] +JUMP_IF_FALSE [X] [X] [ ] +JUMP_IF_TRUE [X] [X] [ ] +JUMP_ABSOLUTE [X] [X] [ ] +POP_JUMP_IF_FALSE [ ] [X] [ ] +POP_JUMP_IF_TRUE [ ] [X] [ ] +LOAD_GLOBAL [X] [X] [ ] +<117> [ ] [ ] [ ] +<118> [ ] [ ] [ ] +CONTINUE_LOOP [X] [X] [ ] +SETUP_LOOP [X] [X] [ ] +SETUP_EXCEPT [X] [X] [ ] +SETUP_FINALLY [X] [X] [ ] +<123> [ ] [ ] [ ] +LOAD_FAST [X] [X] [ ] +STORE_FAST [X] [X] [ ] +DELETE_FAST [X] [X] [ ] +<127> [ ] [ ] [ ] +<128> [ ] [ ] [ ] +<129> [ ] [ ] [ ] +RAISE_VARARGS [X] [X] [ ] +CALL_FUNCTION [X] [X] [ ] +MAKE_FUNCTION [X] [X] [ ] +BUILD_SLICE [X] [X] [ ] +MAKE_CLOSURE [X] [X] [ ] +LOAD_CLOSURE [X] [X] [ ] +LOAD_DEREF [X] [X] [ ] +STORE_DEREF [X] [X] [ ] +<138> [ ] [ ] [ ] +<139> [ ] [ ] [ ] +CALL_FUNCTION_VAR [X] [X] [ ] +CALL_FUNCTION_KW [X] [X] [ ] +CALL_FUNCTION_VAR_KW [X] [X] [ ] +EXTENDED_ARG [X] [X] [ ] +<144> [ ] [ ] [ ] +LIST_APPEND [ ] [X] [ ] +SET_ADD [ ] [X] [ ] +MAP_ADD [ ] [X] [ ] +<148> [ ] [ ] [ ] +<149> [ ] [ ] [ ] +<150> [ ] [ ] [ ] +<151> [ ] [ ] [ ] +<152> [ ] [ ] [ ] +<153> [ ] [ ] [ ] +<154> [ ] [ ] [ ] +<155> [ ] [ ] [ ] +<156> [ ] [ ] [ ] +<157> [ ] [ ] [ ] +<158> [ ] [ ] [ ] +<159> [ ] [ ] [ ] + . + . + . + + + 1.0 1.1 1.2 1.3 1.4 1.5 1.6 +TYPE_NULL '0' '0' '0' '0' '0' '0' '0' +TYPE_NONE 'N' 'N' 'N' 'N' 'N' 'N' 'N' +TYPE_ELLIPSIS '.' '.' '.' +TYPE_INT 'i' 'i' 'i' 'i' 'i' 'i' 'i' +TYPE_INT64 'I' 'I' +TYPE_FLOAT 'f' 'f' 'f' 'f' 'f' 'f' 'f' +TYPE_COMPLEX 'x' 'x' 'x' +TYPE_LONG 'l' 'l' 'l' 'l' 'l' 'l' 'l' +TYPE_STRING 's' 's' 's' 's' 's' 's' 's' +TYPE_TUPLE '(' '(' '(' '(' '(' '(' '(' +TYPE_LIST '[' '[' '[' '[' '[' '[' '[' +TYPE_DICT '{' '{' '{' '{' '{' '{' '{' +TYPE_CODE 'C' 'C' 'C' 'c' 'c' 'c' 'c' +TYPE_UNICODE 'u' +TYPE_UNKNOWN '?' '?' '?' '?' '?' '?' '?' + + + 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 +TYPE_NULL '0' '0' '0' '0' '0' '0' '0' +TYPE_NONE 'N' 'N' 'N' 'N' 'N' 'N' 'N' +TYPE_FALSE 'F' 'F' 'F' 'F' +TYPE_TRUE 'T' 'T' 'T' 'T' +TYPE_STOPITER 'S' 'S' 'S' 'S' 'S' +TYPE_ELLIPSIS '.' '.' '.' '.' '.' '.' '.' +TYPE_INT 'i' 'i' 'i' 'i' 'i' 'i' 'i' +TYPE_INT64 'I' 'I' 'I' 'I' 'I' 'I' 'I' +TYPE_FLOAT 'f' 'f' 'f' 'f' 'f' 'f' 'f' +TYPE_BINARY_FLOAT 'g' 'g' +TYPE_COMPLEX 'x' 'x' 'x' 'x' 'x' 'x' 'x' +TYPE_BINARY_COMPLEX 'y' 'y' +TYPE_LONG 'l' 'l' 'l' 'l' 'l' 'l' 'l' +TYPE_STRING 's' 's' 's' 's' 's' 's' 's' +TYPE_INTERNED 't' 't' 't' +TYPE_STRINGREF 'R' 'R' 'R' +TYPE_TUPLE '(' '(' '(' '(' '(' '(' '(' +TYPE_LIST '[' '[' '[' '[' '[' '[' '[' +TYPE_DICT '{' '{' '{' '{' '{' '{' '{' +TYPE_CODE 'c' 'c' 'c' 'c' 'c' 'c' 'c' +TYPE_UNICODE 'u' 'u' 'u' 'u' 'u' 'u' 'u' +TYPE_UNKNOWN '?' '?' '?' '?' '?' '?' '?' +TYPE_SET '<' '<' +TYPE_FROZENSET '>' '>' + + + 3.0 3.1 3.2 +TYPE_NULL '0' '0' +TYPE_NONE 'N' 'N' +TYPE_FALSE 'F' 'F' +TYPE_TRUE 'T' 'T' +TYPE_STOPITER 'S' 'S' +TYPE_ELLIPSIS '.' '.' +TYPE_INT 'i' 'i' +TYPE_INT64 'I' 'I' +TYPE_FLOAT 'f' 'f' +TYPE_BINARY_FLOAT 'g' 'g' +TYPE_COMPLEX 'x' 'x' +TYPE_BINARY_COMPLEX 'y' 'y' +TYPE_LONG 'l' 'l' +TYPE_STRING 's' 's' +TYPE_TUPLE '(' '(' +TYPE_LIST '[' '[' +TYPE_DICT '{' '{' +TYPE_CODE 'c' 'c' +TYPE_UNICODE 'u' 'u' +TYPE_UNKNOWN '?' '?' +TYPE_SET '<' '<' +TYPE_FROZENSET '>' '>' + + +[TYPE_CODE] 1.0 1.3 1.5 2.1 2.3 3.0 +argcount short short short long long +kwonlyargc long +nlocals short short short long long +stacksize short short long long +flags short short short long long +code Obj Obj Obj Obj Obj Obj +consts Obj Obj Obj Obj Obj Obj +names Obj Obj Obj Obj Obj Obj +varnames Obj Obj Obj Obj Obj +freevars Obj Obj Obj +cellvars Obj Obj Obj +filename Obj Obj Obj Obj Obj Obj +name Obj Obj Obj Obj Obj Obj +firstline short short long long +lntable Obj Obj Obj Obj diff --git a/bin/.keep b/bin/.keep new file mode 100644 index 0000000..e69de29 diff --git a/bytecode.cpp b/bytecode.cpp new file mode 100644 index 0000000..45b784e --- /dev/null +++ b/bytecode.cpp @@ -0,0 +1,182 @@ +#include "bytecode.h" +#include "data.h" + +const char* Py1k::OpcodeNames[256] = { + "STOP_CODE", "POP_TOP", "ROT_TWO", "ROT_THREE", "DUP_TOP", + "<5>", "<6>", "<7>", "<8>", "<9>", + "UNARY_POSITIVE", "UNARY_NEGATIVE", "UNARY_NOT", "UNARY_CONVERT", + "UNARY_CALL", "UNARY_INVERT", "<16>", "<17>", "<18>", + "BINARY_POWER", "BINARY_MULTIPLY", "BINARY_DIVIDE", "BINARY_MODULO", + "BINARY_ADD", "BINARY_SUBTRACT", "BINARY_SUBSCR", "BINARY_CALL", + "<27>", "<28>", "<29>", + "SLICE+0", "SLICE+1", "SLICE+2", "SLICE+3", + "<34>", "<35>", "<36>", "<37>", "<38>", "<39>", + "STORE_SLICE+0", "STORE_SLICE+1", "STORE_SLICE+2", "STORE_SLICE+3", + "<44>", "<45>", "<46>", "<47>", "<48>", "<49>", + "DELETE_SLICE+0", "DELETE_SLICE+1", "DELETE_SLICE+2", "DELETE_SLICE+3", + "<54>", "<55>", "<56>", "<57>", "<58>", "<59>", + "STORE_SUBSCR", "DELETE_SUBSCR", "BINARY_LSHIFT", "BINARY_RSHIFT", + "BINARY_AND", "BINARY_XOR", "BINARY_OR", "<67>", "<68>", "<69>", + "PRINT_EXPR", "PRINT_ITEM", "PRINT_NEWLINE", + "<73>", "<74>", "<75>", "<76>", "<77>", "<78>", "<79>", + "BREAK_LOOP", "RAISE_EXCEPTION", "LOAD_LOCALS", "RETURN_VALUE", + "LOAD_GLOBALS", "EXEC_STMT", "BUILD_FUNCTION", "POP_BLOCK", "END_FINALLY", + "BUILD_CLASS", + "STORE_NAME", "DELETE_NAME", "UNPACK_TUPLE", "UNPACK_LIST", "UNPACK_ARG", + "STORE_ATTR", "DELETE_ATTR", "STORE_GLOBAL", "DELETE_GLOBAL", "UNPACK_VARARG", + "LOAD_CONST", "LOAD_NAME", "BUILD_TUPLE", "BUILD_LIST", "BUILD_MAP", + "LOAD_ATTR", "COMPARE_OP", "IMPORT_NAME", "IMPORT_FROM", "<109>", + "JUMP_FORWARD", "JUMP_IF_FALSE", "JUMP_IF_TRUE", "JUMP_ABSOLUTE", + "FOR_LOOP", "LOAD_LOCAL", "LOAD_GLOBAL", "SET_FUNC_ARGS", "<118>", "<119>", + "SETUP_LOOP", "SETUP_EXCEPT", "SETUP_FINALLY", "RESERVE_FAST", + "LOAD_FAST", "STORE_FAST", "DELETE_FAST", "SET_LINENO", "<128>", "<129>", + "RAISE_VARARGS", "CALL_FUNCTION", "MAKE_FUNCTION", "BUILD_SLICE", + "<134>", "<135>", "<136>", "<137>", "<138>", "<139>", + "CALL_FUNCTION_VAR", "CALL_FUNCTION_KW", "CALL_FUNCTION_VAR_KW", "<143>", + "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", + "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", + "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", + "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", + "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", + "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", + "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", + "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", + "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", + "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", + "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", + "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", + "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", + "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>", +}; + +const char* Py2k::OpcodeNames[256] = { + "STOP_CODE", "POP_TOP", "ROT_TWO", "ROT_THREE", "DUP_TOP", "ROT_FOUR", + "<6>", "<7>", "<8>", "NOP", + "UNARY_POSITIVE", "UNARY_NEGATIVE", "UNARY_NOT", "UNARY_CONVERT", + "<14>", "UNARY_INVERT", "<16>", "<17>", "LIST_APPEND", + "BINARY_POWER", "BINARY_MULTIPLY", "BINARY_DIVIDE", "BINARY_MODULO", + "BINARY_ADD", "BINARY_SUBTRACT", "BINARY_SUBSCR", "BINARY_FLOOR_DIVIDE", + "BINARY_TRUE_DIVIDE", "INPLACE_FLOOR_DIVIDE", "INPLACE_TRUE_DIVIDE", + "SLICE+0", "SLICE+1", "SLICE+2", "SLICE+3", + "<34>", "<35>", "<36>", "<37>", "<38>", "<39>", + "STORE_SLICE+0", "STORE_SLICE+1", "STORE_SLICE+2", "STORE_SLICE+3", + "<44>", "<45>", "<46>", "<47>", "<48>", "<49>", + "DELETE_SLICE+0", "DELETE_SLICE+1", "DELETE_SLICE+2", "DELETE_SLICE+3", + "STORE_MAP", "INPLACE_ADD", "INPLACE_SUBTRACT", "INPLACE_MULTIPLY", + "INPLACE_DIVIDE", "INPLACE_MODULO", + "STORE_SUBSCR", "DELETE_SUBSCR", "BINARY_LSHIFT", "BINARY_RSHIFT", + "BINARY_AND", "BINARY_XOR", "BINARY_OR", "INPLACE_POWER", "GET_ITER", "<69>", + "PRINT_EXPR", "PRINT_ITEM", "PRINT_NEWLINE", "PRINT_ITEM_TO", + "PRINT_NEWLINE_TO", "INPLACE_LSHIFT", "INPLACE_RSHIFT", "INPLACE_AND", + "INPLACE_XOR", "INPLACE_OR", + "BREAK_LOOP", "WITH_CLEANUP", "LOAD_LOCALS", "RETURN_VALUE", + "IMPORT_STAR", "EXEC_STMT", "YIELD_VALUE", "POP_BLOCK", "END_FINALLY", + "BUILD_CLASS", + "STORE_NAME", "DELETE_NAME", "UNPACK_SEQUENCE", "FOR_ITER", "<94>", + "STORE_ATTR", "DELETE_ATTR", "STORE_GLOBAL", "DELETE_GLOBAL", "DUP_TOPX", + "LOAD_CONST", "LOAD_NAME", "BUILD_TUPLE", "BUILD_LIST", "BUILD_MAP", + "LOAD_ATTR", "COMPARE_OP", "IMPORT_NAME", "IMPORT_FROM", "<109>", + "JUMP_FORWARD", "JUMP_IF_FALSE", "JUMP_IF_TRUE", "JUMP_ABSOLUTE", + "FOR_LOOP", "<115>", "LOAD_GLOBAL", "<117>", "<118>", "CONTINUE_LOOP", + "SETUP_LOOP", "SETUP_EXCEPT", "SETUP_FINALLY", "<123>", + "LOAD_FAST", "STORE_FAST", "DELETE_FAST", "SET_LINENO", "<128>", "<129>", + "RAISE_VARARGS", "CALL_FUNCTION", "MAKE_FUNCTION", "BUILD_SLICE", + "MAKE_CLOSURE", "LOAD_CLOSURE", "LOAD_DEREF", "STORE_DEREF", "<138>", "<139>", + "CALL_FUNCTION_VAR", "CALL_FUNCTION_KW", "CALL_FUNCTION_VAR_KW", "EXTENDED_ARG", + "<144>", "<145>", "<146>", "<147>", "<148>", "<149>", "<150>", "<151>", + "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", + "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", + "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", + "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", + "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", + "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", + "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", + "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", + "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", + "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", + "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", + "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", + "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>", +}; + +const char* Py3k::OpcodeNames[256] = { + "STOP_CODE", "POP_TOP", "ROT_TWO", "ROT_THREE", "DUP_TOP", "ROT_FOUR", + "<6>", "<7>", "<8>", "NOP", + "UNARY_POSITIVE", "UNARY_NEGATIVE", "UNARY_NOT", "<13>", "<14>", + "UNARY_INVERT", "<16>", "SET_ADD", "LIST_APPEND", + "BINARY_POWER", "BINARY_MULTIPLY", "<21>", "BINARY_MODULO", + "BINARY_ADD", "BINARY_SUBTRACT", "BINARY_SUBSCR", "BINARY_FLOOR_DIVIDE", + "BINARY_TRUE_DIVIDE", "INPLACE_FLOOR_DIVIDE", "INPLACE_TRUE_DIVIDE", + "<30>", "<31>", "<32>", "<33>", "<34>", "<35>", "<36>", "<37>", "<38>", "<39>", + "<40>", "<41>", "<42>", "<43>", "<44>", "<45>", "<46>", "<47>", "<48>", "<49>", + "<50>", "<51>", "<52>", "<53>", + "STORE_MAP", "INPLACE_ADD", "INPLACE_SUBTRACT", "INPLACE_MULTIPLY", + "<58>", "INPLACE_MODULO", + "STORE_SUBSCR", "DELETE_SUBSCR", "BINARY_LSHIFT", "BINARY_RSHIFT", + "BINARY_AND", "BINARY_XOR", "BINARY_OR", "INPLACE_POWER", "GET_ITER", + "STORE_LOCALS", + "PRINT_EXPR", "LOAD_BUILD_CLASS", "<72>", "<73>", "<74>", + "INPLACE_LSHIFT", "INPLACE_RSHIFT", "INPLACE_AND", "INPLACE_XOR", + "INPLACE_OR", + "BREAK_LOOP", "WITH_CLEANUP", "<82>", "RETURN_VALUE", + "IMPORT_STAR", "<85>", "YIELD_VALUE", "POP_BLOCK", "END_FINALLY", + "POP_EXCEPT", + "STORE_NAME", "DELETE_NAME", "UNPACK_SEQUENCE", "FOR_ITER", "UNPACK_EX", + "STORE_ATTR", "DELETE_ATTR", "STORE_GLOBAL", "DELETE_GLOBAL", "DUP_TOPX", + "LOAD_CONST", "LOAD_NAME", "BUILD_TUPLE", "BUILD_LIST", "BUILD_SET", + "BUILD_MAP", "LOAD_ATTR", "COMPARE_OP", "IMPORT_NAME", "IMPORT_FROM", + "JUMP_FORWARD", "JUMP_IF_FALSE", "JUMP_IF_TRUE", "JUMP_ABSOLUTE", + "POP_JUMP_IF_FALSE", "POP_JUMP_IF_TRUE", "LOAD_GLOBAL", "<117>", "<118>", + "CONTINUE_LOOP", "SETUP_LOOP", "SETUP_EXCEPT", "SETUP_FINALLY", "<123>", + "LOAD_FAST", "STORE_FAST", "DELETE_FAST", "<127>", "<128>", "<129>", + "RAISE_VARARGS", "CALL_FUNCTION", "MAKE_FUNCTION", "BUILD_SLICE", + "MAKE_CLOSURE", "LOAD_CLOSURE", "LOAD_DEREF", "STORE_DEREF", "<138>", "<139>", + "CALL_FUNCTION_VAR", "CALL_FUNCTION_KW", "CALL_FUNCTION_VAR_KW", + "EXTENDED_ARG", "<144>", "LIST_APPEND", "SET_ADD", "MAP_ADD", + "<148>", "<149>", "<150>", "<151>", + "<152>", "<153>", "<154>", "<155>", "<156>", "<157>", "<158>", "<159>", + "<160>", "<161>", "<162>", "<163>", "<164>", "<165>", "<166>", "<167>", + "<168>", "<169>", "<170>", "<171>", "<172>", "<173>", "<174>", "<175>", + "<176>", "<177>", "<178>", "<179>", "<180>", "<181>", "<182>", "<183>", + "<184>", "<185>", "<186>", "<187>", "<188>", "<189>", "<190>", "<191>", + "<192>", "<193>", "<194>", "<195>", "<196>", "<197>", "<198>", "<199>", + "<200>", "<201>", "<202>", "<203>", "<204>", "<205>", "<206>", "<207>", + "<208>", "<209>", "<210>", "<211>", "<212>", "<213>", "<214>", "<215>", + "<216>", "<217>", "<218>", "<219>", "<220>", "<221>", "<222>", "<223>", + "<224>", "<225>", "<226>", "<227>", "<228>", "<229>", "<230>", "<231>", + "<232>", "<233>", "<234>", "<235>", "<236>", "<237>", "<238>", "<239>", + "<240>", "<241>", "<242>", "<243>", "<244>", "<245>", "<246>", "<247>", + "<248>", "<249>", "<250>", "<251>", "<252>", "<253>", "<254>", "<255>", +}; + +void bc_disasm(PycRef code, PycModule* mod, int indent) +{ + PycBuffer source(code->code()->value(), code->code()->length()); + + int operand = 0; + while (!source.atEof()) { + int opcode = source.getByte(); + bool extArg = false; + if ((mod->majorVer() == 2 && opcode == Py2k::EXTENDED_ARG) || + (mod->majorVer() == 3 && opcode == Py3k::EXTENDED_ARG)) { + extArg = true; + opcode = source.getByte(); + } + if (opcode >= HAVE_ARG) + operand = extArg ? source.get32() : source.get16(); + + for (int i=0; imajorVer() == 1) { + printf("%-24s", Py1k::OpcodeNames[opcode]); + } else if (mod->majorVer() == 2) { + printf("%-24s", Py2k::OpcodeNames[opcode]); + } else if (mod->majorVer() == 3) { + printf("%-24s", Py3k::OpcodeNames[opcode]); + } + if (opcode >= HAVE_ARG) + printf("%d\n", operand); + else + printf("\n"); + } +} diff --git a/bytecode.h b/bytecode.h new file mode 100644 index 0000000..df0477d --- /dev/null +++ b/bytecode.h @@ -0,0 +1,118 @@ +#include "code.h" +#include "module.h" + +// Opcodes >= this value have an argument after the opcode +#define HAVE_ARG 90 + +namespace Py1k { + +enum Opcodes { + STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, + UNARY_POSITIVE = 10, UNARY_NEGATIVE, UNARY_NOT, UNARY_CONVERT, + UNARY_CALL, UNARY_INVERT, + BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_DIVIDE, BINARY_MODULO, + BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_CALL, + SLICE_0 = 30, SLICE_1, SLICE_2, SLICE_3, + STORE_SLICE_0 = 40, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3, + DELETE_SLICE_0 = 50, DELETE_SLICE_1, DELETE_SLICE_2, DELETE_SLICE_3, + STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT, + BINARY_AND, BINARY_XOR, BINARY_OR, + PRINT_EXPR = 70, PRINT_ITEM, PRINT_NEWLINE, + BREAK_LOOP = 80, RAISE_EXCEPTION, LOAD_LOCALS, RETURN_VALUE, + LOAD_GLOBALS, EXEC_STMT, BUILD_FUNCTION, POP_BLOCK, END_FINALLY, + BUILD_CLASS, + STORE_NAME = 90, DELETE_NAME, UNPACK_TUPLE, UNPACK_LIST, UNPACK_ARG, + STORE_ATTR, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL, UNPACK_VARARG, + LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_MAP, + LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM, + JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE, + FOR_LOOP, LOAD_LOCAL, LOAD_GLOBAL, SET_FUNC_ARGS, + SETUP_LOOP = 120, SETUP_EXCEPT, SETUP_FINALLY, RESERVE_FAST, + LOAD_FAST, STORE_FAST, DELETE_FAST, SET_LINENO, + RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE, + CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW, +}; + +extern const char* OpcodeNames[256]; + +} + +namespace Py2k { + +enum Opcodes { + STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, ROT_FOUR, + NOP = 9, UNARY_POSITIVE, UNARY_NEGATIVE, UNARY_NOT, UNARY_CONVERT, + UNARY_INVERT = 15, LIST_APPEND = 18, + BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_DIVIDE, BINARY_MODULO, + BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_FLOOR_DIVIDE, + BINARY_TRUE_DIVIDE, INPLACE_FLOOR_DIVIDE, INPLACE_TRUE_DIVIDE, + SLICE_0 = 30, SLICE_1, SLICE_2, SLICE_3, + STORE_SLICE_0 = 40, STORE_SLICE_1, STORE_SLICE_2, STORE_SLICE_3, + DELETE_SLICE_0 = 50, DELETE_SLICE_1, DELETE_SLICE_2, DELETE_SLICE_3, + STORE_MAP = 54, INPLACE_ADD, INPLACE_SUBTRACT, INPLACE_MULTIPLY, + INPLACE_DIVIDE, INPLACE_MODULO, + STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT, + BINARY_AND, BINARY_XOR, BINARY_OR, INPLACE_POWER, GET_ITER, + PRINT_EXPR = 70, PRINT_ITEM, PRINT_NEWLINE, PRINT_ITEM_TO, + PRINT_NEWLINE_TO, INPLACE_LSHIFT, INPLACE_RSHIFT, INPLACE_AND, + INPLACE_XOR, INPLACE_OR, + BREAK_LOOP = 80, WITH_CLEANUP, LOAD_LOCALS, RETURN_VALUE, + IMPORT_STAR, EXEC_STMT, YIELD_VALUE, POP_BLOCK, END_FINALLY, + BUILD_CLASS, + STORE_NAME = 90, DELETE_NAME, UNPACK_SEQUENCE, FOR_ITER, + STORE_ATTR = 95, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL, + DUP_TOPX, LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_MAP, + LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM, + JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE, + FOR_LOOP, LOAD_GLOBAL = 116, + CONTINUE_LOOP = 119, SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, + LOAD_FAST = 124, STORE_FAST, DELETE_FAST, SET_LINENO, + RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE, + MAKE_CLOSURE, LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF, + CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW, + EXTENDED_ARG, +}; + +extern const char* OpcodeNames[256]; + +} + +namespace Py3k { + +enum Opcodes { + STOP_CODE = 0, POP_TOP, ROT_TWO, ROT_THREE, DUP_TOP, ROT_FOUR, + NOP = 9, UNARY_POSITIVE, UNARY_NEGATIVE, UNARY_NOT, + UNARY_INVERT = 15, SET_ADD2 = 17, LIST_APPEND2, + BINARY_POWER = 19, BINARY_MULTIPLY, BINARY_MODULO = 22, + BINARY_ADD, BINARY_SUBTRACT, BINARY_SUBSCR, BINARY_FLOOR_DIVIDE, + BINARY_TRUE_DIVIDE, INPLACE_FLOOR_DIVIDE, INPLACE_TRUE_DIVIDE, + STORE_MAP = 54, INPLACE_ADD, INPLACE_SUBTRACT, INPLACE_MULTIPLY, + INPLACE_MODULO = 59, + STORE_SUBSCR = 60, DELETE_SUBSCR, BINARY_LSHIFT, BINARY_RSHIFT, + BINARY_AND, BINARY_XOR, BINARY_OR, INPLACE_POWER, GET_ITER, + STORE_LOCALS, + PRINT_EXPR = 70, LOAD_BUILD_CLASS, + INPLACE_LSHIFT = 75, INPLACE_RSHIFT, INPLACE_AND, INPLACE_XOR, + INPLACE_OR, + BREAK_LOOP = 80, WITH_CLEANUP, RETURN_VALUE = 83, + IMPORT_STAR, YIELD_VALUE = 86, POP_BLOCK, END_FINALLY, POP_EXCEPT, + STORE_NAME = 90, DELETE_NAME, UNPACK_SEQUENCE, FOR_ITER, UNPACK_EX, + STORE_ATTR, DELETE_ATTR, STORE_GLOBAL, DELETE_GLOBAL, + DUP_TOPX, LOAD_CONST, LOAD_NAME, BUILD_TUPLE, BUILD_LIST, BUILD_SET, + BUILD_MAP, LOAD_ATTR, COMPARE_OP, IMPORT_NAME, IMPORT_FROM, + JUMP_FORWARD = 110, JUMP_IF_FALSE, JUMP_IF_TRUE, JUMP_ABSOLUTE, + POP_JUMP_IF_FALSE, POP_JUMP_IF_TRUE, LOAD_GLOBAL, + CONTINUE_LOOP = 119, SETUP_LOOP, SETUP_EXCEPT, SETUP_FINALLY, + LOAD_FAST = 124, STORE_FAST, DELETE_FAST, + RAISE_VARARGS = 130, CALL_FUNCTION, MAKE_FUNCTION, BUILD_SLICE, + MAKE_CLOSURE, LOAD_CLOSURE, LOAD_DEREF, STORE_DEREF, + CALL_FUNCTION_VAR = 140, CALL_FUNCTION_KW, CALL_FUNCTION_VAR_KW, + EXTENDED_ARG, + LIST_APPEND = 145, SET_ADD, MAP_ADD, +}; + +extern const char* OpcodeNames[256]; + +} + +void bc_disasm(PycRef code, PycModule* mod, int indent); diff --git a/code.cpp b/code.cpp new file mode 100644 index 0000000..1c7c547 --- /dev/null +++ b/code.cpp @@ -0,0 +1,77 @@ +#include "code.h" +#include "data.h" +#include "module.h" + +void PycCode::load(PycData* stream, PycModule* mod) +{ + if ((mod->majorVer() == 1 && mod->minorVer() >= 3) || + (mod->majorVer() == 2 && mod->minorVer() < 3)) { + m_argCount = stream->get16(); + } else if ((mod->majorVer() == 2 && mod->minorVer() >= 3) || + (mod->majorVer() >= 3)) { + m_argCount = stream->get32(); + } + + if (mod->majorVer() >= 3) { + m_kwOnlyArgCount = stream->get32(); + } + + if ((mod->majorVer() == 1 && mod->minorVer() >= 3) || + (mod->majorVer() == 2 && mod->minorVer() < 3)) { + m_numLocals = stream->get16(); + } else if ((mod->majorVer() == 2 && mod->minorVer() >= 3) || + (mod->majorVer() >= 3)) { + m_numLocals = stream->get32(); + } + + if ((mod->majorVer() == 1 && mod->minorVer() >= 5) || + (mod->majorVer() == 2 && mod->minorVer() < 3)) { + m_stackSize = stream->get16(); + } else if ((mod->majorVer() == 2 && mod->minorVer() >= 3) || + (mod->majorVer() >= 3)) { + m_stackSize = stream->get32(); + } + + if ((mod->majorVer() == 1 && mod->minorVer() >= 3) || + (mod->majorVer() == 2 && mod->minorVer() < 3)) { + m_flags = stream->get16(); + } else if ((mod->majorVer() == 2 && mod->minorVer() >= 3) || + (mod->majorVer() >= 3)) { + m_flags = stream->get32(); + } + + m_code = LoadObject(stream, mod).cast(); + m_consts = LoadObject(stream, mod).cast(); + m_names = LoadObject(stream, mod).cast(); + + if ((mod->majorVer() == 1 && mod->minorVer() >= 3) || + (mod->majorVer() >= 2)) { + m_varNames = LoadObject(stream, mod).cast(); + } + + if ((mod->majorVer() == 2 && mod->minorVer() >= 1) || + (mod->majorVer() >= 3)) { + m_freeVars = LoadObject(stream, mod).cast(); + } + + if ((mod->majorVer() == 2 && mod->minorVer() >= 1) || + (mod->majorVer() >= 3)) { + m_cellVars = LoadObject(stream, mod).cast(); + } + + m_fileName = LoadObject(stream, mod).cast(); + m_name = LoadObject(stream, mod).cast(); + + if ((mod->majorVer() == 1 && mod->minorVer() >= 5) || + (mod->majorVer() == 2 && mod->minorVer() < 3)) { + m_firstLine = stream->get16(); + } else if ((mod->majorVer() == 2 && mod->minorVer() >= 3) || + (mod->majorVer() >= 3)) { + m_firstLine = stream->get32(); + } + + if ((mod->majorVer() == 1 && mod->minorVer() >= 5) || + (mod->majorVer() >= 2)) { + m_lnTable = LoadObject(stream, mod).cast(); + } +} diff --git a/code.h b/code.h new file mode 100644 index 0000000..ceb80f7 --- /dev/null +++ b/code.h @@ -0,0 +1,48 @@ +#ifndef _PYC_CODE_H +#define _PYC_CODE_H + +#include "sequence.h" +#include "string.h" + +class PycCode : public PycObject { +public: + PycCode(int type = TYPE_CODE) + : PycObject(type), m_argCount(0), m_kwOnlyArgCount(0), m_numLocals(0), + m_stackSize(0), m_flags(0), m_firstLine(0) { } + + bool isType(int type) const + { return (type == TYPE_CODE) || (type == TYPE_CODE2) || PycObject::isType(type); } + + void load(class PycData* stream, class PycModule* mod); + + int argCount() const { return m_argCount; } + int kwOnlyArgCount() const { return m_kwOnlyArgCount; } + int numLocals() const { return m_numLocals; } + int stackSize() const { return m_stackSize; } + int flags() const { return m_flags; } + PycRef code() const { return m_code; } + PycRef consts() const { return m_consts; } + PycRef names() const { return m_names; } + PycRef varNames() const { return m_varNames; } + PycRef freeVars() const { return m_freeVars; } + PycRef cellVars() const { return m_cellVars; } + PycRef fileName() const { return m_fileName; } + PycRef name() const { return m_name; } + int firstLine() const { return m_firstLine; } + PycRef lnTable() const { return m_lnTable; } + +private: + int m_argCount, m_kwOnlyArgCount, m_numLocals, m_stackSize, m_flags; + PycRef m_code; + PycRef m_consts; + PycRef m_names; + PycRef m_varNames; + PycRef m_freeVars; + PycRef m_cellVars; + PycRef m_fileName; + PycRef m_name; + int m_firstLine; + PycRef m_lnTable; +}; + +#endif diff --git a/data.cpp b/data.cpp new file mode 100644 index 0000000..557be9e --- /dev/null +++ b/data.cpp @@ -0,0 +1,70 @@ +#include "data.h" +#include + +/* PycData */ +int PycData::get16() +{ + /* Ensure endianness */ + int val = ( ((getByte() & 0xFF) ) + | ((getByte() & 0xFF) << 8) + ); + + /* Extend sign */ + return (val | -(val & 0x8000)); +} + +int PycData::get32() +{ + /* Ensure endianness */ + return (int)( ((getByte() & 0xFF) ) + | ((getByte() & 0xFF) << 8) + | ((getByte() & 0xFF) << 16) + | ((getByte() & 0xFF) << 24) + ); +} + + +/* PycFile */ +PycFile::PycFile(const char* filename) +{ + m_stream = fopen(filename, "rb"); +} + +bool PycFile::atEof() const +{ + int ch = fgetc(m_stream); + ungetc(ch, m_stream); + return (ch == EOF); +} + +int PycFile::getByte() +{ + int ch = fgetc(m_stream); + if (ch == EOF) + ungetc(ch, m_stream); + return ch; +} + +int PycFile::getBuffer(int bytes, void* buffer) +{ + return (int)fread(buffer, 1, bytes, m_stream); +} + + +/* PycBuffer */ +int PycBuffer::getByte() +{ + if (atEof()) + return EOF; + int ch = (int)(*(m_buffer + m_pos)); + ++m_pos; + return ch & 0xFF; // Make sure it's just a byte! +} + +int PycBuffer::getBuffer(int bytes, void* buffer) +{ + if (m_pos + bytes > m_size) + bytes = m_size - m_pos; + memcpy(buffer, (m_buffer + m_pos), bytes); + return bytes; +} diff --git a/data.h b/data.h new file mode 100644 index 0000000..225d724 --- /dev/null +++ b/data.h @@ -0,0 +1,52 @@ +#ifndef _PYC_FILE_H +#define _PYC_FILE_H + +#include + +class PycData { +public: + PycData() { } + virtual ~PycData() { } + + virtual bool isOpen() const = 0; + virtual bool atEof() const = 0; + + virtual int getByte() = 0; + virtual int getBuffer(int bytes, void* buffer) = 0; + int get16(); + int get32(); +}; + +class PycFile : public PycData { +public: + PycFile(const char* filename); + ~PycFile() { if (m_stream) fclose(m_stream); } + + bool isOpen() const { return (m_stream != 0); } + bool atEof() const; + + int getByte(); + int getBuffer(int bytes, void* buffer); + +private: + FILE* m_stream; +}; + +class PycBuffer : public PycData { +public: + PycBuffer(const void* buffer, int size) + : m_buffer((const unsigned char*)buffer), m_size(size), m_pos(0) { } + ~PycBuffer() { } + + bool isOpen() const { return (m_buffer != 0); } + bool atEof() const { return (m_pos == m_size); } + + int getByte(); + int getBuffer(int bytes, void* buffer); + +private: + const unsigned char* m_buffer; + int m_size, m_pos; +}; + +#endif diff --git a/module.cpp b/module.cpp new file mode 100644 index 0000000..a6536c2 --- /dev/null +++ b/module.cpp @@ -0,0 +1,134 @@ +#include "module.h" +#include "data.h" + +PycModule::PycModule() + : m_maj(-1), m_min(-1), m_unicode(false) +{ } + +void PycModule::setVersion(unsigned int magic) +{ + // Default for versions that don't support unicode selection + m_unicode = false; + + switch (magic) { + case MAGIC_1_0: + m_maj = 1; + m_min = 0; + break; + case MAGIC_1_1: + m_maj = 1; + m_min = 1; + break; + case MAGIC_1_3: + m_maj = 1; + m_min = 3; + break; + case MAGIC_1_4: + m_maj = 1; + m_min = 4; + break; + case MAGIC_1_5: + m_maj = 1; + m_min = 5; + break; + + /* Starting with 1.6, Python adds +1 for unicode mode (-U) */ + case MAGIC_1_6+1: + m_unicode = true; + /* Fall through */ + case MAGIC_1_6: + m_maj = 1; + m_min = 6; + break; + case MAGIC_2_0+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_0: + m_maj = 2; + m_min = 0; + break; + case MAGIC_2_1+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_1: + m_maj = 2; + m_min = 1; + break; + case MAGIC_2_2+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_2: + m_maj = 2; + m_min = 2; + break; + case MAGIC_2_3+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_3: + m_maj = 2; + m_min = 3; + break; + case MAGIC_2_4+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_4: + m_maj = 2; + m_min = 4; + break; + case MAGIC_2_5+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_5: + m_maj = 2; + m_min = 5; + break; + case MAGIC_2_6+1: + m_unicode = true; + /* Fall through */ + case MAGIC_2_6: + m_maj = 2; + m_min = 6; + break; + + /* 3.0 and above are always unicode */ + case MAGIC_3_0+1: + m_maj = 3; + m_min = 0; + m_unicode = true; + break; + case MAGIC_3_1+1: + m_maj = 3; + m_min = 1; + m_unicode = true; + break; + + /* Bad Magic detected */ + default: + m_maj = -1; + m_min = -1; + } +} + +void PycModule::loadFromFile(const char* filename) +{ + PycFile in(filename); + if (!in.isOpen()) { + fprintf(stderr, "Error opening file %s\n", filename); + return; + } + setVersion(in.get32()); + if (!isValid()) { + fprintf(stderr, "Bad MAGIC!\n"); + return; + } + in.get32(); // Timestamp -- who cares? + + m_code = LoadObject(&in, this).cast(); +} + +PycRef PycModule::getIntern(int ref) +{ + std::list >::iterator it = m_interns.begin(); + for (int i=0; i + +enum PycMagic { + MAGIC_1_0 = 0x00999902, + MAGIC_1_1 = 0x00999903, /* Also covers 1.2 */ + MAGIC_1_3 = 0x0A0D2E89, + MAGIC_1_4 = 0x0A0D1704, + MAGIC_1_5 = 0x0A0D4E99, + MAGIC_1_6 = 0x0A0DC4FC, + + MAGIC_2_0 = 0x0A0DC687, + MAGIC_2_1 = 0x0A0DEB2A, + MAGIC_2_2 = 0x0A0DED2D, + MAGIC_2_3 = 0x0A0DF23B, + MAGIC_2_4 = 0x0A0DF26D, + MAGIC_2_5 = 0x0A0DF2B3, + MAGIC_2_6 = 0x0A0DF2D1, + + MAGIC_3_0 = 0x0A0D0C3A, + MAGIC_3_1 = 0x0A0D0C4E, +}; + +class PycModule { +public: + PycModule(); + + void loadFromFile(const char* filename); + bool isValid() const { return (m_maj >= 0) && (m_min >= 0); } + + unsigned int majorVer() const { return m_maj; } + unsigned int minorVer() const { return m_min; } + bool isUnicode() const { return m_unicode; } + + PycRef code() const { return m_code; } + + void intern(PycRef str) { m_interns.push_back(str); } + PycRef getIntern(int ref); + +private: + void setVersion(unsigned int magic); + +private: + short m_maj, m_min; + bool m_unicode; + + PycRef m_code; + std::list > m_interns; +}; + +#endif diff --git a/numeric.cpp b/numeric.cpp new file mode 100644 index 0000000..d1ec6bf --- /dev/null +++ b/numeric.cpp @@ -0,0 +1,37 @@ +#include "numeric.h" +#include "data.h" +#include "module.h" + +PycObjRef Pyc_False = new PycObject(PycObject::TYPE_FALSE); +PycObjRef Pyc_True = new PycObject(PycObject::TYPE_TRUE); + +/* PycInt */ +void PycInt::load(PycData* stream, PycModule*) +{ + m_value = stream->get32(); +} + + +/* PycLong */ +void PycLong::load(PycData* stream, PycModule*) +{ + m_size = stream->get32(); + int actualSize = m_size & 0x7FFFFFFF; + for (int i=0; iget16()); +} + + +/* PycFloat */ +void PycFloat::load(PycData* stream, PycModule*) +{ + int len = stream->getByte(); + if (m_value) delete[] m_value; + if (len > 0) { + m_value = new char[len+1]; + stream->getBuffer(len, m_value); + m_value[len] = 0; + } else { + m_value = 0; + } +} diff --git a/numeric.h b/numeric.h new file mode 100644 index 0000000..7d000f6 --- /dev/null +++ b/numeric.h @@ -0,0 +1,63 @@ +#ifndef _PYC_NUMERIC_H +#define _PYC_NUMERIC_H + +#include "object.h" +#include + +class PycInt : public PycObject { +public: + PycInt(int value = 0, int type = TYPE_INT) + : PycObject(type), m_value(value) { } + + bool isType(int type) const + { return (type == TYPE_INT) || PycObject::isType(type); } + + void load(class PycData* stream, class PycModule* mod); + + int value() const { return m_value; } + +private: + int m_value; +}; + +class PycLong : public PycObject { +public: + PycLong(int type = TYPE_LONG) + : PycObject(type), m_size(0) { } + + bool isType(int type) const + { return (type == TYPE_LONG) || PycObject::isType(type); } + + void load(class PycData* stream, class PycModule* mod); + + int size() const { return m_size; } + std::list value() const { return m_value; } + +private: + int m_size; + std::list m_value; +}; + +class PycFloat : public PycObject { +public: + PycFloat(int type = TYPE_FLOAT) + : PycObject(type), m_value(0) { } + + ~PycFloat() { if (m_value) delete[] m_value; } + + bool isType(int type) const + { return (type == TYPE_FLOAT) || PycObject::isType(type); } + + void load(class PycData* stream, class PycModule* mod); + + const char* value() const { return m_value; } + +private: + char* m_value; // Floats are stored as strings +}; + +/* Static Singleton objects */ +extern PycObjRef Pyc_False; +extern PycObjRef Pyc_True; + +#endif diff --git a/object.cpp b/object.cpp new file mode 100644 index 0000000..0210063 --- /dev/null +++ b/object.cpp @@ -0,0 +1,76 @@ +#include "object.h" + +#include +#include "data.h" +#include "module.h" +#include "numeric.h" +#include "code.h" + +PycObjRef Pyc_NULL = (PycObject*)0; +PycObjRef Pyc_None = new PycObject(PycObject::TYPE_NONE); +PycObjRef Pyc_Ellipsis = new PycObject(PycObject::TYPE_ELLIPSIS); +PycObjRef Pyc_StopIteration = new PycObject(PycObject::TYPE_STOPITER); + +PycObjRef CreateObject(int type) +{ + switch (type) { + case PycObject::TYPE_NULL: + return (PycObject*)0; + case PycObject::TYPE_NONE: + return Pyc_None; + case PycObject::TYPE_FALSE: + return Pyc_False.cast(); + case PycObject::TYPE_TRUE: + return Pyc_True.cast(); + case PycObject::TYPE_STOPITER: + return Pyc_StopIteration; + case PycObject::TYPE_ELLIPSIS: + return Pyc_Ellipsis; + case PycObject::TYPE_INT: + return new PycInt(); + //case PycObject::TYPE_INT64: + // ... + case PycObject::TYPE_FLOAT: + return new PycFloat(); + //case PycObject::TYPE_BINARY_FLOAT: + // ... + //case PycObject::TYPE_COMPLEX: + // ... + //case PycObject::TYPE_BINARY_COMPLEX: + // ... + case PycObject::TYPE_LONG: + return new PycLong(); + case PycObject::TYPE_STRING: + return new PycString(); + case PycObject::TYPE_INTERNED: + return new PycString(PycObject::TYPE_INTERNED); + case PycObject::TYPE_STRINGREF: + return new PycString(PycObject::TYPE_STRINGREF); + case PycObject::TYPE_TUPLE: + return new PycTuple(); + case PycObject::TYPE_LIST: + return new PycList(); + //case PycObject::TYPE_DICT: + // ... + case PycObject::TYPE_CODE: + case PycObject::TYPE_CODE2: + return new PycCode(); + //case PycObject::TYPE_UNICODE: + // ... + //case PycObject::TYPE_SET: + // ... + //case PycObject::TYPE_FROZENSET: + // ... + default: + fprintf(stderr, "CreateObject: Got unsupported type 0x%X\n", type); + return (PycObject*)0; + } +} + +PycObjRef LoadObject(PycData* stream, PycModule* mod) +{ + PycObjRef obj = CreateObject(stream->getByte()); + if (obj != Pyc_NULL) + obj->load(stream, mod); + return obj; +} diff --git a/object.h b/object.h new file mode 100644 index 0000000..f1c9d8d --- /dev/null +++ b/object.h @@ -0,0 +1,108 @@ +#ifndef _PYC_OBJECT_H +#define _PYC_OBJECT_H + +/* Please only hold PycObjects inside PycRefs! */ +class PycObject { +public: + enum Type { + // From the Python Marshallers + TYPE_NULL = '0', + TYPE_NONE = 'N', + TYPE_FALSE = 'F', + TYPE_TRUE = 'T', + TYPE_STOPITER = 'S', + TYPE_ELLIPSIS = '.', + TYPE_INT = 'i', + TYPE_INT64 = 'I', + TYPE_FLOAT = 'f', + TYPE_BINARY_FLOAT = 'g', + TYPE_COMPLEX = 'x', + TYPE_BINARY_COMPLEX = 'y', + TYPE_LONG = 'l', + TYPE_STRING = 's', + TYPE_INTERNED = 't', + TYPE_STRINGREF = 'R', + TYPE_TUPLE = '(', + TYPE_LIST = '[', + TYPE_DICT = '{', + TYPE_CODE = 'c', + TYPE_CODE2 = 'C', // Used in Python 1.0 - 1.2 + TYPE_UNICODE = 'u', + TYPE_UNKNOWN = '?', + TYPE_SET = '<', + TYPE_FROZENSET = '>', + }; + + PycObject(int type = TYPE_UNKNOWN) : m_refs(0), m_type(type) { } + virtual ~PycObject() { } + + int type() const { return (this) ? m_type : TYPE_NULL; } + + virtual bool isType(int type) const + { return (this) ? type == m_type : type == TYPE_NULL; } + + virtual void load(class PycData*, class PycModule*) { } + +private: + int m_refs; + int m_type; + +public: + void addRef() { if (this) ++m_refs; } + void delRef() { if (this && --m_refs == 0) delete this; } +}; + + +template +class PycRef { +public: + PycRef() : m_obj(0) { } + PycRef(_Obj* obj) : m_obj(obj) { m_obj->addRef(); } + PycRef(const PycRef<_Obj>& obj) : m_obj(obj.m_obj) { m_obj->addRef(); } + ~PycRef<_Obj>() { m_obj->delRef(); } + + PycRef<_Obj>& operator=(_Obj* obj) + { + obj->addRef(); + m_obj->delRef(); + m_obj = obj; + return *this; + } + + PycRef<_Obj>& operator=(const PycRef<_Obj>& obj) + { + obj.m_obj->addRef(); + m_obj->delRef(); + m_obj = obj.m_obj; + return *this; + } + + bool operator==(_Obj* obj) const { return m_obj == obj; } + bool operator==(const PycRef<_Obj>& obj) const { return m_obj == obj.m_obj; } + bool operator!=(_Obj* obj) const { return m_obj != obj; } + bool operator!=(const PycRef<_Obj>& obj) const { return m_obj != obj.m_obj; } + + _Obj& operator*() const { return *m_obj; } + _Obj* operator->() const { return m_obj; } + operator _Obj*() const { return m_obj; } + + /* This is just for coding convenience -- no type checking is done! */ + template + PycRef<_Cast> cast() const { return (_Cast*)m_obj; } + +private: + _Obj* m_obj; +}; + +typedef PycRef PycObjRef; + +PycObjRef CreateObject(int type); +PycObjRef LoadObject(class PycData* stream, class PycModule* mod); + +/* Static Singleton objects */ +extern PycObjRef Pyc_NULL; +extern PycObjRef Pyc_None; +extern PycObjRef Pyc_Ellipsis; +extern PycObjRef Pyc_StopIteration; + +#endif diff --git a/out/.keep b/out/.keep new file mode 100644 index 0000000..e69de29 diff --git a/pycdas.cpp b/pycdas.cpp new file mode 100644 index 0000000..24eefba --- /dev/null +++ b/pycdas.cpp @@ -0,0 +1,116 @@ +#include +#include +#include "module.h" +#include "bytecode.h" +#include "numeric.h" + +static void ivprintf(int indent, const char* fmt, va_list varargs) +{ + for (int i=0; i obj, PycModule* mod, int indent) +{ + switch (obj->type()) { + case PycObject::TYPE_CODE: + { + PycRef codeObj = obj.cast(); + iprintf(indent, "[Code]\n"); + iprintf(indent + 1, "File Name: %s\n", codeObj->fileName()->value()); + iprintf(indent + 1, "Object Name: %s\n", codeObj->name()->value()); + iprintf(indent + 1, "Arg Count: %d\n", codeObj->argCount()); + iprintf(indent + 1, "Locals: %d\n", codeObj->numLocals()); + iprintf(indent + 1, "Stack Size: %d\n", codeObj->stackSize()); + iprintf(indent + 1, "Flags: 0x%08X\n", codeObj->flags()); + + iprintf(indent + 1, "[Names]\n"); + PycTuple::value_t names = codeObj->names()->values(); + for (PycTuple::value_t::iterator i = names.begin(); i != names.end(); i++) + output_object(*i, mod, indent + 2); + + iprintf(indent + 1, "[Var Names]\n"); + names = codeObj->varNames()->values(); + for (PycTuple::value_t::iterator i = names.begin(); i != names.end(); i++) + output_object(*i, mod, indent + 2); + + iprintf(indent + 1, "[Free Vars]\n"); + names = codeObj->freeVars()->values(); + for (PycTuple::value_t::iterator i = names.begin(); i != names.end(); i++) + output_object(*i, mod, indent + 2); + + iprintf(indent + 1, "[Cell Vars]\n"); + names = codeObj->cellVars()->values(); + for (PycTuple::value_t::iterator i = names.begin(); i != names.end(); i++) + output_object(*i, mod, indent + 2); + + iprintf(indent + 1, "[Constants]\n"); + PycTuple::value_t consts = codeObj->consts()->values(); + for (PycTuple::value_t::iterator i = consts.begin(); i != consts.end(); i++) + output_object(*i, mod, indent + 2); + + iprintf(indent + 1, "[Disassembly]\n"); + bc_disasm(codeObj, mod, indent + 2); + } + break; + case PycObject::TYPE_STRING: + case PycObject::TYPE_STRINGREF: + case PycObject::TYPE_INTERNED: + iprintf(indent, "\"%s\"\n", obj.cast()->value()); + break; + case PycObject::TYPE_TUPLE: + { + iprintf(indent, "(\n"); + PycTuple::value_t values = obj.cast()->values(); + for (PycTuple::value_t::iterator i = values.begin(); i != values.end(); i++) + output_object(*i, mod, indent + 1); + iprintf(indent, ")\n"); + } + break; + case PycObject::TYPE_LIST: + { + iprintf(indent, "[\n"); + PycList::value_t values = obj.cast()->values(); + for (PycList::value_t::iterator i = values.begin(); i != values.end(); i++) + output_object(*i, mod, indent + 1); + iprintf(indent, "]\n"); + } + break; + case PycObject::TYPE_NONE: + iprintf(indent, "None\n"); + break; + case PycObject::TYPE_INT: + iprintf(indent, "%d\n", obj.cast()->value()); + break; + case PycObject::TYPE_FLOAT: + iprintf(indent, "%s\n", obj.cast()->value()); + break; + default: + iprintf(indent, "\n", obj->type()); + } +} + +int main(int argc, char* argv[]) +{ + if (argc < 2) { + fprintf(stderr, "No input file specified\n"); + return 1; + } + + PycModule mod; + mod.loadFromFile(argv[1]); + printf("%s (Python %d.%d%s)\n", argv[1], mod.majorVer(), mod.minorVer(), + mod.isUnicode() ? " -U" : ""); + output_object(mod.code().cast(), &mod, 0); + + return 0; +} diff --git a/sequence.cpp b/sequence.cpp new file mode 100644 index 0000000..9e6a6cc --- /dev/null +++ b/sequence.cpp @@ -0,0 +1,21 @@ +#include "sequence.h" +#include "data.h" +#include "module.h" + +/* PycTuple */ +void PycTuple::load(PycData* stream, PycModule* mod) +{ + m_size = stream->get32(); + m_values.resize(m_size); + for (int i=0; iget32(); + for (int i=0; i +#include + +class PycTuple : public PycObject { +public: + typedef std::vector > value_t; + + PycTuple(int type = TYPE_TUPLE) + : PycObject(type), m_size(0) { } + + void load(class PycData* stream, class PycModule* mod); + + int size() const { return m_size; } + value_t values() const { return m_values; } + +private: + int m_size; + value_t m_values; +}; + +class PycList : public PycObject { +public: + typedef std::list > value_t; + + PycList(int type = TYPE_LIST) + : PycObject(type), m_size(0) { } + + void load(class PycData* stream, class PycModule* mod); + + int size() const { return m_size; } + value_t values() const { return m_values; } + +private: + int m_size; + value_t m_values; +}; + +#endif diff --git a/string.cpp b/string.cpp new file mode 100644 index 0000000..1ed4372 --- /dev/null +++ b/string.cpp @@ -0,0 +1,34 @@ +#include "string.h" +#include "data.h" +#include "module.h" +#include + +/* PycString */ +void PycString::load(PycData* stream, PycModule* mod) +{ + if (m_value) delete[] m_value; + + if (type() == TYPE_STRINGREF) { + PycRef str = mod->getIntern(stream->get32()); + m_length = str->length(); + if (m_length) { + m_value = new char[m_length+1]; + memcpy(m_value, str->value(), m_length); + m_value[m_length] = 0; + } else { + m_value = 0; + } + } else { + m_length = stream->get32(); + if (m_length) { + m_value = new char[m_length+1]; + stream->getBuffer(m_length, m_value); + m_value[m_length] = 0; + } else { + m_value = 0; + } + + if (type() == TYPE_INTERNED) + mod->intern(this); + } +} diff --git a/string.h b/string.h new file mode 100644 index 0000000..b65345e --- /dev/null +++ b/string.h @@ -0,0 +1,29 @@ +#ifndef _PYC_STRING_H +#define _PYC_STRING_H + +#include "object.h" + +class PycString : public PycObject { +public: + PycString(int type = TYPE_STRING) + : PycObject(type), m_value(0), m_length(0) { } + + ~PycString() { if (m_value) delete[] m_value; } + + bool isType(int type) const + { + return (type == TYPE_STRING) || (type == TYPE_INTERNED) || + (type == TYPE_STRINGREF) || PycObject::isType(type); + } + + void load(class PycData* stream, class PycModule* mod); + + int length() const { return m_length; } + const char* value() const { return m_value; } + +private: + char* m_value; + int m_length; +}; + +#endif