[Lldb-commits] [PATCH] D51557: Replace uses of LazyBool with LazyBool template

Pavel Labath via Phabricator via lldb-commits lldb-commits at lists.llvm.org
Sat Sep 1 04:44:15 PDT 2018


labath added a comment.

I've been wanting to implement something like this for a long time, so thank you for working on this. :)

In https://reviews.llvm.org/D51557#1221273, @zturner wrote:

> Also I think it doesn't need to be specific to member variables.  We could just have
>
>   template <typename T> class Lazy {
>     std::function<T()> Update;
>     Optional<T> Value;
>   public:
>     LazyValue(std::function<T()> Update) : Update(std::move(Update)) {}
>   };
>


I think the issue with this approach is size. std::function is huge and heap-allocated, whereas this implementation is the same size as `Optional<T>` (which might still be too much for some of our use cases -- in some classes we store a bunch of `needs_update` flags as bitfields to conserve space, which would not be possible here).



================
Comment at: include/lldb/DataFormatters/ValueObjectPrinter.h:138-144
+  bool UpdateShouldPrint();
+  bool UpdateIsNil();
+  bool UpdateIsUnit();
+  bool UpdateIsPtr();
+  bool UpdateIsRef();
+  bool UpdateIsAggregate();
+  bool UpdateIsInstancePtr();
----------------
I wouldn't call these `update` as they don't actually update anything and just return the value. In other parts of the codebase we use `compute` for functions like this.


================
Comment at: include/lldb/DataFormatters/ValueObjectPrinter.h:146
+
+#define LLDB_VOP ValueObjectPrinter
+  LazyBoolMember<LLDB_VOP, &LLDB_VOP::UpdateShouldPrint> m_should_print;
----------------
shafik wrote:
> davide wrote:
> > can you typedef?
> I feel like using ... = is cleaner
I am actually tempted to have a macro which would define all of this boilerplate for you. :D

Something like
```
#define LAZY_MEMBER(Class, Type, Name) \
public: \
  Type get ## Name() { return m_ ## Name.get(*this); } \
private: \
  LazyMember<Type, Class, &Class::compute ## Name> m_ ## Name; \
  Type compute ## Name();
```

Then all that would be left for the user is to define the compute function in the cpp file.


================
Comment at: include/lldb/Utility/Lazy.h:25-28
+  T m_value;
+  bool m_needs_update;
+
+  static_assert(std::is_trivial<T>::value, "Only trivial types are supported.");
----------------
if you use `Optional<T>` instead of hand-rolling the flag here, you could probably get rid of the "trivial type" limitation.


Repository:
  rLLDB LLDB

https://reviews.llvm.org/D51557





More information about the lldb-commits mailing list