From 2ac48ff1d4de309214fc291d07e7bde2578013c6 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:12:23 +0100 Subject: [PATCH 01/12] Obj: make `no_location` constexpr This ensures that the variable is initialized at compile time and may allow the compiler to apply more initializations. --- src/Obj.cc | 1 - src/Obj.h | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Obj.cc b/src/Obj.cc index 91a9349d46..61ce530e08 100644 --- a/src/Obj.cc +++ b/src/Obj.cc @@ -10,7 +10,6 @@ #include "File.h" #include "plugin/Manager.h" -Location no_location("", 0, 0, 0, 0); Location start_location("", 0, 0, 0, 0); Location end_location("", 0, 0, 0, 0); diff --git a/src/Obj.h b/src/Obj.h index cc66274598..5652c8438c 100644 --- a/src/Obj.h +++ b/src/Obj.h @@ -31,7 +31,7 @@ typedef Location yyltype; YYLTYPE GetCurrentLocation(); // Used to mean "no location associated with this object". -extern Location no_location; +inline constexpr Location no_location("", 0, 0, 0, 0); // Current start/end location. extern Location start_location; From 97f07fa7279a5e67c58aea248163d74d75f2843b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:02:26 +0100 Subject: [PATCH 02/12] Obj: use C++ initializers --- src/Obj.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Obj.h b/src/Obj.h index 5652c8438c..9920e5c588 100644 --- a/src/Obj.h +++ b/src/Obj.h @@ -53,9 +53,6 @@ class BroObj { public: BroObj() { - ref_cnt = 1; - notify_plugins = false; - // A bit of a hack. We'd like to associate location // information with every object created when parsing, // since for them, the location is generally well-defined. @@ -141,8 +138,8 @@ private: friend inline void Ref(BroObj* o); friend inline void Unref(BroObj* o); - bool notify_plugins; - int ref_cnt; + bool notify_plugins = false; + int ref_cnt = 1; // If non-zero, do not print runtime errors. Useful for // speculative evaluation. From 4e438bf4224b3efef67b78d182761015ba8d0bf4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:16:17 +0100 Subject: [PATCH 03/12] Obj: disallow copying BroObj Copying a BroObj is dangerous, and should only be done with dedicated (virtual) methods which are implemented by all derived classes. This commit avoids unintentional copies. --- src/Obj.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Obj.h b/src/Obj.h index 9920e5c588..c175459a5d 100644 --- a/src/Obj.h +++ b/src/Obj.h @@ -73,6 +73,10 @@ public: virtual ~BroObj(); + /* disallow copying */ + BroObj(const BroObj &) = delete; + BroObj &operator=(const BroObj &) = delete; + // Report user warnings/errors. If obj2 is given, then it's // included in the message, though if pinpoint_only is non-zero, // then obj2 is only used to pinpoint the location. From 411d048d24c24fce284b7b250b8e1d72590fea8f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Feb 2020 11:36:28 +0100 Subject: [PATCH 04/12] Type: remove useless BroType destructor --- src/Type.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Type.h b/src/Type.h index 4ea3caf318..15f17d6ecf 100644 --- a/src/Type.h +++ b/src/Type.h @@ -83,7 +83,6 @@ const int MATCHES_INDEX_VECTOR = 2; class BroType : public BroObj { public: explicit BroType(TypeTag tag, bool base_type = false); - ~BroType() override { } // Performs a shallow clone operation of the Bro type. // This especially means that especially for tables the types From 5b8bd26c7298be97cb905c513cf7b801b8754bdc Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:58:06 +0100 Subject: [PATCH 05/12] Type: move code from BroType::BroType() to constexpr functions Prepare to inline the constructor, which will one day be `constexpr` (requires moving the `std::string name` field somewhere else). --- src/Type.cc | 63 ++--------------------------------------------------- src/Type.h | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/Type.cc b/src/Type.cc index f9bb36db01..75f414eeda 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -63,68 +63,9 @@ const char* type_name(TypeTag t) BroType::BroType(TypeTag t, bool arg_base_type) { tag = t; - is_network_order = 0; + is_network_order = ::is_network_order(t); base_type = arg_base_type; - - switch ( tag ) { - case TYPE_VOID: - internal_tag = TYPE_INTERNAL_VOID; - break; - - case TYPE_BOOL: - case TYPE_INT: - case TYPE_ENUM: - internal_tag = TYPE_INTERNAL_INT; - break; - - case TYPE_COUNT: - case TYPE_COUNTER: - internal_tag = TYPE_INTERNAL_UNSIGNED; - break; - - case TYPE_PORT: - internal_tag = TYPE_INTERNAL_UNSIGNED; - is_network_order = 1; - break; - - case TYPE_DOUBLE: - case TYPE_TIME: - case TYPE_INTERVAL: - internal_tag = TYPE_INTERNAL_DOUBLE; - break; - - case TYPE_STRING: - internal_tag = TYPE_INTERNAL_STRING; - break; - - case TYPE_ADDR: - internal_tag = TYPE_INTERNAL_ADDR; - break; - - case TYPE_SUBNET: - internal_tag = TYPE_INTERNAL_SUBNET; - break; - - case TYPE_PATTERN: - case TYPE_TIMER: - case TYPE_ANY: - case TYPE_TABLE: - case TYPE_UNION: - case TYPE_RECORD: - case TYPE_LIST: - case TYPE_FUNC: - case TYPE_FILE: - case TYPE_OPAQUE: - case TYPE_VECTOR: - case TYPE_TYPE: - internal_tag = TYPE_INTERNAL_OTHER; - break; - - case TYPE_ERROR: - internal_tag = TYPE_INTERNAL_ERROR; - break; - } - + internal_tag = to_internal_type_tag(tag); } BroType* BroType::ShallowClone() diff --git a/src/Type.h b/src/Type.h index 15f17d6ecf..e46c050395 100644 --- a/src/Type.h +++ b/src/Type.h @@ -44,6 +44,11 @@ typedef enum { #define NUM_TYPES (int(TYPE_ERROR) + 1) } TypeTag; +constexpr bool is_network_order(TypeTag tag) noexcept + { + return tag == TYPE_PORT; + } + typedef enum { FUNC_FLAVOR_FUNCTION, FUNC_FLAVOR_EVENT, @@ -57,6 +62,60 @@ typedef enum { TYPE_INTERNAL_OTHER, TYPE_INTERNAL_ERROR } InternalTypeTag; +constexpr InternalTypeTag to_internal_type_tag(TypeTag tag) noexcept + { + switch ( tag ) { + case TYPE_VOID: + return TYPE_INTERNAL_VOID; + + case TYPE_BOOL: + case TYPE_INT: + case TYPE_ENUM: + return TYPE_INTERNAL_INT; + + case TYPE_COUNT: + case TYPE_COUNTER: + return TYPE_INTERNAL_UNSIGNED; + + case TYPE_PORT: + return TYPE_INTERNAL_UNSIGNED; + + case TYPE_DOUBLE: + case TYPE_TIME: + case TYPE_INTERVAL: + return TYPE_INTERNAL_DOUBLE; + + case TYPE_STRING: + return TYPE_INTERNAL_STRING; + + case TYPE_ADDR: + return TYPE_INTERNAL_ADDR; + + case TYPE_SUBNET: + return TYPE_INTERNAL_SUBNET; + + case TYPE_PATTERN: + case TYPE_TIMER: + case TYPE_ANY: + case TYPE_TABLE: + case TYPE_UNION: + case TYPE_RECORD: + case TYPE_LIST: + case TYPE_FUNC: + case TYPE_FILE: + case TYPE_OPAQUE: + case TYPE_VECTOR: + case TYPE_TYPE: + return TYPE_INTERNAL_OTHER; + + case TYPE_ERROR: + return TYPE_INTERNAL_ERROR; + } + + /* this should be unreachable */ + return TYPE_INTERNAL_VOID; + } + // Returns the name of the type. extern const char* type_name(TypeTag t); From b1fe483b05dcc774ed56e899aa0885795f8508af Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Feb 2020 12:48:35 +0100 Subject: [PATCH 06/12] Type: use C++ initializers --- src/Type.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Type.cc b/src/Type.cc index 75f414eeda..2d819296c8 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -61,11 +61,10 @@ const char* type_name(TypeTag t) } BroType::BroType(TypeTag t, bool arg_base_type) + :tag(t), internal_tag(to_internal_type_tag(tag)), + is_network_order(::is_network_order(t)), + base_type(arg_base_type) { - tag = t; - is_network_order = ::is_network_order(t); - base_type = arg_base_type; - internal_tag = to_internal_type_tag(tag); } BroType* BroType::ShallowClone() From e3c0da2e15014e1e63aad8c63cafe41bd1c2025c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Feb 2020 12:51:40 +0100 Subject: [PATCH 07/12] Type: remove unnecessary enum typedefs --- src/Type.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Type.h b/src/Type.h index e46c050395..f81f0e7790 100644 --- a/src/Type.h +++ b/src/Type.h @@ -14,7 +14,7 @@ // BRO types. -typedef enum { +enum TypeTag { TYPE_VOID, // 0 TYPE_BOOL, // 1 TYPE_INT, // 2 @@ -42,25 +42,25 @@ typedef enum { TYPE_TYPE, // 24 TYPE_ERROR // 25 #define NUM_TYPES (int(TYPE_ERROR) + 1) -} TypeTag; +}; constexpr bool is_network_order(TypeTag tag) noexcept { return tag == TYPE_PORT; } -typedef enum { +enum function_flavor { FUNC_FLAVOR_FUNCTION, FUNC_FLAVOR_EVENT, FUNC_FLAVOR_HOOK -} function_flavor; +}; -typedef enum { +enum InternalTypeTag { TYPE_INTERNAL_VOID, TYPE_INTERNAL_INT, TYPE_INTERNAL_UNSIGNED, TYPE_INTERNAL_DOUBLE, TYPE_INTERNAL_STRING, TYPE_INTERNAL_ADDR, TYPE_INTERNAL_SUBNET, TYPE_INTERNAL_OTHER, TYPE_INTERNAL_ERROR -} InternalTypeTag; +}; constexpr InternalTypeTag to_internal_type_tag(TypeTag tag) noexcept { From 99f1804c62fa78a9480d5c28829f4ff377951a4c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:24:52 +0100 Subject: [PATCH 08/12] Val: remove the unnecessary BroValUnion typedef --- src/Val.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Val.h b/src/Val.h index 79172c3f55..38b87bdfb4 100644 --- a/src/Val.h +++ b/src/Val.h @@ -61,7 +61,7 @@ class TableEntryVal; class RE_Matcher; -typedef union { +union BroValUnion { // Used for bool, int, enum. bro_int_t int_val; @@ -86,7 +86,7 @@ typedef union { vector* vector_val; -} BroValUnion; +}; class Val : public BroObj { public: From 74f93091e6d7a9a586bcabec8d9698239e5f6652 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Feb 2020 13:12:02 +0100 Subject: [PATCH 09/12] Val: remove unused default constructors and `friend` declarations --- src/Val.h | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/Val.h b/src/Val.h index 38b87bdfb4..8fe62dc64d 100644 --- a/src/Val.h +++ b/src/Val.h @@ -479,9 +479,7 @@ public: static uint32_t Mask(uint32_t port_num, TransportProto port_type); protected: - friend class Val; friend class ValManager; - PortVal() {} PortVal(uint32_t p); void ValDescribe(ODesc* d) const override; @@ -504,11 +502,6 @@ public: unsigned int MemoryAllocation() const override; protected: - friend class Val; - AddrVal() {} - explicit AddrVal(TypeTag t) : Val(t) { } - explicit AddrVal(BroType* t) : Val(t) { } - Val* DoClone(CloneState* state) override; }; @@ -533,9 +526,6 @@ public: unsigned int MemoryAllocation() const override; protected: - friend class Val; - SubNetVal() {} - void ValDescribe(ODesc* d) const override; Val* DoClone(CloneState* state) override; }; @@ -566,9 +556,6 @@ public: Val* Substitute(RE_Matcher* re, StringVal* repl, bool do_all); protected: - friend class Val; - StringVal() {} - void ValDescribe(ODesc* d) const override; Val* DoClone(CloneState* state) override; }; @@ -585,9 +572,6 @@ public: unsigned int MemoryAllocation() const override; protected: - friend class Val; - PatternVal() {} - void ValDescribe(ODesc* d) const override; Val* DoClone(CloneState* state) override; }; @@ -630,9 +614,6 @@ public: unsigned int MemoryAllocation() const override; protected: - friend class Val; - ListVal() {} - Val* DoClone(CloneState* state) override; val_list vals; @@ -819,9 +800,6 @@ public: notifier::Modifiable* Modifiable() override { return this; } protected: - friend class Val; - TableVal() {} - void Init(TableType* t); void CheckExpireAttr(attr_tag at); @@ -925,9 +903,6 @@ public: static void ResizeParseTimeRecords(); protected: - friend class Val; - RecordVal() {} - Val* DoClone(CloneState* state) override; BroObj* origin; @@ -948,8 +923,6 @@ protected: val.int_val = i; } - EnumVal() {} - void ValDescribe(ODesc* d) const override; Val* DoClone(CloneState* state) override; }; @@ -1012,9 +985,6 @@ public: bool Remove(unsigned int index); protected: - friend class Val; - VectorVal() { } - void ValDescribe(ODesc* d) const override; Val* DoClone(CloneState* state) override; From 5d58dbbd2e7ca3168a6193dde952347d6b03e459 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 8 Feb 2020 13:04:49 +0100 Subject: [PATCH 10/12] Val: reduce duplicate code by using delegating constructors --- src/Val.cc | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/src/Val.cc b/src/Val.cc index 595c208f8a..f88b4a90c9 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -828,9 +828,8 @@ AddrVal::AddrVal(const char* text) : Val(TYPE_ADDR) val.addr_val = new IPAddr(text); } -AddrVal::AddrVal(const std::string& text) : Val(TYPE_ADDR) +AddrVal::AddrVal(const std::string& text) : AddrVal(text.c_str()) { - val.addr_val = new IPAddr(text); } AddrVal::AddrVal(uint32_t addr) : Val(TYPE_ADDR) @@ -886,16 +885,12 @@ SubNetVal::SubNetVal(const char* text, int width) : Val(TYPE_SUBNET) val.subnet_val = new IPPrefix(text, width); } -SubNetVal::SubNetVal(uint32_t addr, int width) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(uint32_t addr, int width) : SubNetVal(IPAddr{IPv4, &addr, IPAddr::Network}, width) { - IPAddr a(IPv4, &addr, IPAddr::Network); - val.subnet_val = new IPPrefix(a, width); } -SubNetVal::SubNetVal(const uint32_t* addr, int width) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(const uint32_t* addr, int width) : SubNetVal(IPAddr{IPv6, addr, IPAddr::Network}, width) { - IPAddr a(IPv6, addr, IPAddr::Network); - val.subnet_val = new IPPrefix(a, width); } SubNetVal::SubNetVal(const IPAddr& addr, int width) : Val(TYPE_SUBNET) @@ -984,20 +979,17 @@ StringVal::StringVal(BroString* s) : Val(TYPE_STRING) val.string_val = s; } -StringVal::StringVal(int length, const char* s) : Val(TYPE_STRING) +// The following adds a NUL at the end. +StringVal::StringVal(int length, const char* s) : StringVal(new BroString((const u_char*) s, length, 1)) { - // The following adds a NUL at the end. - val.string_val = new BroString((const u_char*) s, length, 1); } -StringVal::StringVal(const char* s) : Val(TYPE_STRING) +StringVal::StringVal(const char* s) : StringVal(new BroString(s)) { - val.string_val = new BroString(s); } -StringVal::StringVal(const string& s) : Val(TYPE_STRING) +StringVal::StringVal(const string& s) : StringVal(s.length(), s.data()) { - val.string_val = new BroString(reinterpret_cast(s.data()), s.length(), 1); } Val* StringVal::SizeVal() const From 4a5473c57254b9aa10170ba298d6acee299e527b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:25:07 +0100 Subject: [PATCH 11/12] Val: add BroValUnion constructors Allows using C++ initializers. --- src/Val.cc | 36 ++++++++++------------------ src/Val.h | 70 +++++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 68 insertions(+), 38 deletions(-) diff --git a/src/Val.cc b/src/Val.cc index f88b4a90c9..94bdb9ec5e 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -38,8 +38,8 @@ #include "threading/formatters/JSON.h" Val::Val(Func* f) + :val(f) { - val.func_val = f; ::Ref(val.func_val); type = f->FType()->Ref(); #ifdef DEBUG @@ -48,13 +48,12 @@ Val::Val(Func* f) } Val::Val(BroFile* f) + :val(f) { static FileType* string_file_type = 0; if ( ! string_file_type ) string_file_type = new FileType(base_type(TYPE_STRING)); - val.file_val = f; - assert(f->FType()->Tag() == TYPE_STRING); type = string_file_type->Ref(); @@ -771,9 +770,8 @@ uint32_t PortVal::Mask(uint32_t port_num, TransportProto port_type) return port_num; } -PortVal::PortVal(uint32_t p) : Val(TYPE_PORT) +PortVal::PortVal(uint32_t p) : Val(bro_uint_t(p), TYPE_PORT) { - val.uint_val = static_cast(p); } uint32_t PortVal::Port() const @@ -823,29 +821,25 @@ Val* PortVal::DoClone(CloneState* state) return Ref(); } -AddrVal::AddrVal(const char* text) : Val(TYPE_ADDR) +AddrVal::AddrVal(const char* text) : Val(new IPAddr(text), TYPE_ADDR) { - val.addr_val = new IPAddr(text); } AddrVal::AddrVal(const std::string& text) : AddrVal(text.c_str()) { } -AddrVal::AddrVal(uint32_t addr) : Val(TYPE_ADDR) +AddrVal::AddrVal(uint32_t addr) : Val(new IPAddr(IPv4, &addr, IPAddr::Network), TYPE_ADDR) { // ### perhaps do gethostbyaddr here? - val.addr_val = new IPAddr(IPv4, &addr, IPAddr::Network); } -AddrVal::AddrVal(const uint32_t addr[4]) : Val(TYPE_ADDR) +AddrVal::AddrVal(const uint32_t addr[4]) : Val(new IPAddr(IPv6, addr, IPAddr::Network), TYPE_ADDR) { - val.addr_val = new IPAddr(IPv6, addr, IPAddr::Network); } -AddrVal::AddrVal(const IPAddr& addr) : Val(TYPE_ADDR) +AddrVal::AddrVal(const IPAddr& addr) : Val(new IPAddr(addr), TYPE_ADDR) { - val.addr_val = new IPAddr(addr); } AddrVal::~AddrVal() @@ -872,17 +866,14 @@ Val* AddrVal::DoClone(CloneState* state) return Ref(); } -SubNetVal::SubNetVal(const char* text) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(const char* text) : Val(new IPPrefix(), TYPE_SUBNET) { - val.subnet_val = new IPPrefix(); - if ( ! IPPrefix::ConvertString(text, val.subnet_val) ) reporter->Error("Bad string in SubNetVal ctor: %s", text); } -SubNetVal::SubNetVal(const char* text, int width) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(const char* text, int width) : Val(new IPPrefix(text, width), TYPE_SUBNET) { - val.subnet_val = new IPPrefix(text, width); } SubNetVal::SubNetVal(uint32_t addr, int width) : SubNetVal(IPAddr{IPv4, &addr, IPAddr::Network}, width) @@ -893,14 +884,12 @@ SubNetVal::SubNetVal(const uint32_t* addr, int width) : SubNetVal(IPAddr{IPv6, a { } -SubNetVal::SubNetVal(const IPAddr& addr, int width) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(const IPAddr& addr, int width) : Val(new IPPrefix(addr, width), TYPE_SUBNET) { - val.subnet_val = new IPPrefix(addr, width); } -SubNetVal::SubNetVal(const IPPrefix& prefix) : Val(TYPE_SUBNET) +SubNetVal::SubNetVal(const IPPrefix& prefix) : Val(new IPPrefix(prefix), TYPE_SUBNET) { - val.subnet_val = new IPPrefix(prefix); } SubNetVal::~SubNetVal() @@ -974,9 +963,8 @@ Val* SubNetVal::DoClone(CloneState* state) return Ref(); } -StringVal::StringVal(BroString* s) : Val(TYPE_STRING) +StringVal::StringVal(BroString* s) : Val(s, TYPE_STRING) { - val.string_val = s; } // The following adds a NUL at the end. diff --git a/src/Val.h b/src/Val.h index 8fe62dc64d..666e5fd824 100644 --- a/src/Val.h +++ b/src/Val.h @@ -86,13 +86,50 @@ union BroValUnion { vector* vector_val; + BroValUnion() = default; + + constexpr BroValUnion(bro_int_t value) noexcept + :int_val(value) {} + + constexpr BroValUnion(bro_uint_t value) noexcept + :uint_val(value) {} + + constexpr BroValUnion(IPAddr* value) noexcept + :addr_val(value) {} + + constexpr BroValUnion(IPPrefix* value) noexcept + :subnet_val(value) {} + + constexpr BroValUnion(double value) noexcept + :double_val(value) {} + + constexpr BroValUnion(BroString* value) noexcept + :string_val(value) {} + + constexpr BroValUnion(Func* value) noexcept + :func_val(value) {} + + constexpr BroValUnion(BroFile* value) noexcept + :file_val(value) {} + + constexpr BroValUnion(RE_Matcher* value) noexcept + :re_val(value) {} + + constexpr BroValUnion(PDict* value) noexcept + :table_val(value) {} + + constexpr BroValUnion(val_list* value) noexcept + :val_list_val(value) {} + + constexpr BroValUnion(vector *value) noexcept + :vector_val(value) {} }; class Val : public BroObj { public: Val(double d, TypeTag t) + :val(d) { - val.double_val = d; type = base_type(t); #ifdef DEBUG bound_id = 0; @@ -114,8 +151,8 @@ public: } Val() + :val(bro_int_t(0)) { - val.int_val = 0; type = base_type(TYPE_ERROR); #ifdef DEBUG bound_id = 0; @@ -312,26 +349,22 @@ protected: static Val* MakeBool(bool b) { - auto rval = new Val(TYPE_BOOL); - rval->val.int_val = b; - return rval; + return new Val(bro_int_t(b), TYPE_BOOL); } static Val* MakeInt(bro_int_t i) { - auto rval = new Val(TYPE_INT); - rval->val.int_val = i; - return rval; + return new Val(i, TYPE_INT); } static Val* MakeCount(bro_uint_t u) { - auto rval = new Val(TYPE_COUNT); - rval->val.uint_val = u; - return rval; + return new Val(u, TYPE_COUNT); } - explicit Val(TypeTag t) + template + Val(V &&v, TypeTag t) noexcept + :val(std::forward(v)) { type = base_type(t); #ifdef DEBUG @@ -339,6 +372,16 @@ protected: #endif } + template + Val(V &&v, BroType* t) noexcept + :val(std::forward(v)) + { + type = t->Ref(); +#ifdef DEBUG + bound_id = 0; +#endif + } + explicit Val(BroType* t) { type = t->Ref(); @@ -918,9 +961,8 @@ protected: friend class Val; friend class EnumType; - EnumVal(EnumType* t, int i) : Val(t) + EnumVal(EnumType* t, int i) : Val(bro_int_t(i), t) { - val.int_val = i; } void ValDescribe(ODesc* d) const override; From 59b5e6b7dc08d7ddb8732f1ceaf2b6acc76e689b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 7 Feb 2020 11:21:15 +0100 Subject: [PATCH 12/12] Val: use C++ initializers --- src/Val.cc | 19 +++++++------------ src/Val.h | 36 +++++++----------------------------- 2 files changed, 14 insertions(+), 41 deletions(-) diff --git a/src/Val.cc b/src/Val.cc index 94bdb9ec5e..36983bc21b 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -38,28 +38,23 @@ #include "threading/formatters/JSON.h" Val::Val(Func* f) - :val(f) + :val(f), type(f->FType()->Ref()) { ::Ref(val.func_val); - type = f->FType()->Ref(); -#ifdef DEBUG - bound_id = 0; -#endif } -Val::Val(BroFile* f) - :val(f) +static FileType *GetStringFileType() noexcept { static FileType* string_file_type = 0; if ( ! string_file_type ) string_file_type = new FileType(base_type(TYPE_STRING)); + return string_file_type; + } +Val::Val(BroFile* f) + :val(f), type(GetStringFileType()->Ref()) + { assert(f->FType()->Tag() == TYPE_STRING); - type = string_file_type->Ref(); - -#ifdef DEBUG - bound_id = 0; -#endif } Val::~Val() diff --git a/src/Val.h b/src/Val.h index 666e5fd824..dc32aab859 100644 --- a/src/Val.h +++ b/src/Val.h @@ -128,12 +128,8 @@ union BroValUnion { class Val : public BroObj { public: Val(double d, TypeTag t) - :val(d) + :val(d), type(base_type(t)) { - type = base_type(t); -#ifdef DEBUG - bound_id = 0; -#endif } explicit Val(Func* f); @@ -143,20 +139,13 @@ public: explicit Val(BroFile* f); Val(BroType* t, bool type_type) // Extra arg to differentiate from protected version. + :type(new TypeType(t->Ref())) { - type = new TypeType(t->Ref()); -#ifdef DEBUG - bound_id = 0; -#endif } Val() - :val(bro_int_t(0)) + :val(bro_int_t(0)), type(base_type(TYPE_ERROR)) { - type = base_type(TYPE_ERROR); -#ifdef DEBUG - bound_id = 0; -#endif } ~Val() override; @@ -364,30 +353,19 @@ protected: template Val(V &&v, TypeTag t) noexcept - :val(std::forward(v)) + :val(std::forward(v)), type(base_type(t)) { - type = base_type(t); -#ifdef DEBUG - bound_id = 0; -#endif } template Val(V &&v, BroType* t) noexcept - :val(std::forward(v)) + :val(std::forward(v)), type(t->Ref()) { - type = t->Ref(); -#ifdef DEBUG - bound_id = 0; -#endif } explicit Val(BroType* t) + :type(t->Ref()) { - type = t->Ref(); -#ifdef DEBUG - bound_id = 0; -#endif } ACCESSOR(TYPE_TABLE, PDict*, table_val, AsNonConstTable) @@ -415,7 +393,7 @@ protected: #ifdef DEBUG // For debugging, we keep the name of the ID to which a Val is bound. - const char* bound_id; + const char* bound_id = nullptr; #endif };