While working on this PR #18570 I ran into a bit confusing situation where in one function a CWallet reference was expected while two others dealt with CWallet pointers. My initial reaction was: let's harmonize them by making them references
. However, not being part of the PR itself I did’t change anything and completed the PR first.
Now, after having analyzed the rpcwallet.cpp
code I came to the conclusion that:
- converting them all into references is not the solution as they’re originally shared_ptrs
- but also: there is no (visible) reason why every RPC function should begin like this:
0std::shared_ptr<CWallet> const pwallet = GetWalletForJSONRPCRequest(request);
1const CWallet* const pwallet = wallet.get();
This clearly defeats the purpose of shared pointers for no obvious reason. Maybe I am missing something?
In my (unpublished) code changes all raw pointers got replaced with shared_ptrs but kept their original names (that is, pwallet). In the end, they’re pointers too, so the most of the original code remained untouched.
However, some of the helper functions couldn’t be changed because external code is accessing them and I didn’t want to make this task “virulent”. So I introduced new (“Ref”) variants that expect shared_ptr parameters, namely:
0void EnsureWalletRefIsUnlocked(const std::shared_ptr<CWallet>);
1bool EnsureWalletRefIsAvailable(const std::shared_ptr<CWallet>, bool avoidException);
I have tested the code, with python and boost-tests, and could not find any errors. But before opening a PR I would like to open a discussion about this.
Is there any reason to keep on working with raw pointers when every function call actually begins with shared_ptrs?
Regards,