Commit graph

66 commits

Author SHA1 Message Date
MarcoFalke
fa940f41ea
Remove unused raw-pointer read helper from univalue 2023-07-27 14:24:52 +02:00
Brotcrunsher
bdea2bb114 scripted-diff: Following the C++ Standard rules for identifiers with _.
Any identifier starting with two _, or one _ followed by a capital letter is reserved for the compiler and thus must not be used. See: https://stackoverflow.com/a/228797/7130273

-BEGIN VERIFY SCRIPT-
s() { git grep -l "$1" src | xargs sed -i "s/$1/$2/g"; }

s '__pushKV' 'pushKVEnd'
s '_EraseTx' 'EraseTxNoLock'
s '_Other' 'Other'
-END VERIFY SCRIPT-
2023-06-20 10:23:08 +02:00
fanquake
436c185b05
Merge bitcoin/bitcoin#27256: refactor: rpc: Remove unnecessary uses of ParseNonRFCJSONValue() and rename it
cfbc8a623b refactor: rpc: hide and rename ParseNonRFCJSONValue() (stickies-v)
6c8bde6d54 test: move coverage on ParseNonRFCJSONValue() to UniValue::read() (stickies-v)

Pull request description:

  Follow-up to https://github.com/bitcoin/bitcoin/pull/26612#issuecomment-1453623741. As per https://github.com/bitcoin/bitcoin/pull/26506#pullrequestreview-1211984059, `ParseNonRFCJSONValue()` is no longer necessary and we can use `UniValue::read()` directly:

  > IIRC before that PR UniValue::read could only parse JSON object and array values, but now it will parse string/number/boolean/null values as well. laanwj pointed this out in https://github.com/bitcoin/bitcoin/issues/9028#issuecomment-257885368

  The implementation of `ParseNonRFCJSONValue()` was already [simplified in #26612](https://github.com/bitcoin/bitcoin/pull/26612/files#diff-84c7a7f36362b9724c31e5dec9879b2f81eae0d0addbc9c0933c3558c577de65R259-R263)  and [test coverage updated](https://github.com/bitcoin/bitcoin/pull/26612/files#diff-fc0f86b6c3bb23b0e983bcf79d7546d1c9eaa15d6e4d8a7b03b5b85955f585abR292-R312) to ensure behaviour didn't change.

  To avoid code duplication, we keep the function to throw on invalid input data but rename it to `Parse()` and remove it from the header.

  The existing test coverage we had on `ParseNonRFCJSONValue()` is moved over to `UniValue::read()`.

ACKs for top commit:
  ryanofsky:
    Code review ACK cfbc8a623b. Only change since last review is adding a new test

Tree-SHA512: 89be959d2353af7ace0c1348ba1600b9ac1d3c7b3cf7f0b59f6e005b7fb9d695ce3e8720e1be3cf77fe7e318a4017c880df108928e7179ec50447583d13bc781
2023-06-02 16:18:11 +01:00
MarcoFalke
faaa60a30e
Remove unused find_value global function 2023-05-09 18:48:10 +02:00
MarcoFalke
fa548ac872
Add UniValue::find_value method 2023-05-09 18:47:14 +02:00
stickies-v
6c8bde6d54
test: move coverage on ParseNonRFCJSONValue() to UniValue::read()
Preparation to deprecate ParseNonRFCJSONValue() but keep test coverage
on the underlying UniValue::read() unaffected. The test coverage on
AmountFromValue is no longer included, since that is already tested
in the rpc_parse_monetary_values test case.

Fuzzing coverage on ParseNonRFCJSONValue() was duplicated between string.cpp
and parse_univalue.cpp, only the one in parse_univalue.cpp is kept.
2023-03-23 18:18:46 +00:00
fanquake
3b88c85025
Merge bitcoin/bitcoin#26612: refactor: RPC: pass named argument value as string_view
545ff924ab refactor: use string_view for RPC named argument values (stickies-v)
7727603e44 refactor: reduce unnecessary complexity in ParseNonRFCJSONValue (stickies-v)
1d02e59901 test: add cases to JSON parsing (stickies-v)

Pull request description:

  Inspired by MarcoFalke's [comment](https://github.com/bitcoin/bitcoin/pull/26506#discussion_r1036149426). Main purpose of this PR is to minimize copying (potentially large) RPC named arguments when calling `.substr()` by using `std::string_view` instead of `std::string`. Furthermore, cleans up the code by removing unnecessary complexity in `ParseNonRFCJSONValue()` (done first to avoid refactoring required to concatenate `string` and `string_view`), updates some naming and adds a few test cases. Should not introduce any behaviour change.

  ## Questions
  - ~Was there actually any merit to `ParseNonRFCJSONValue()` surrounding the value with brackets and then parsing it as an array? I don't see it, and the new approach doesn't fail any tests. Still a bit suspicious about it though.~
    - Cleared up by https://github.com/bitcoin/bitcoin/pull/26506#pullrequestreview-1211984059
    - If there are no objections to 7727603e44, I think we should follow up with a PR to rename `ParseNonRFCJSONValue()` to a local `Parse()` helper function (that throws if invalid), remove it from `client.h` and merge the test coverage we currently have on `ParseNonRFCJSONValue()` with the coverage we have on `UniValue::read()`.

ACKs for top commit:
  ryanofsky:
    Code review ACK 545ff924ab
  MarcoFalke:
    review ACK 545ff924ab 📻

Tree-SHA512: b1c89fb010ac9c3054b023cac1acbba2a539a09cf39a7baffbd7f7571ee268d5a6d98701c7ac10d68a814526e8fd0fe96ac1d1fb072f272033e415b753f64a5c
2023-03-03 15:23:43 +01:00
Hennadii Stepanov
96ee992ac3
clang-tidy: Fix modernize-use-default-member-init in headers
See https://clang.llvm.org/extra/clang-tidy/checks/modernize/use-default-member-init.html
2023-01-31 11:50:10 +00:00
stickies-v
545ff924ab
refactor: use string_view for RPC named argument values
Minimize copying RPC named argument values when calling .substr() by
using std::string_view instead of std::string.
2023-01-18 17:08:58 +00:00
Hennadii Stepanov
306ccd4927
scripted-diff: Bump copyright headers
-BEGIN VERIFY SCRIPT-
./contrib/devtools/copyright_header.py update ./
-END VERIFY SCRIPT-

Commits of previous years:
- 2021: f47dda2c58
- 2020: fa0074e2d8
- 2019: aaaaad6ac9
2022-12-24 23:49:50 +00:00
Ryan Ofsky
293849a260 univalue: Remove confusing getBool method
Drop UniValue::getBool method because it is easy to confuse with the
UniValue::get_bool method, and could potentially cause bugs. Unlike get_bool,
getBool doesn't ensure that the value is a boolean and returns false for all
integer, string, array, and object values instead of throwing an exceptions.

The getBool method is also redundant because it is an alias for isTrue. There
were only 5 getBool() calls in the codebase, so this commit replaces them with
isTrue() or get_bool() calls as appropriate.

These changes were originally made by MarcoFalke in
https://github.com/bitcoin/bitcoin/pull/26213 but were dropped to limit the
scope of that PR.

Co-authored-by: MarcoFalke <*~=`'#}+{/-|&$^_@721217.xyz>
2022-12-09 10:03:26 -05:00
MacroFake
59e00c7e03
Merge bitcoin/bitcoin#25714: univalue: Avoid std::string copies
fa09525751 univalue: string_view test (MacroFake)
1111c7e3f1 univalue: Avoid std::string copies (MacroFake)

Pull request description:

  This shouldn't matter too much, unless a really large string is pushed into a json struct, but I think it also clarifies the code.

ACKs for top commit:
  martinus:
    Code review ACK fa09525751
  aureleoules:
    reACK fa09525751
  ryanofsky:
    Code review ACK fa09525751

Tree-SHA512: 74c441912bd0b00cdb9ea7890121f71ae5d62a7594e7d29aa402c9e3f033710c5d3afb27a37c552e6513804b249aa37e375ce013a3db853a25d1fd7b6e6cd3a8
2022-11-14 10:17:54 +01:00
MacroFake
fa09525751
univalue: string_view test 2022-11-07 09:41:19 +01:00
furszy
55566630c6
rpc: treat univalue type check error as RPC_TYPE_ERROR, not RPC_MISC_ERROR
By throwing a custom exception from `Univalue::checkType` (instead of a plain
std::runtime_error) and catching it on the RPC server request handler.

So we properly return RPC_TYPE_ERROR (-3) on arg type errors and
not the general RPC_MISC_ERROR (-1).
2022-09-15 10:24:53 -03:00
MacroFake
1111c7e3f1
univalue: Avoid std::string copies 2022-09-05 14:24:14 +02:00
MacroFake
faad673716
Fix issues when calling std::move(const&) 2022-08-20 09:32:53 +02:00
MacroFake
fa7bef2e80
univalue: Remove unused and confusing set*() return value 2022-07-29 15:24:42 +02:00
fanquake
73a0d6d0d4
Merge bitcoin/bitcoin#25611: univalue: Avoid brittle, narrowing and verbose integral type confusions
fa23c19750 univalue: Avoid narrowing and verbose int constructors (MacroFake)
fa3a9a1e8d rpc: Select int-UniValue constructor for enum value in upgradewallet RPC (MacroFake)

Pull request description:

  As UniValue provides several constructors for integral types, the
  compiler is unable to select one if the passed type does not exactly
  match. This is unintuitive for developers and forces them to write
  verbose and brittle code. (Refer to `-Wnarrowing` compiler warning)

  For example, there are many places where an unsigned int is cast to a
  signed int. While the cast is safe in practice, it is still needlessly
  verbose and confusing as the value can never be negative. In fact it
  might even be unsafe if the unsigned value is large enough to map to a
  negative signed one.

  Fix this issue and other (minor) type issues.

ACKs for top commit:
  aureleoules:
    ACK fa23c19750.

Tree-SHA512: 7d99b5b90c7d8eed2e3448167255a59e817dd6b8fcfc1b17c69ddefd0db33d1bf4344fbcd8b7f8685b58182c0f572ab9ffa99467afa666ac21843df7ea645033
2022-07-25 15:12:41 +01:00
MacroFake
fae5ce8795
univalue: Return more detailed type check error messages 2022-07-18 11:31:36 +02:00
MacroFake
fafab147e7
move-only: Move UniValue::getInt definition to keep class with definitions only
Can be reviewed with the git options

--color-moved=dimmed-zebra --color-moved-ws=ignore-all-space
2022-07-18 10:37:00 +02:00
fanquake
1f0c83f430
refactor: remove BOOST_*_TEST_ macros 2022-07-18 09:15:18 +01:00
fanquake
70d807c355
refactor: integrate no_nul into univalue unitester 2022-07-18 09:15:18 +01:00
fanquake
98a0ae6b24
doc: remove references to downstream
Having references to downstream no-longer make sense now that we've
unsubtree'd.
2022-07-18 09:15:18 +01:00
MacroFake
fa23c19750
univalue: Avoid narrowing and verbose int constructors
As UniValue provides several constructors for integral types, the
compiler is unable to select one if the passed type does not exactly
match. This is unintuitive for developers and forces them to write
verbose and brittle code.

For example, there are many places where an unsigned int is cast to a
signed int. While the cast is safe in practice, it is still needlessly
verbose and confusing as the value can never be negative. In fact it
might even be unsafe if the unsigned value is large enough to map to a
negative signed one.
2022-07-14 12:20:50 +02:00
MacroFake
fa277cd55d
univalue: Throw exception on invalid pushes over silent ignore 2022-07-13 18:05:39 +02:00
MacroFake
fa8a1c0696
rpc: Fix Univalue push_backV OOM in listtransactions 2022-06-24 08:45:44 +02:00
fanquake
d873ff96e5
refactor: cleanups post unsubtree'ing univalue
Mostly changes to remove src/univalue exceptions from the various linters,
and the required code changes to make them happy. As well as minor doc
changes.
2022-06-15 12:56:44 +01:00
fanquake
e2aa7047f9
refactor: un-subtree univalue
Remove all the files we don't use.
This should not change behavior, or anything at all, as none of these
files are currently used in our build system.
2022-06-15 09:32:41 +01:00
MacroFake
fa0cc61b7f
Bump univalue subtree 2022-05-30 16:42:13 +02:00
MacroFake
fac2c796cb
Bump univalue subtree 2022-05-12 11:52:28 +02:00
fanquake
3043193675
Update univalue subtree to latest upstream 2021-10-11 20:45:56 +08:00
MarcoFalke
fa17eef627
Update univalue subtree 2020-11-19 15:48:24 +01:00
MarcoFalke
fad9ea8fdb
Update univalue subtree 2020-02-09 07:44:29 -08:00
MarcoFalke
fa439e88af
Update univalue subtree 2019-10-30 16:24:02 -04:00
MarcoFalke
faad55a9a2
Update univalue subtree 2018-09-07 08:21:14 -04:00
MarcoFalke
fa1388edb1
univalue: Bump subtree 2018-02-10 09:55:54 -05:00
MarcoFalke
fad349c507 univalue: Bump subtree 2017-12-19 16:44:57 -05:00
MarcoFalke
faaeeb0d3e Bump univalue and fix json formatting in tests
This merge commit bumps the univalue subtree and also updates the whitespace
for some failing tests.
2017-09-29 14:35:46 +02:00
practicalswift
64fb0ac016 Declare single-argument (non-converting) constructors "explicit"
In order to avoid unintended implicit conversions.
2017-08-16 16:33:25 +02:00
MarcoFalke
e757115164 Merge commit '2ca7faab4205822b06dc2ab2bbda0a9a70fce7e0' into HEAD 2016-09-30 19:58:11 +02:00
MarcoFalke
9bf41af708 Merge commit '3650668cdbbf369dd8f30c8e8eb5bb883325942d' into HEAD 2016-09-25 15:19:23 +02:00
Wladimir J. van der Laan
63151521fd Merge commit '60ab9b200654ef0914459711cf2b22be16be3dc2' 2016-06-10 15:19:51 +02:00
MarcoFalke
fad4ea836d Merge commit '982709199f1b4e9e35211c419a81938f9f1dd4ed' into bitcoin 2015-12-02 12:28:48 +01:00
MarcoFalke
31f4ba97b7 Merge commit '313e7f5c89d6e72e06efe9255089765b4c5815fe' into HEAD 2015-10-09 11:37:00 +02:00
Jonas Schnelli
6e16a41313 Merge commit '2f9f082b5ef3c495c70598ef23383effef675f9a' as 'src/univalue' 2015-10-01 10:37:19 +02:00
Jonas Schnelli
0917306fdf remove univalue, prepare for subtree 2015-10-01 10:36:50 +02:00
Daniel Kraft
e938122b7b Stop parsing JSON after first finished construct.
Fix https://github.com/bitcoin/bitcoin/issues/6558.  In particular, stop
parsing JSON after the first object or array is finished.  Check that no
other garbage follows, and fail the parser if it does.
2015-08-20 12:48:43 +02:00
Wladimir J. van der Laan
7650449a67 univalue: Avoid unnecessary roundtrip through double for numbers
JSON makes no distinction between numbers and reals, and our code
doesn't need to do so either.

This removes VREAL, as well as its specific post-processing in
`UniValue::write`. Non-monetary amounts do not need to be forcibly
formatted with 8 decimals, so the extra roundtrip was unnecessary
(and potentially loses precision).
2015-07-18 09:04:18 +02:00
Jonas Schnelli
77aeb7c964 UniValue: don't escape solidus, keep espacing of reverse solidus 2015-06-25 08:10:08 +02:00
Daniel Kraft
0cc7b2352e Fix univalue handling of \u0000 characters.
Univalue's parsing of \u escape sequences did not handle NUL characters
correctly.  They were, effectively, dropped.  The extended test-case
fails with the old code, and is fixed with this patch.
2015-06-11 12:09:05 +02:00