lib/python/pickle/protocol4.rb in python-pickle-0.1.1 vs lib/python/pickle/protocol4.rb in python-pickle-0.2.0

- old
+ new

@@ -24,27 +24,81 @@ super(io) @io_stack = [] end - # Opcodes for Pickle protocol 4. + # The `SHORT_BINUNICODE` opcode. # - # @see https://peps.python.org/pep-3154/ - OPCODES = Protocol3::OPCODES + Set[ - 140, # SHORT_BINUNICODE - 141, # BINUNICODE8 - 142, # BINBYTES8 - 143, # EMPTY_SET - 144, # ADDITEMS - 145, # FROZENSET - 146, # NEWOBJ_EX - 147, # STACK_GLOBAL - 148, # MEMOIZE - 149 # FRAME - ] + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L180 + SHORT_BINUNICODE = 140 + # The `BINUNICODE8` opcode. # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L181 + BINUNICODE8 = 141 + + # The `BINBYTES` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L182 + BINBYTES8 = 142 + + # The `EMPTY_SET` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L183 + EMPTY_SET = 143 + + # The `ADDITEMS` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L184 + ADDITEMS = 144 + + # The `FROZENSET` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L185 + FROZENSET = 145 + + # The `NEWOBJ_EX` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L186 + NEWOBJ_EX = 146 + + # The `STACK_GLOBAL` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L187 + STACK_GLOBAL = 147 + + # The `MEMOIZE` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L188 + MEMOIZE = 148 + + # The `FRAME` opcode. + # + # @since 0.2.0 + # + # @see https://github.com/python/cpython/blob/v2.7/Lib/pickle.py#L189 + FRAME = 149 + + # # Reads an instruction from the pickle stream. # # @return [Instruction] # The decoded instruction. # @@ -54,172 +108,84 @@ def read_instruction case (opcode = @io.getbyte) # # Protocol 0 instructions # - when 40 # MARK - Instructions::MARK - when 46 # STOP - Instructions::STOP - when 48 # POP - Instructions::POP - when 49 # POP_MARK - Instructions::POP_MARK - when 50 # DUP - Instructions::DUP - when 70 # FLOAT - Instructions::Float.new(read_float) - when 73 # INT - Instructions::Int.new(read_int) - when 76 # LONG - Instructions::Long.new(read_long) - when 78 # NONE - Instructions::NONE - when 82 # REDUCE - Instructions::REDUCE - when 83 # STRING - Instructions::String.new(read_string) - when 86 # UNICODE - Instructions::String.new(read_unicode_string) - when 97 # APPEND - Instructions::APPEND - when 98 # BUILD - Instructions::BUILD - when 99 # GLOBAL - Instructions::Global.new(read_nl_string,read_nl_string) - when 100 # DICT - Instructions::DICT - when 103 # GET - Instructions::Get.new(read_int) - when 108 # LIST - Instructions::LIST - when 112 # PUT - Instructions::Put.new(read_int) - when 115 # SETITEM - Instructions::SETITEM - when 116 # TUPLE - Instructions::TUPLE + when MARK then Instructions::MARK + when STOP then Instructions::STOP + when POP then Instructions::POP + when POP_MARK then Instructions::POP_MARK + when DUP then Instructions::DUP + when FLOAT then read_float_instruction + when INT then read_int_instruction + when LONG then read_long_instruction + when NONE then Instructions::NONE + when REDUCE then Instructions::REDUCE + when STRING then read_string_instruction + when UNICODE then read_unicode_instruction + when APPEND then Instructions::APPEND + when BUILD then Instructions::BUILD + when GLOBAL then read_global_instruction + when DICT then Instructions::DICT + when GET then read_get_instruction + when LIST then Instructions::LIST + when PUT then read_put_instruction + when SETITEM then Instructions::SETITEM + when TUPLE then Instructions::TUPLE + when INST then read_inst_instruction + when OBJ then Instructions::OBJ + when PERSID then read_persid_instruction + when BINPERSID then Instructions::BINPERSID # # Protocol 1 instructions # - when 41 # EMPTY_TUPLE - Instructions::EMPTY_TUPLE - when 71 # BINFLOAT - Instructions::BinFloat.new(read_float64_be) - when 75 # BININT1 - Instructions::BinInt1.new(read_uint8) - when 84 # BINSTRING - length = read_uint32_le - string = @io.read(length) - - Instructions::BinString.new(length,string) - when 85 # SHORT_BINSTRING - length = read_uint8 - string = @io.read(length) - - Instructions::ShortBinString.new(length,string) - when 88 # BINUNICODE - length = read_uint32_le - string = @io.read(length).force_encoding(Encoding::UTF_8) - - Instructions::BinUnicode.new(length,string) - when 93 # EMPTY_LIST - Instructions::EMPTY_LIST - when 101 # APPENDS - Instructions::APPENDS - when 104 # BINGET - Instructions::BinGet.new(read_uint8) - when 106 # LONG_BINGET - Instructions::LongBinGet.new(read_uint32_le) - when 113 # BINPUT - Instructions::BinPut.new(read_uint8) - when 117 # SETITEMS - Instructions::SETITEMS - when 125 # EMPTY_DICT - Instructions::EMPTY_DICT + when EMPTY_TUPLE then Instructions::EMPTY_TUPLE + when BINFLOAT then read_binfloat_instruction + when BININT1 then read_binint1_instruction + when BINSTRING then read_binstring_instruction + when SHORT_BINSTRING then read_short_binstring_instruction + when BINUNICODE then read_binunicode_instruction + when EMPTY_LIST then Instructions::EMPTY_LIST + when APPENDS then Instructions::APPENDS + when BINGET then read_binget_instruction + when LONG_BINGET then read_long_binget_instruction + when BINPUT then read_binput_instruction + when SETITEMS then Instructions::SETITEMS + when EMPTY_DICT then Instructions::EMPTY_DICT # # Protocol 2 instructions # - when 128 # PROT - Instructions::Proto.new(read_uint8) - when 129 # NEWOBJ - Instructions::NEWOBJ - when 130 # EXT1 - Instructions::Ext1.new(read_uint8) - when 131 # EXT2 - Instructions::Ext2.new(read_uint16_le) - when 132 # EXT4 - Instructions::Ext4.new(read_uint32_le) - when 133 # TUPLE1 - Instructions::TUPLE1 - when 134 # TUPLE2 - Instructions::TUPLE2 - when 135 # TUPLE3 - Instructions::TUPLE3 - when 136 # NEWTRUE - Instructions::NEWTRUE - when 137 # NEWFALSE - Instructions::NEWFALSE - when 138 # LONG1 - length = read_uint8 - long = read_int_le(length) - - Instructions::Long1.new(length,long) - when 139 # LONG4 - length = read_uint32_le - long = read_int_le(length) - - Instructions::Long4.new(length,long) + when PROTO then read_proto_instruction + when NEWOBJ then Instructions::NEWOBJ + when EXT1 then read_ext1_instruction + when EXT2 then read_ext2_instruction + when EXT4 then read_ext4_instruction + when TUPLE1 then Instructions::TUPLE1 + when TUPLE2 then Instructions::TUPLE2 + when TUPLE3 then Instructions::TUPLE3 + when NEWTRUE then Instructions::NEWTRUE + when NEWFALSE then Instructions::NEWFALSE + when LONG1 then read_long1_instruction + when LONG4 then read_long4_instruction # # Protocol 3 instructions # - when 66 # BINBYTES - length = read_uint32_le - bytes = @io.read(length) - - Instructions::BinBytes.new(length,bytes) - when 67 # SHORT_BINBYTES - length = read_uint8 - bytes = @io.read(length) - - Instructions::ShortBinBytes.new(length,bytes) + when BINBYTES then read_binbytes_instruction + when SHORT_BINBYTES then read_short_binbytes_instruction # # Protocol 4 instructions # - when 140 # SHORT_BINUNICODE - length = read_uint8 - string = read_utf8_string(length) - - Instructions::ShortBinUnicode.new(length,string) - when 141 # BINUNICODE8 - length = read_uint64_le - string = read_utf8_string(length) - - Instructions::BinUnicode8.new(length,string) - when 142 # BINBYTES8 - length = read_uint64_le - bytes = @io.read(length) - - Instructions::BinBytes8.new(length,bytes) - when 143 # EMPTY_SET - Instructions::EMPTY_SET - when 144 # ADDITEMS - Instructions::ADDITEMS - when 145 # FROZENSET - Instructions::FROZENSET - when 146 # NEWOBJ_EX - Instructions::NEWOBJ_EX - when 147 # STACK_GLOBAL - Instructions::STACK_GLOBAL - when 148 # MEMOIZE - Instructions::MEMOIZE - when 149 # FRAME - length = read_uint64_le - - enter_frame(read_frame(length)) - - Instructions::Frame.new(length) + when SHORT_BINUNICODE then read_short_binunicode_instruction + when BINUNICODE8 then read_binunicode8_instruction + when BINBYTES8 then read_binbytes8_instruction + when EMPTY_SET then Instructions::EMPTY_SET + when ADDITEMS then Instructions::ADDITEMS + when FROZENSET then Instructions::FROZENSET + when NEWOBJ_EX then Instructions::NEWOBJ_EX + when STACK_GLOBAL then Instructions::STACK_GLOBAL + when MEMOIZE then Instructions::MEMOIZE + when FRAME then read_frame_instruction else raise(InvalidFormat,"invalid opcode (#{opcode.inspect}) for protocol 4") end ensure if @io.eof? && !@io_stack.empty? @@ -276,9 +242,66 @@ # # Leaves a data frame and restores {#io}. # def leave_frame @io = @io_stack.pop + end + + # + # Reads a `SHORT_BINUNICODE` instruction. + # + # @return [Instructions::ShortBinUnicode] + # + # @since 0.2.0 + # + def read_short_binunicode_instruction + length = read_uint8 + string = read_utf8_string(length) + + Instructions::ShortBinUnicode.new(length,string) + end + + # + # Reads a `BINUNICODE8` instruction. + # + # @return [Instructions::BinUnicode8] + # + # @since 0.2.0 + # + def read_binunicode8_instruction + length = read_uint64_le + string = read_utf8_string(length) + + Instructions::BinUnicode8.new(length,string) + end + + # + # Reads a `BINBYTES8` instruction. + # + # @return [Instructions::BinBytes8] + # + # @since 0.2.0 + # + def read_binbytes8_instruction + length = read_uint64_le + bytes = @io.read(length) + + Instructions::BinBytes8.new(length,bytes) + end + + # + # Reads a `FRAME` instruction. + # + # @return [Instructions::Frame] + # + # @since 0.2.0 + # + def read_frame_instruction + length = read_uint64_le + + enter_frame(read_frame(length)) + + Instructions::Frame.new(length) end end end end