From da046a9a9004a570da5822fb6bc44128f3a03899 Mon Sep 17 00:00:00 2001 From: Michael Hansen Date: Fri, 24 Jul 2009 08:35:21 +0000 Subject: [PATCH] Code so far --- Makefile | 53 ++++ PythonBytecode.txt | 594 +++++++++++++++++++++++++++++++++++++++++++++ bin/.keep | 0 bytecode.cpp | 182 ++++++++++++++ bytecode.h | 118 +++++++++ code.cpp | 77 ++++++ code.h | 48 ++++ data.cpp | 70 ++++++ data.h | 52 ++++ module.cpp | 134 ++++++++++ module.h | 54 +++++ numeric.cpp | 37 +++ numeric.h | 63 +++++ object.cpp | 76 ++++++ object.h | 108 +++++++++ out/.keep | 0 pycdas.cpp | 116 +++++++++ sequence.cpp | 21 ++ sequence.h | 42 ++++ string.cpp | 34 +++ string.h | 29 +++ 21 files changed, 1908 insertions(+) create mode 100644 Makefile create mode 100644 PythonBytecode.txt create mode 100644 bin/.keep create mode 100644 bytecode.cpp create mode 100644 bytecode.h create mode 100644 code.cpp create mode 100644 code.h create mode 100644 data.cpp create mode 100644 data.h create mode 100644 module.cpp create mode 100644 module.h create mode 100644 numeric.cpp create mode 100644 numeric.h create mode 100644 object.cpp create mode 100644 object.h create mode 100644 out/.keep create mode 100644 pycdas.cpp create mode 100644 sequence.cpp create mode 100644 sequence.h create mode 100644 string.cpp create mode 100644 string.h 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