X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fexperimental%2Fbser%2FLoad.cpp;h=ad390ee8a866f7405798ba076c0d50d430c62bae;hb=93f4d05d584569bdede7e2d124a21c31559ea93e;hp=3f82dabb114035af52fcbca8e973eca18b2dd04c;hpb=5911efa17496b5f4645955e143c3c0db40d1f9cc;p=folly.git diff --git a/folly/experimental/bser/Load.cpp b/folly/experimental/bser/Load.cpp index 3f82dabb..ad390ee8 100644 --- a/folly/experimental/bser/Load.cpp +++ b/folly/experimental/bser/Load.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2016 Facebook, Inc. + * Copyright 2016-present Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,9 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include "Bser.h" -#include + +#include + #include +#include using namespace folly; using folly::io::Cursor; @@ -26,10 +28,11 @@ static dynamic parseBser(Cursor& curs); template [[noreturn]] static void throwDecodeError(Cursor& curs, ARGS&&... args) { - throw BserDecodeError(folly::to(std::forward(args)..., - " with ", - curs.length(), - " bytes remaining in cursor")); + throw BserDecodeError(folly::to( + std::forward(args)..., + " with ", + curs.length(), + " bytes remaining in cursor")); } static int64_t decodeInt(Cursor& curs) { @@ -56,25 +59,29 @@ static std::string decodeString(Cursor& curs) { if (len < 0) { throw std::range_error("string length must not be negative"); } - str.reserve(len); + str.reserve(size_t(len)); - size_t available = curs.length(); + // peekBytes will advance over any "empty" IOBuf elements until + // it reaches the next one with data, so do that to obtain the + // true remaining length. + size_t available = curs.peekBytes().size(); while (available < (size_t)len) { if (available == 0) { // Saw this case when we decodeHeader was returning the incorrect length // and we were splitting off too few bytes from the IOBufQueue - throwDecodeError(curs, - "no data available while decoding a string, header was " - "not decoded properly"); + throwDecodeError( + curs, + "no data available while decoding a string, header was " + "not decoded properly"); } str.append(reinterpret_cast(curs.data()), available); curs.skipAtMost(available); len -= available; - available = curs.length(); + available = curs.peekBytes().size(); } - str.append(reinterpret_cast(curs.data()), len); - curs.skipAtMost(len); + str.append(reinterpret_cast(curs.data()), size_t(len)); + curs.skipAtMost(size_t(len)); return str; } @@ -101,7 +108,7 @@ static dynamic decodeObject(Cursor& curs) { } static dynamic decodeTemplate(Cursor& curs) { - std::vector arr; + dynamic arr = folly::dynamic::array; // List of property names if ((BserType)curs.read() != BserType::Array) { @@ -110,7 +117,6 @@ static dynamic decodeTemplate(Cursor& curs) { auto names = decodeArray(curs); auto size = decodeInt(curs); - arr.reserve(size); while (size-- > 0) { dynamic obj = dynamic::object; @@ -126,10 +132,10 @@ static dynamic decodeTemplate(Cursor& curs) { obj[name.getString()] = parseBser(curs); } - arr.emplace_back(std::move(obj)); + arr.push_back(std::move(obj)); } - return dynamic(std::move(arr)); + return arr; } static dynamic parseBser(Cursor& curs) { @@ -218,8 +224,8 @@ folly::dynamic parseBser(ByteRange str) { folly::dynamic parseBser(StringPiece str) { return parseBser(ByteRange((uint8_t*)str.data(), str.size())); } -} -} +} // namespace bser +} // namespace folly /* vim:ts=2:sw=2:et: */