|
10 | 10 | #include <torch/csrc/jit/serialization/unpickler.h>
|
11 | 11 | #include <torch/csrc/utils/byte_order.h>
|
12 | 12 | #include <string>
|
| 13 | +#include <utility> |
13 | 14 |
|
14 | 15 | namespace torch::jit {
|
15 | 16 |
|
@@ -406,7 +407,7 @@ PickleOpCode Unpickler::readInstruction() {
|
406 | 407 | } break;
|
407 | 408 | case PickleOpCode::TUPLE1: {
|
408 | 409 | TORCH_CHECK(
|
409 |
| - stack_.size() > 0, |
| 410 | + !stack_.empty(), |
410 | 411 | "Parsing error: stack_ contains ",
|
411 | 412 | stack_.size(),
|
412 | 413 | " elements, at least 1 expected");
|
@@ -451,6 +452,12 @@ PickleOpCode Unpickler::readInstruction() {
|
451 | 452 | auto list_ivalue = stack_.at(start - 1);
|
452 | 453 | readList(list_ivalue);
|
453 | 454 | } break;
|
| 455 | + case PickleOpCode::APPEND: { |
| 456 | + TORCH_CHECK( |
| 457 | + stack_.size() >= 2, "Parsing error: missing elements in stack_."); |
| 458 | + auto list_ivalue = stack_.at(stack_.size() - 2); |
| 459 | + readListElements(list_ivalue, stack_.size() - 1); |
| 460 | + } break; |
454 | 461 | case PickleOpCode::LIST: {
|
455 | 462 | IValue list_ivalue = c10::impl::GenericList(AnyType::get());
|
456 | 463 | readList(list_ivalue);
|
@@ -1118,12 +1125,7 @@ std::string Unpickler::readBytes(size_t length) {
|
1118 | 1125 | return data;
|
1119 | 1126 | }
|
1120 | 1127 |
|
1121 |
| -// Pop all the list items off of the stack and append them to the list at |
1122 |
| -// the corresponding MARK |
1123 |
| -void Unpickler::readList(IValue list_ivalue) { |
1124 |
| - TORCH_CHECK(!marks_.empty(), "Parsing error: marks_ is empty"); |
1125 |
| - size_t start = marks_.back(); |
1126 |
| - marks_.pop_back(); |
| 1128 | +void Unpickler::readListElements(IValue list_ivalue, size_t start) { |
1127 | 1129 | auto num_elements = stack_.size() - start;
|
1128 | 1130 | auto elements = c10::ArrayRef<IValue>(stack_).slice(start);
|
1129 | 1131 | if (list_ivalue.isIntList()) {
|
@@ -1159,10 +1161,18 @@ void Unpickler::readList(IValue list_ivalue) {
|
1159 | 1161 | } else {
|
1160 | 1162 | AT_ERROR("Unknown IValue list kind: ", list_ivalue.tagKind());
|
1161 | 1163 | }
|
1162 |
| - |
1163 | 1164 | stack_.erase(stack_.begin() + start, stack_.end());
|
1164 | 1165 | }
|
1165 | 1166 |
|
| 1167 | +// Pop all the list items off of the stack and append them to the list at |
| 1168 | +// the corresponding MARK |
| 1169 | +void Unpickler::readList(IValue list_ivalue) { |
| 1170 | + TORCH_CHECK(!marks_.empty(), "Parsing error: marks_ is empty"); |
| 1171 | + size_t start = marks_.back(); |
| 1172 | + marks_.pop_back(); |
| 1173 | + readListElements(std::move(list_ivalue), start); |
| 1174 | +} |
| 1175 | + |
1166 | 1176 | inline bool is_valid_python_id_char(char c) {
|
1167 | 1177 | return c == '_' || c == '.' || (c >= '0' && c <= '9') ||
|
1168 | 1178 | (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
|
|
0 commit comments