20using namespace msgpack;
23 : InputBuffer(InputBuffer), Current(InputBuffer.getBufferStart()),
24 End(InputBuffer.getBufferEnd()) {}
42 case FirstByte::False:
48 return readInt<int8_t>(Obj);
49 case FirstByte::Int16:
51 return readInt<int16_t>(Obj);
52 case FirstByte::Int32:
54 return readInt<int32_t>(Obj);
55 case FirstByte::Int64:
57 return readInt<int64_t>(Obj);
58 case FirstByte::UInt8:
60 return readUInt<uint8_t>(Obj);
61 case FirstByte::UInt16:
63 return readUInt<uint16_t>(Obj);
64 case FirstByte::UInt32:
66 return readUInt<uint32_t>(Obj);
67 case FirstByte::UInt64:
69 return readUInt<uint64_t>(Obj);
70 case FirstByte::Float32:
72 if (
sizeof(
float) > remainingSpace())
73 return make_error<StringError>(
74 "Invalid Float32 with insufficient payload",
75 std::make_error_code(std::errc::invalid_argument));
77 llvm::bit_cast<float>(endian::read<uint32_t, Endianness>(Current));
78 Current +=
sizeof(float);
80 case FirstByte::Float64:
82 if (
sizeof(
double) > remainingSpace())
83 return make_error<StringError>(
84 "Invalid Float64 with insufficient payload",
85 std::make_error_code(std::errc::invalid_argument));
87 llvm::bit_cast<double>(endian::read<uint64_t, Endianness>(Current));
88 Current +=
sizeof(double);
92 return readRaw<uint8_t>(Obj);
93 case FirstByte::Str16:
95 return readRaw<uint16_t>(Obj);
96 case FirstByte::Str32:
98 return readRaw<uint32_t>(Obj);
101 return readRaw<uint8_t>(Obj);
102 case FirstByte::Bin16:
104 return readRaw<uint16_t>(Obj);
105 case FirstByte::Bin32:
107 return readRaw<uint32_t>(Obj);
108 case FirstByte::Array16:
110 return readLength<uint16_t>(Obj);
111 case FirstByte::Array32:
113 return readLength<uint32_t>(Obj);
114 case FirstByte::Map16:
116 return readLength<uint16_t>(Obj);
117 case FirstByte::Map32:
119 return readLength<uint32_t>(Obj);
120 case FirstByte::FixExt1:
122 return createExt(Obj, FixLen::Ext1);
123 case FirstByte::FixExt2:
125 return createExt(Obj, FixLen::Ext2);
126 case FirstByte::FixExt4:
128 return createExt(Obj, FixLen::Ext4);
129 case FirstByte::FixExt8:
131 return createExt(Obj, FixLen::Ext8);
132 case FirstByte::FixExt16:
134 return createExt(Obj, FixLen::Ext16);
135 case FirstByte::Ext8:
137 return readExt<uint8_t>(Obj);
138 case FirstByte::Ext16:
140 return readExt<uint16_t>(Obj);
141 case FirstByte::Ext32:
143 return readExt<uint32_t>(Obj);
146 if ((FB & FixBitsMask::NegativeInt) == FixBits::NegativeInt) {
149 static_assert(
sizeof(
I) ==
sizeof(FB),
"Unexpected type sizes");
150 memcpy(&
I, &FB,
sizeof(FB));
155 if ((FB & FixBitsMask::PositiveInt) == FixBits::PositiveInt) {
161 if ((FB & FixBitsMask::String) == FixBits::String) {
164 return createRaw(Obj,
Size);
167 if ((FB & FixBitsMask::Array) == FixBits::Array) {
173 if ((FB & FixBitsMask::Map) == FixBits::Map) {
179 return make_error<StringError>(
180 "Invalid first byte", std::make_error_code(std::errc::invalid_argument));
184 if (
sizeof(
T) > remainingSpace())
185 return make_error<StringError>(
186 "Invalid Raw with insufficient payload",
187 std::make_error_code(std::errc::invalid_argument));
188 T Size = endian::read<T, Endianness>(Current);
189 Current +=
sizeof(
T);
190 return createRaw(Obj,
Size);
194 if (
sizeof(
T) > remainingSpace())
195 return make_error<StringError>(
196 "Invalid Int with insufficient payload",
197 std::make_error_code(std::errc::invalid_argument));
198 Obj.
Int =
static_cast<int64_t
>(endian::read<T, Endianness>(Current));
199 Current +=
sizeof(
T);
204 if (
sizeof(
T) > remainingSpace())
205 return make_error<StringError>(
206 "Invalid Int with insufficient payload",
207 std::make_error_code(std::errc::invalid_argument));
208 Obj.
UInt =
static_cast<uint64_t>(endian::read<T, Endianness>(Current));
209 Current +=
sizeof(
T);
214 if (
sizeof(
T) > remainingSpace())
215 return make_error<StringError>(
216 "Invalid Map/Array with invalid length",
217 std::make_error_code(std::errc::invalid_argument));
218 Obj.
Length =
static_cast<size_t>(endian::read<T, Endianness>(Current));
219 Current +=
sizeof(
T);
224 if (
sizeof(
T) > remainingSpace())
225 return make_error<StringError>(
226 "Invalid Ext with invalid length",
227 std::make_error_code(std::errc::invalid_argument));
228 T Size = endian::read<T, Endianness>(Current);
229 Current +=
sizeof(
T);
230 return createExt(Obj,
Size);
234 if (
Size > remainingSpace())
235 return make_error<StringError>(
236 "Invalid Raw with insufficient payload",
237 std::make_error_code(std::errc::invalid_argument));
245 return make_error<StringError>(
246 "Invalid Ext with no type",
247 std::make_error_code(std::errc::invalid_argument));
249 if (
Size > remainingSpace())
250 return make_error<StringError>(
251 "Invalid Ext with insufficient payload",
252 std::make_error_code(std::errc::invalid_argument));
This file contains constants used for implementing MessagePack support.
Tagged union holding either a T or a Error.
StringRef - Represent a constant reference to a string, i.e.
Reads MessagePack objects from memory, one at a time.
LLVM_ABI Reader(MemoryBufferRef InputBuffer)
Construct a reader, keeping a reference to the InputBuffer.
LLVM_ABI Expected< bool > read(Object &Obj)
Read one object from the input buffer, advancing past it.
This is an optimization pass for GlobalISel generic memory operations.
int8_t Type
User-defined extension type.
StringRef Bytes
Raw bytes of the extension object.
MessagePack object, represented as a tagged union of C++ types.
int64_t Int
Value for Type::Int.
double Float
Value for Type::Float.
StringRef Raw
Value for Type::String and Type::Binary.
uint64_t UInt
Value for Type::Uint.
bool Bool
Value for Type::Boolean.
ExtensionType Extension
Value for Type::Extension.
size_t Length
Value for Type::Array and Type::Map.