Code so far

This commit is contained in:
Michael Hansen
2009-07-24 08:35:21 +00:00
commit da046a9a90
21 changed files with 1908 additions and 0 deletions

53
Makefile Normal file
View File

@@ -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 $@

594
PythonBytecode.txt Normal file
View File

@@ -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

0
bin/.keep Normal file
View File

182
bytecode.cpp Normal file
View File

@@ -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<PycCode> 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; i<indent; i++)
printf(" ");
if (mod->majorVer() == 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");
}
}

118
bytecode.h Normal file
View File

@@ -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<PycCode> code, PycModule* mod, int indent);

77
code.cpp Normal file
View File

@@ -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<PycString>();
m_consts = LoadObject(stream, mod).cast<PycTuple>();
m_names = LoadObject(stream, mod).cast<PycTuple>();
if ((mod->majorVer() == 1 && mod->minorVer() >= 3) ||
(mod->majorVer() >= 2)) {
m_varNames = LoadObject(stream, mod).cast<PycTuple>();
}
if ((mod->majorVer() == 2 && mod->minorVer() >= 1) ||
(mod->majorVer() >= 3)) {
m_freeVars = LoadObject(stream, mod).cast<PycTuple>();
}
if ((mod->majorVer() == 2 && mod->minorVer() >= 1) ||
(mod->majorVer() >= 3)) {
m_cellVars = LoadObject(stream, mod).cast<PycTuple>();
}
m_fileName = LoadObject(stream, mod).cast<PycString>();
m_name = LoadObject(stream, mod).cast<PycString>();
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<PycString>();
}
}

48
code.h Normal file
View File

@@ -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<PycString> code() const { return m_code; }
PycRef<PycTuple> consts() const { return m_consts; }
PycRef<PycTuple> names() const { return m_names; }
PycRef<PycTuple> varNames() const { return m_varNames; }
PycRef<PycTuple> freeVars() const { return m_freeVars; }
PycRef<PycTuple> cellVars() const { return m_cellVars; }
PycRef<PycString> fileName() const { return m_fileName; }
PycRef<PycString> name() const { return m_name; }
int firstLine() const { return m_firstLine; }
PycRef<PycString> lnTable() const { return m_lnTable; }
private:
int m_argCount, m_kwOnlyArgCount, m_numLocals, m_stackSize, m_flags;
PycRef<PycString> m_code;
PycRef<PycTuple> m_consts;
PycRef<PycTuple> m_names;
PycRef<PycTuple> m_varNames;
PycRef<PycTuple> m_freeVars;
PycRef<PycTuple> m_cellVars;
PycRef<PycString> m_fileName;
PycRef<PycString> m_name;
int m_firstLine;
PycRef<PycString> m_lnTable;
};
#endif

70
data.cpp Normal file
View File

@@ -0,0 +1,70 @@
#include "data.h"
#include <cstring>
/* 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;
}

52
data.h Normal file
View File

@@ -0,0 +1,52 @@
#ifndef _PYC_FILE_H
#define _PYC_FILE_H
#include <cstdio>
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

134
module.cpp Normal file
View File

@@ -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<PycCode>();
}
PycRef<PycString> PycModule::getIntern(int ref)
{
std::list<PycRef<PycString> >::iterator it = m_interns.begin();
for (int i=0; i<ref; i++, it++) /* move forward to ref */ ;
return *it;
}

54
module.h Normal file
View File

@@ -0,0 +1,54 @@
#ifndef _PYC_MODULE_H
#define _PYC_MODULE_H
#include "code.h"
#include <list>
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<PycCode> code() const { return m_code; }
void intern(PycRef<PycString> str) { m_interns.push_back(str); }
PycRef<PycString> getIntern(int ref);
private:
void setVersion(unsigned int magic);
private:
short m_maj, m_min;
bool m_unicode;
PycRef<PycCode> m_code;
std::list<PycRef<PycString> > m_interns;
};
#endif

37
numeric.cpp Normal file
View File

@@ -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; i<actualSize; i++)
m_value.push_back(stream->get16());
}
/* 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;
}
}

63
numeric.h Normal file
View File

@@ -0,0 +1,63 @@
#ifndef _PYC_NUMERIC_H
#define _PYC_NUMERIC_H
#include "object.h"
#include <list>
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<int> value() const { return m_value; }
private:
int m_size;
std::list<int> 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

76
object.cpp Normal file
View File

@@ -0,0 +1,76 @@
#include "object.h"
#include <cstdio>
#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<PycObject>();
case PycObject::TYPE_TRUE:
return Pyc_True.cast<PycObject>();
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;
}

108
object.h Normal file
View File

@@ -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 _Obj>
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 <class _Cast>
PycRef<_Cast> cast() const { return (_Cast*)m_obj; }
private:
_Obj* m_obj;
};
typedef PycRef<PycObject> 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

0
out/.keep Normal file
View File

116
pycdas.cpp Normal file
View File

@@ -0,0 +1,116 @@
#include <cstdio>
#include <cstdarg>
#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<indent; i++)
printf(" ");
vprintf(fmt, varargs);
}
static void iprintf(int indent, const char* fmt, ...)
{
va_list varargs;
va_start(varargs, fmt);
ivprintf(indent, fmt, varargs);
va_end(varargs);
}
void output_object(PycRef<PycObject> obj, PycModule* mod, int indent)
{
switch (obj->type()) {
case PycObject::TYPE_CODE:
{
PycRef<PycCode> codeObj = obj.cast<PycCode>();
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<PycString>()->value());
break;
case PycObject::TYPE_TUPLE:
{
iprintf(indent, "(\n");
PycTuple::value_t values = obj.cast<PycTuple>()->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<PycList>()->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<PycInt>()->value());
break;
case PycObject::TYPE_FLOAT:
iprintf(indent, "%s\n", obj.cast<PycFloat>()->value());
break;
default:
iprintf(indent, "<TYPE: %d>\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<PycObject>(), &mod, 0);
return 0;
}

21
sequence.cpp Normal file
View File

@@ -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; i<m_size; i++)
m_values[i] = LoadObject(stream, mod);
}
/* PycList */
void PycList::load(PycData* stream, PycModule* mod)
{
m_size = stream->get32();
for (int i=0; i<m_size; i++)
m_values.push_back(LoadObject(stream, mod));
}

42
sequence.h Normal file
View File

@@ -0,0 +1,42 @@
#ifndef _PYC_SEQUENCE_H
#define _PYC_SEQUENCE_H
#include "object.h"
#include <vector>
#include <list>
class PycTuple : public PycObject {
public:
typedef std::vector<PycRef<PycObject> > 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<PycRef<PycObject> > 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

34
string.cpp Normal file
View File

@@ -0,0 +1,34 @@
#include "string.h"
#include "data.h"
#include "module.h"
#include <cstring>
/* PycString */
void PycString::load(PycData* stream, PycModule* mod)
{
if (m_value) delete[] m_value;
if (type() == TYPE_STRINGREF) {
PycRef<PycString> 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);
}
}

29
string.h Normal file
View File

@@ -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