Val: add BroValUnion constructors

Allows using C++ initializers.
This commit is contained in:
Max Kellermann 2020-02-07 11:25:07 +01:00
parent 5d58dbbd2e
commit 4a5473c572
2 changed files with 68 additions and 38 deletions

View file

@ -38,8 +38,8 @@
#include "threading/formatters/JSON.h" #include "threading/formatters/JSON.h"
Val::Val(Func* f) Val::Val(Func* f)
:val(f)
{ {
val.func_val = f;
::Ref(val.func_val); ::Ref(val.func_val);
type = f->FType()->Ref(); type = f->FType()->Ref();
#ifdef DEBUG #ifdef DEBUG
@ -48,13 +48,12 @@ Val::Val(Func* f)
} }
Val::Val(BroFile* f) Val::Val(BroFile* f)
:val(f)
{ {
static FileType* string_file_type = 0; static FileType* string_file_type = 0;
if ( ! string_file_type ) if ( ! string_file_type )
string_file_type = new FileType(base_type(TYPE_STRING)); string_file_type = new FileType(base_type(TYPE_STRING));
val.file_val = f;
assert(f->FType()->Tag() == TYPE_STRING); assert(f->FType()->Tag() == TYPE_STRING);
type = string_file_type->Ref(); type = string_file_type->Ref();
@ -771,9 +770,8 @@ uint32_t PortVal::Mask(uint32_t port_num, TransportProto port_type)
return port_num; 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<bro_uint_t>(p);
} }
uint32_t PortVal::Port() const uint32_t PortVal::Port() const
@ -823,29 +821,25 @@ Val* PortVal::DoClone(CloneState* state)
return Ref(); 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(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? // ### 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() AddrVal::~AddrVal()
@ -872,17 +866,14 @@ Val* AddrVal::DoClone(CloneState* state)
return Ref(); 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) ) if ( ! IPPrefix::ConvertString(text, val.subnet_val) )
reporter->Error("Bad string in SubNetVal ctor: %s", text); 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) 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() SubNetVal::~SubNetVal()
@ -974,9 +963,8 @@ Val* SubNetVal::DoClone(CloneState* state)
return Ref(); 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. // The following adds a NUL at the end.

View file

@ -86,13 +86,50 @@ union BroValUnion {
vector<Val*>* vector_val; vector<Val*>* 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<TableEntryVal>* value) noexcept
:table_val(value) {}
constexpr BroValUnion(val_list* value) noexcept
:val_list_val(value) {}
constexpr BroValUnion(vector<Val*> *value) noexcept
:vector_val(value) {}
}; };
class Val : public BroObj { class Val : public BroObj {
public: public:
Val(double d, TypeTag t) Val(double d, TypeTag t)
:val(d)
{ {
val.double_val = d;
type = base_type(t); type = base_type(t);
#ifdef DEBUG #ifdef DEBUG
bound_id = 0; bound_id = 0;
@ -114,8 +151,8 @@ public:
} }
Val() Val()
:val(bro_int_t(0))
{ {
val.int_val = 0;
type = base_type(TYPE_ERROR); type = base_type(TYPE_ERROR);
#ifdef DEBUG #ifdef DEBUG
bound_id = 0; bound_id = 0;
@ -312,26 +349,22 @@ protected:
static Val* MakeBool(bool b) static Val* MakeBool(bool b)
{ {
auto rval = new Val(TYPE_BOOL); return new Val(bro_int_t(b), TYPE_BOOL);
rval->val.int_val = b;
return rval;
} }
static Val* MakeInt(bro_int_t i) static Val* MakeInt(bro_int_t i)
{ {
auto rval = new Val(TYPE_INT); return new Val(i, TYPE_INT);
rval->val.int_val = i;
return rval;
} }
static Val* MakeCount(bro_uint_t u) static Val* MakeCount(bro_uint_t u)
{ {
auto rval = new Val(TYPE_COUNT); return new Val(u, TYPE_COUNT);
rval->val.uint_val = u;
return rval;
} }
explicit Val(TypeTag t) template<typename V>
Val(V &&v, TypeTag t) noexcept
:val(std::forward<V>(v))
{ {
type = base_type(t); type = base_type(t);
#ifdef DEBUG #ifdef DEBUG
@ -339,6 +372,16 @@ protected:
#endif #endif
} }
template<typename V>
Val(V &&v, BroType* t) noexcept
:val(std::forward<V>(v))
{
type = t->Ref();
#ifdef DEBUG
bound_id = 0;
#endif
}
explicit Val(BroType* t) explicit Val(BroType* t)
{ {
type = t->Ref(); type = t->Ref();
@ -918,9 +961,8 @@ protected:
friend class Val; friend class Val;
friend class EnumType; 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; void ValDescribe(ODesc* d) const override;