MsgPackTypes.cpp 8.6 KB

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