MsgPackTypes.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. //===- MsgPackTypes.cpp - MsgPack Types -------------------------*- C++ -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. /// \file
  10. /// Implementation of types representing MessagePack "documents".
  11. //
  12. //===----------------------------------------------------------------------===//
  13. #include "llvm/BinaryFormat/MsgPackTypes.h"
  14. #include "llvm/Support/Error.h"
  15. using namespace llvm;
  16. using namespace msgpack;
  17. namespace llvm {
  18. namespace msgpack {
  19. void ScalarNode::anchor() {}
  20. void ArrayNode::anchor() {}
  21. void MapNode::anchor() {}
  22. }
  23. }
  24. Expected<OptNodePtr> Node::readArray(Reader &MPReader, size_t Length) {
  25. auto A = std::make_shared<ArrayNode>();
  26. for (size_t I = 0; I < Length; ++I) {
  27. auto OptNodeOrErr = Node::read(MPReader);
  28. if (auto Err = OptNodeOrErr.takeError())
  29. return std::move(Err);
  30. if (!*OptNodeOrErr)
  31. return make_error<StringError>(
  32. "Insufficient array elements",
  33. std::make_error_code(std::errc::invalid_argument));
  34. A->push_back(std::move(**OptNodeOrErr));
  35. }
  36. return OptNodePtr(std::move(A));
  37. }
  38. Expected<OptNodePtr> Node::readMap(Reader &MPReader, size_t Length) {
  39. auto M = std::make_shared<MapNode>();
  40. for (size_t I = 0; I < Length; ++I) {
  41. auto OptKeyOrErr = Node::read(MPReader);
  42. if (auto Err = OptKeyOrErr.takeError())
  43. return std::move(Err);
  44. if (!*OptKeyOrErr)
  45. return make_error<StringError>(
  46. "Insufficient map elements",
  47. std::make_error_code(std::errc::invalid_argument));
  48. auto OptValOrErr = Node::read(MPReader);
  49. if (auto Err = OptValOrErr.takeError())
  50. return std::move(Err);
  51. if (!*OptValOrErr)
  52. return make_error<StringError>(
  53. "Insufficient map elements",
  54. std::make_error_code(std::errc::invalid_argument));
  55. auto *Key = dyn_cast<ScalarNode>((*OptKeyOrErr)->get());
  56. if (!Key)
  57. return make_error<StringError>(
  58. "Only string map keys are supported",
  59. std::make_error_code(std::errc::invalid_argument));
  60. if (Key->getScalarKind() != ScalarNode::SK_String)
  61. return make_error<StringError>(
  62. "Only string map keys are supported",
  63. std::make_error_code(std::errc::invalid_argument));
  64. M->try_emplace(Key->getString(), std::move(**OptValOrErr));
  65. }
  66. return OptNodePtr(std::move(M));
  67. }
  68. Expected<OptNodePtr> Node::read(Reader &MPReader) {
  69. Object Obj;
  70. auto ContinueOrErr = MPReader.read(Obj);
  71. if (auto Err = ContinueOrErr.takeError())
  72. return std::move(Err);
  73. if (!*ContinueOrErr)
  74. return None;
  75. switch (Obj.Kind) {
  76. case Type::Int:
  77. return OptNodePtr(std::make_shared<ScalarNode>(Obj.Int));
  78. case Type::UInt:
  79. return OptNodePtr(std::make_shared<ScalarNode>(Obj.UInt));
  80. case Type::Nil:
  81. return OptNodePtr(std::make_shared<ScalarNode>());
  82. case Type::Boolean:
  83. return OptNodePtr(std::make_shared<ScalarNode>(Obj.Bool));
  84. case Type::Float:
  85. return OptNodePtr(std::make_shared<ScalarNode>(Obj.Float));
  86. case Type::String:
  87. return OptNodePtr(std::make_shared<ScalarNode>(Obj.Raw));
  88. case Type::Binary:
  89. return OptNodePtr(std::make_shared<ScalarNode>(Obj.Raw));
  90. case Type::Array:
  91. return Node::readArray(MPReader, Obj.Length);
  92. case Type::Map:
  93. return Node::readMap(MPReader, Obj.Length);
  94. case Type::Extension:
  95. return make_error<StringError>(
  96. "Extension types are not supported",
  97. std::make_error_code(std::errc::invalid_argument));
  98. }
  99. llvm_unreachable("msgpack::Type not handled");
  100. }
  101. void ScalarNode::destroy() {
  102. switch (SKind) {
  103. case SK_String:
  104. case SK_Binary:
  105. StringValue.~basic_string();
  106. break;
  107. default:
  108. // POD types do not require destruction
  109. break;
  110. }
  111. }
  112. ScalarNode::ScalarNode(int64_t IntValue)
  113. : Node(NK_Scalar), SKind(SK_Int), IntValue(IntValue) {}
  114. ScalarNode::ScalarNode(int32_t IntValue)
  115. : ScalarNode(static_cast<int64_t>(IntValue)) {}
  116. ScalarNode::ScalarNode(uint64_t UIntValue)
  117. : Node(NK_Scalar), SKind(SK_UInt), UIntValue(UIntValue) {}
  118. ScalarNode::ScalarNode(uint32_t IntValue)
  119. : ScalarNode(static_cast<uint64_t>(IntValue)) {}
  120. ScalarNode::ScalarNode() : Node(NK_Scalar), SKind(SK_Nil) {}
  121. ScalarNode::ScalarNode(bool BoolValue)
  122. : Node(NK_Scalar), SKind(SK_Boolean), BoolValue(BoolValue) {}
  123. ScalarNode::ScalarNode(double FloatValue)
  124. : Node(NK_Scalar), SKind(SK_Float), BoolValue(FloatValue) {}
  125. ScalarNode::ScalarNode(StringRef StringValue)
  126. : Node(NK_Scalar), SKind(SK_String) {
  127. new (&this->StringValue) std::string(StringValue);
  128. }
  129. ScalarNode::ScalarNode(const char *StringValue)
  130. : ScalarNode(StringRef(StringValue)) {}
  131. ScalarNode::ScalarNode(std::string &&StringValue)
  132. : Node(NK_Scalar), SKind(SK_String) {
  133. new (&this->StringValue) std::string(StringValue);
  134. }
  135. ScalarNode::ScalarNode(MemoryBufferRef BinaryValue)
  136. : Node(NK_Scalar), SKind(SK_Binary) {
  137. new (&StringValue) std::string(BinaryValue.getBuffer());
  138. }
  139. ScalarNode::~ScalarNode() { destroy(); }
  140. ScalarNode &ScalarNode::operator=(ScalarNode &&RHS) {
  141. destroy();
  142. switch (SKind = RHS.SKind) {
  143. case SK_Int:
  144. IntValue = RHS.IntValue;
  145. break;
  146. case SK_UInt:
  147. UIntValue = RHS.UIntValue;
  148. break;
  149. case SK_Boolean:
  150. BoolValue = RHS.BoolValue;
  151. break;
  152. case SK_Float:
  153. FloatValue = RHS.FloatValue;
  154. break;
  155. case SK_String:
  156. case SK_Binary:
  157. new (&StringValue) std::string(std::move(RHS.StringValue));
  158. break;
  159. case SK_Nil:
  160. // pass
  161. break;
  162. }
  163. return *this;
  164. }
  165. StringRef ScalarNode::inputYAML(StringRef ScalarStr) {
  166. switch (SKind) {
  167. case SK_Int:
  168. return yaml::ScalarTraits<int64_t>::input(ScalarStr, nullptr, IntValue);
  169. case SK_UInt:
  170. return yaml::ScalarTraits<uint64_t>::input(ScalarStr, nullptr, UIntValue);
  171. case SK_Nil:
  172. return StringRef();
  173. case SK_Boolean:
  174. return yaml::ScalarTraits<bool>::input(ScalarStr, nullptr, BoolValue);
  175. case SK_Float:
  176. return yaml::ScalarTraits<double>::input(ScalarStr, nullptr, FloatValue);
  177. case SK_Binary:
  178. case SK_String:
  179. return yaml::ScalarTraits<std::string>::input(ScalarStr, nullptr,
  180. StringValue);
  181. }
  182. llvm_unreachable("unrecognized ScalarKind");
  183. }
  184. void ScalarNode::outputYAML(raw_ostream &OS) const {
  185. switch (SKind) {
  186. case SK_Int:
  187. yaml::ScalarTraits<int64_t>::output(IntValue, nullptr, OS);
  188. break;
  189. case SK_UInt:
  190. yaml::ScalarTraits<uint64_t>::output(UIntValue, nullptr, OS);
  191. break;
  192. case SK_Nil:
  193. yaml::ScalarTraits<StringRef>::output("", nullptr, OS);
  194. break;
  195. case SK_Boolean:
  196. yaml::ScalarTraits<bool>::output(BoolValue, nullptr, OS);
  197. break;
  198. case SK_Float:
  199. yaml::ScalarTraits<double>::output(FloatValue, nullptr, OS);
  200. break;
  201. case SK_Binary:
  202. case SK_String:
  203. yaml::ScalarTraits<std::string>::output(StringValue, nullptr, OS);
  204. break;
  205. }
  206. }
  207. yaml::QuotingType ScalarNode::mustQuoteYAML(StringRef ScalarStr) const {
  208. switch (SKind) {
  209. case SK_Int:
  210. return yaml::ScalarTraits<int64_t>::mustQuote(ScalarStr);
  211. case SK_UInt:
  212. return yaml::ScalarTraits<uint64_t>::mustQuote(ScalarStr);
  213. case SK_Nil:
  214. return yaml::ScalarTraits<StringRef>::mustQuote(ScalarStr);
  215. case SK_Boolean:
  216. return yaml::ScalarTraits<bool>::mustQuote(ScalarStr);
  217. case SK_Float:
  218. return yaml::ScalarTraits<double>::mustQuote(ScalarStr);
  219. case SK_Binary:
  220. case SK_String:
  221. return yaml::ScalarTraits<std::string>::mustQuote(ScalarStr);
  222. }
  223. llvm_unreachable("unrecognized ScalarKind");
  224. }
  225. const char *ScalarNode::IntTag = "!int";
  226. const char *ScalarNode::NilTag = "!nil";
  227. const char *ScalarNode::BooleanTag = "!bool";
  228. const char *ScalarNode::FloatTag = "!float";
  229. const char *ScalarNode::StringTag = "!str";
  230. const char *ScalarNode::BinaryTag = "!bin";
  231. StringRef ScalarNode::getYAMLTag() const {
  232. switch (SKind) {
  233. case SK_Int:
  234. return IntTag;
  235. case SK_UInt:
  236. return IntTag;
  237. case SK_Nil:
  238. return NilTag;
  239. case SK_Boolean:
  240. return BooleanTag;
  241. case SK_Float:
  242. return FloatTag;
  243. case SK_String:
  244. return StringTag;
  245. case SK_Binary:
  246. return BinaryTag;
  247. }
  248. llvm_unreachable("unrecognized ScalarKind");
  249. }
  250. void ScalarNode::write(Writer &MPWriter) {
  251. switch (SKind) {
  252. case SK_Int:
  253. MPWriter.write(IntValue);
  254. break;
  255. case SK_UInt:
  256. MPWriter.write(UIntValue);
  257. break;
  258. case SK_Nil:
  259. MPWriter.writeNil();
  260. break;
  261. case SK_Boolean:
  262. MPWriter.write(BoolValue);
  263. break;
  264. case SK_Float:
  265. MPWriter.write(FloatValue);
  266. break;
  267. case SK_String:
  268. MPWriter.write(StringValue);
  269. break;
  270. case SK_Binary:
  271. MPWriter.write(MemoryBufferRef(StringValue, ""));
  272. break;
  273. }
  274. }