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;