Merge remote-tracking branch 'origin/topic/vern/zval'

* origin/topic/vern/zval: (42 commits)
  whitespace tweaks
  resolved some TODO comments
  remove unnecessary casts, and change necessary ones to use static_cast<>
  explain cmp_func default
  change functions for ZVal type management to static members
  fix some unsigned/signed integer warnings
  address lint concern about uninitialized variable
  Remove use of obsolete forward-declaration macros
  fix #include's that lack zeek/ prefixes
  explicitly populate holes created in vectors
  fixes for now-incorrect assumption that GetField always returns an existing ValPtr
  memory management for assignment to vector elements
  memory management for assignment to record fields
  destructor cleanup from ZAM_vector/ZAM_record
  fix #include's that lack zeek/ prefixes
  overlooked another way in which vector holes can be created
  initialize vector holes to the correct corresponding type
  explicitly populate holes created in vectors
  fix other instances of GetField().get() assuming long-lived ValPtr's
  fix for now-incorrect assumption that GetField always returns an existing ValPtr
  ...
This commit is contained in:
Tim Wojtulewicz 2021-03-23 20:44:19 -07:00
commit f45df63cd0
100 changed files with 2376 additions and 1386 deletions

View file

@ -277,7 +277,7 @@ const char* assign_to_index(ValPtr v1, ValPtr v2, ValPtr v3,
for ( auto idx = 0u; idx < v_vect->Size();
idx++, first++ )
v1_vect->Insert(first, v_vect->At(idx));
v1_vect->Insert(first, v_vect->ValAt(idx));
}
else if ( ! v1_vect->Assign(lv->Idx(0)->CoerceToUnsigned(), std::move(v3)) )
@ -619,8 +619,11 @@ ValPtr UnaryExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < v_op->Size(); ++i )
{
const auto& v_i = v_op->At(i);
result->Assign(i, v_i ? Fold(v_i.get()) : nullptr);
auto vop = v_op->ValAt(i);
if ( vop )
result->Assign(i, Fold(vop.get()));
else
result->Assign(i, nullptr);
}
return result;
@ -708,11 +711,12 @@ ValPtr BinaryExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < v_op1->Size(); ++i )
{
if ( v_op1->At(i) && v_op2->At(i) )
v_result->Assign(i, Fold(v_op1->At(i).get(), v_op2->At(i).get()));
auto v1_i = v_op1->ValAt(i);
auto v2_i = v_op2->ValAt(i);
if ( v1_i && v2_i )
v_result->Assign(i, Fold(v_op1->ValAt(i).get(), v_op2->ValAt(i).get()));
else
v_result->Assign(i, nullptr);
// SetError("undefined element in vector operation");
}
return v_result;
@ -725,13 +729,12 @@ ValPtr BinaryExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < vv->Size(); ++i )
{
if ( const auto& vv_i = vv->At(i) )
auto vv_i = vv->ValAt(i);
if ( vv_i )
v_result->Assign(i, is_vec1 ? Fold(vv_i.get(), v2.get())
: Fold(v1.get(), vv_i.get()));
else
v_result->Assign(i, nullptr);
// SetError("Undefined element in vector operation");
}
return v_result;
@ -1235,12 +1238,8 @@ ValPtr IncrExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < v_vec->Size(); ++i )
{
const auto& elt = v_vec->At(i);
if ( elt )
v_vec->Assign(i, DoSingleEval(f, elt.get()));
else
v_vec->Assign(i, nullptr);
auto elt = v_vec->ValAt(i);
v_vec->Assign(i, DoSingleEval(f, elt.get()));
}
op->Assign(f, std::move(v_vec));
@ -1863,18 +1862,13 @@ ValPtr BoolExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < vec_v1->Size(); ++i )
{
const auto& op1 = vec_v1->At(i);
const auto& op2 = vec_v2->At(i);
if ( op1 && op2 )
{
bool local_result = (tag == EXPR_AND_AND) ?
(! op1->IsZero() && ! op2->IsZero()) :
(! op1->IsZero() || ! op2->IsZero());
const auto op1 = vec_v1->BoolAt(i);
const auto op2 = vec_v2->BoolAt(i);
result->Assign(i, val_mgr->Bool(local_result));
}
else
result->Assign(i, nullptr);
bool local_result =
(tag == EXPR_AND_AND) ? (op1 && op2) : (op1 || op2);
result->Assign(i, val_mgr->Bool(local_result));
}
return result;
@ -2225,15 +2219,9 @@ ValPtr CondExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < cond->Size(); ++i )
{
const auto& local_cond = cond->At(i);
if ( local_cond )
{
const auto& v = local_cond->IsZero() ? b->At(i) : a->At(i);
result->Assign(i, v);
}
else
result->Assign(i, nullptr);
auto local_cond = cond->BoolAt(i);
auto v = local_cond ? a->ValAt(i) : b->ValAt(i);
result->Assign(i, v);
}
return result;
@ -2912,8 +2900,8 @@ ValPtr IndexExpr::Eval(Frame* f) const
for ( unsigned int i = 0; i < v_v2->Size(); ++i )
{
if ( v_v2->At(i)->AsBool() )
v_result->Assign(v_result->Size() + 1, v_v1->At(i));
if ( v_v2->BoolAt(i) )
v_result->Assign(v_result->Size() + 1, v_v1->ValAt(i));
}
}
else
@ -2923,7 +2911,7 @@ ValPtr IndexExpr::Eval(Frame* f) const
// Probably only do this if *all* are negative.
v_result->Resize(v_v2->Size());
for ( unsigned int i = 0; i < v_v2->Size(); ++i )
v_result->Assign(i, v_v1->At(v_v2->At(i)->CoerceToInt()));
v_result->Assign(i, v_v1->ValAt(v_v2->ValAt(i)->CoerceToInt()));
}
return v_result;
@ -2946,7 +2934,7 @@ ValPtr IndexExpr::Fold(Val* v1, Val* v2) const
const ListVal* lv = v2->AsListVal();
if ( lv->Length() == 1 )
v = vect->At(lv->Idx(0)->CoerceToUnsigned());
v = vect->ValAt(lv->Idx(0)->CoerceToUnsigned());
else
{
size_t len = vect->Size();
@ -2961,7 +2949,7 @@ ValPtr IndexExpr::Fold(Val* v1, Val* v2) const
result->Resize(sub_length);
for ( bro_int_t idx = first; idx < last; idx++ )
result->Assign(idx - first, vect->At(idx));
result->Assign(idx - first, vect->ValAt(idx));
}
return result;
@ -3161,7 +3149,7 @@ HasFieldExpr::~HasFieldExpr()
ValPtr HasFieldExpr::Fold(Val* v) const
{
auto rv = v->AsRecordVal();
return val_mgr->Bool(rv->GetField(field) != nullptr);
return val_mgr->Bool(rv->HasField(field));
}
void HasFieldExpr::ExprDescribe(ODesc* d) const
@ -3749,7 +3737,8 @@ ValPtr ArithCoerceExpr::Fold(Val* v) const
for ( unsigned int i = 0; i < vv->Size(); ++i )
{
if ( const auto& elt = vv->At(i) )
auto elt = vv->ValAt(i);
if ( elt )
result->Assign(i, FoldSingleVal(elt.get(), t));
else
result->Assign(i, nullptr);
@ -3917,7 +3906,7 @@ ValPtr RecordCoerceExpr::Fold(Val* v) const
if ( ! rhs )
{
// Optional field is missing.
val->Assign(i, nullptr);
val->Remove(i);
continue;
}
@ -3964,7 +3953,7 @@ ValPtr RecordCoerceExpr::Fold(Val* v) const
val->Assign(i, std::move(def_val));
}
else
val->Assign(i, nullptr);
val->Remove(i);
}
}
@ -4207,7 +4196,11 @@ ValPtr InExpr::Fold(Val* v1, Val* v2) const
bool res;
if ( is_vector(v2) )
res = (bool)v2->AsVectorVal()->At(v1->AsListVal()->Idx(0)->CoerceToUnsigned());
{
auto vv2 = v2->AsVectorVal();
auto ind = v1->AsListVal()->Idx(0)->CoerceToUnsigned();
res = ind < vv2->Size() && vv2->ValAt(ind);
}
else
res = (bool)v2->AsTableVal()->Find({NewRef{}, v1});
@ -5087,7 +5080,7 @@ ValPtr CastExpr::Eval(Frame* f) const
d.Add("'");
if ( same_type(v->GetType(), Broker::detail::DataVal::ScriptDataType()) &&
! v->AsRecordVal()->GetField(0) )
! v->AsRecordVal()->HasField(0) )
d.Add(" (nil $data field)");
RuntimeError(d.Description());