X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2Fjson.cpp;h=63fa2ba08dc7236577d73de4e781f04be132ce3c;hb=29169ddf26a342fd9a77c1f548e442c59b7a2569;hp=4c856598e123bc61a1a8ea8760fdf69ddbf14fdc;hpb=a3bfe5b0fb2be9b21acd75c7d9fe825d248b105f;p=folly.git diff --git a/folly/json.cpp b/folly/json.cpp index 4c856598..63fa2ba0 100644 --- a/folly/json.cpp +++ b/folly/json.cpp @@ -470,8 +470,10 @@ dynamic parseArray(Input& in) { dynamic parseNumber(Input& in) { bool const negative = (*in == '-'); - if (negative) { - if (in.consume("-Infinity")) { + if (negative && in.consume("-Infinity")) { + if (in.getOpts().parse_numbers_as_strings) { + return "-Infinity"; + } else { return -std::numeric_limits::infinity(); } } @@ -487,6 +489,11 @@ dynamic parseNumber(Input& in) { constexpr const char* minInt = "9223372036854775808"; constexpr auto maxIntLen = __builtin_strlen(maxInt); + + if (*in != '.' && !wasE && in.getOpts().parse_numbers_as_strings) { + return integral; + } + if (*in != '.' && !wasE) { if (LIKELY(!in.getOpts().double_fallback || integral.size() < maxIntLen) || (integral.size() == maxIntLen && @@ -511,7 +518,9 @@ dynamic parseNumber(Input& in) { end = expPart.end(); } auto fullNum = range(integral.begin(), end); - + if (in.getOpts().parse_numbers_as_strings) { + return fullNum; + } auto val = to(fullNum); return val; } @@ -626,8 +635,12 @@ dynamic parseValue(Input& in) { in.consume("true") ? true : in.consume("false") ? false : in.consume("null") ? nullptr : - in.consume("Infinity") ? std::numeric_limits::infinity() : - in.consume("NaN") ? std::numeric_limits::quiet_NaN() : + in.consume("Infinity") ? + (in.getOpts().parse_numbers_as_strings ? (dynamic)"Infinity" : + (dynamic)std::numeric_limits::infinity()) : + in.consume("NaN") ? + (in.getOpts().parse_numbers_as_strings ? (dynamic)"NaN" : + (dynamic)std::numeric_limits::quiet_NaN()) : in.error("expected json value"); }