Code so far
This commit is contained in:
53
Makefile
Normal file
53
Makefile
Normal 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
594
PythonBytecode.txt
Normal 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
|
182
bytecode.cpp
Normal file
182
bytecode.cpp
Normal 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
118
bytecode.h
Normal 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
77
code.cpp
Normal 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
48
code.h
Normal 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
70
data.cpp
Normal 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
52
data.h
Normal 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
134
module.cpp
Normal 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
54
module.h
Normal 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
37
numeric.cpp
Normal 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
63
numeric.h
Normal 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
76
object.cpp
Normal 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
108
object.h
Normal 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
|
116
pycdas.cpp
Normal file
116
pycdas.cpp
Normal 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
21
sequence.cpp
Normal 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
42
sequence.h
Normal 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
34
string.cpp
Normal 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
29
string.h
Normal 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
|
Reference in New Issue
Block a user