mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 06:38:20 +00:00
Refactor CompHash class to use new HashKey buffering features
This preserves the previous hash key buffer layout (so the testsuite still passes) and overall approach but gets rid of the codepath for writing singleton serializations. This code path required a fourth switch block over all types (besides reads, writes, and size computation) and was inconsistent with the one for writing non-atomic types.
This commit is contained in:
parent
b6a11a69db
commit
4d58b98c70
2 changed files with 611 additions and 808 deletions
|
@ -24,7 +24,6 @@ class CompositeHash
|
|||
{
|
||||
public:
|
||||
explicit CompositeHash(TypeListPtr composite_type);
|
||||
~CompositeHash();
|
||||
|
||||
// Compute the hash corresponding to the given index val,
|
||||
// or nullptr if it fails to typecheck.
|
||||
|
@ -37,65 +36,33 @@ public:
|
|||
"GHI-572.")]] unsigned int
|
||||
MemoryAllocation() const
|
||||
{
|
||||
return padded_sizeof(*this) + util::pad_size(size);
|
||||
return padded_sizeof(*this);
|
||||
}
|
||||
|
||||
protected:
|
||||
std::unique_ptr<HashKey> ComputeSingletonHash(const Val* v, bool type_check) const;
|
||||
|
||||
// Computes the piece of the hash for Val*, returning the new kp.
|
||||
// Used as a helper for ComputeHash in the non-singleton case.
|
||||
char* SingleValHash(bool type_check, char* kp, Type* bt, Val* v, bool optional) const;
|
||||
bool SingleValHash(HashKey& hk, const Val* v, Type* bt, bool type_check, bool optional,
|
||||
bool singleton) const;
|
||||
|
||||
// Recovers just one Val of possibly many; called from RecoverVals.
|
||||
// Upon return, pval will point to the recovered Val of type t.
|
||||
// Returns and updated kp for the next Val. Calls reporter->InternalError()
|
||||
// upon errors, so there is no return value for invalid input.
|
||||
const char* RecoverOneVal(const HashKey& k, const char* kp, const char* const k_end, Type* t,
|
||||
ValPtr* pval, bool optional) const;
|
||||
|
||||
// Rounds the given pointer up to the nearest multiple of the
|
||||
// given size, if not already a multiple.
|
||||
const void* Align(const char* ptr, unsigned int size) const;
|
||||
|
||||
// Rounds the given pointer up to the nearest multiple of the
|
||||
// given size, padding the skipped region with 0 bytes.
|
||||
void* AlignAndPad(char* ptr, unsigned int size) const;
|
||||
|
||||
// Returns offset+size rounded up so it can correctly align data
|
||||
// of the given size.
|
||||
int SizeAlign(int offset, unsigned int size) const;
|
||||
|
||||
template <class T> T* AlignAndPadType(char* ptr) const
|
||||
{
|
||||
return reinterpret_cast<T*>(AlignAndPad(ptr, sizeof(T)));
|
||||
}
|
||||
|
||||
template <class T> const T* AlignType(const char* ptr) const
|
||||
{
|
||||
return reinterpret_cast<const T*>(Align(ptr, sizeof(T)));
|
||||
}
|
||||
|
||||
template <class T> int SizeAlignType(int offset) const { return SizeAlign(offset, sizeof(T)); }
|
||||
bool RecoverOneVal(const HashKey& k, Type* t, ValPtr* pval, bool optional,
|
||||
bool singleton) const;
|
||||
|
||||
// Compute the size of the composite key. If v is non-nil then
|
||||
// the value is computed for the particular list of values.
|
||||
// Returns 0 if the key has an indeterminant size (if v not given),
|
||||
// or if v doesn't match the index type (if given).
|
||||
int ComputeKeySize(const Val* v, bool type_check, bool calc_static_size) const;
|
||||
bool ReserveKeySize(HashKey& hk, const Val* v, bool type_check, bool calc_static_size) const;
|
||||
|
||||
int SingleTypeKeySize(Type*, const Val*, bool type_check, int sz, bool optional,
|
||||
bool calc_static_size) const;
|
||||
bool ReserveSingleTypeKeySize(HashKey& hk, Type*, const Val* v, bool type_check, bool optional,
|
||||
bool calc_static_size, bool singleton) const;
|
||||
|
||||
bool EnsureTypeReserve(HashKey& hk, const Val* v, Type* bt, bool type_check) const;
|
||||
|
||||
TypeListPtr type;
|
||||
char* key; // space for composite key
|
||||
int size;
|
||||
bool is_singleton; // if just one type in index
|
||||
|
||||
// If one type, but not normal "singleton", e.g. record.
|
||||
bool is_complex_type;
|
||||
|
||||
InternalTypeTag singleton_tag;
|
||||
bool is_singleton = false; // if just one type in index
|
||||
};
|
||||
|
||||
} // namespace zeek::detail
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue