mirror of
https://github.com/zeek/zeek.git
synced 2025-10-15 21:18:20 +00:00
Val: add BroValUnion constructors
Allows using C++ initializers.
This commit is contained in:
parent
5d58dbbd2e
commit
4a5473c572
2 changed files with 68 additions and 38 deletions
36
src/Val.cc
36
src/Val.cc
|
@ -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.
|
||||||
|
|
70
src/Val.h
70
src/Val.h
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue