mirror of
https://github.com/zeek/zeek.git
synced 2025-10-07 00:58:19 +00:00
Merge remote-tracking branch 'origin/topic/vern/record-optimizations.Apr23B'
* origin/topic/vern/record-optimizations.Apr23B: different fix for MSVC compiler issues more general approach for addressing MSVC compiler issues with IntrusivePtr restored RecordType::Create, now marked as deprecated tidying of namespaces and private class members simplification of flagging record field initializations that should be skipped address peculiar MSVC compilation complaint for IntrusivePtr's clarifications and tidying for record field initializations optimize record construction by deferring initializations of aggregates compile-scripts-to-C++ speedups by switching to raw record access logging speedup by switching to raw record access remove redundant record coercions Removed the `#if 0` hunk during merging: Probably could have gone with a doctest instead.
This commit is contained in:
commit
89c828ac14
14 changed files with 399 additions and 205 deletions
43
src/Val.cc
43
src/Val.cc
|
@ -2759,25 +2759,32 @@ RecordVal::RecordVal(RecordTypePtr t, bool init_fields) : Val(t), is_managed(t->
|
|||
|
||||
int n = rt->NumFields();
|
||||
|
||||
record_val = new std::vector<std::optional<ZVal>>;
|
||||
record_val->reserve(n);
|
||||
|
||||
if ( run_state::is_parsing )
|
||||
parse_time_records[rt.get()].emplace_back(NewRef{}, this);
|
||||
|
||||
record_val = new std::vector<std::optional<ZVal>>;
|
||||
|
||||
if ( init_fields )
|
||||
{
|
||||
try
|
||||
record_val->resize(n);
|
||||
|
||||
for ( auto& e : rt->CreationInits() )
|
||||
{
|
||||
rt->Create(*record_val);
|
||||
}
|
||||
catch ( InterpreterException& e )
|
||||
{
|
||||
if ( run_state::is_parsing )
|
||||
parse_time_records[rt.get()].pop_back();
|
||||
throw;
|
||||
try
|
||||
{
|
||||
(*record_val)[e.first] = e.second->Generate();
|
||||
}
|
||||
catch ( InterpreterException& e )
|
||||
{
|
||||
if ( run_state::is_parsing )
|
||||
parse_time_records[rt.get()].pop_back();
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
record_val->reserve(n);
|
||||
}
|
||||
|
||||
RecordVal::~RecordVal()
|
||||
|
@ -2785,8 +2792,11 @@ RecordVal::~RecordVal()
|
|||
auto n = record_val->size();
|
||||
|
||||
for ( unsigned int i = 0; i < n; ++i )
|
||||
if ( HasField(i) && IsManaged(i) )
|
||||
ZVal::DeleteManagedType(*(*record_val)[i]);
|
||||
{
|
||||
auto f_i = (*record_val)[i];
|
||||
if ( f_i && IsManaged(i) )
|
||||
ZVal::DeleteManagedType(*f_i);
|
||||
}
|
||||
|
||||
delete record_val;
|
||||
}
|
||||
|
@ -2812,12 +2822,13 @@ void RecordVal::Assign(int field, ValPtr new_val)
|
|||
|
||||
void RecordVal::Remove(int field)
|
||||
{
|
||||
if ( HasField(field) )
|
||||
auto& f_i = (*record_val)[field];
|
||||
if ( f_i )
|
||||
{
|
||||
if ( IsManaged(field) )
|
||||
ZVal::DeleteManagedType(*(*record_val)[field]);
|
||||
ZVal::DeleteManagedType(*f_i);
|
||||
|
||||
(*record_val)[field] = std::nullopt;
|
||||
f_i = std::nullopt;
|
||||
|
||||
Modified();
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue