Update various BIFs to return IntrusivePtr

This commit is contained in:
Jon Siwek 2020-04-27 11:50:35 -07:00
parent 17f72d6be6
commit 9e56881c70
9 changed files with 72 additions and 78 deletions

View file

@ -94,7 +94,7 @@ function Broker::__unpeer%(a: string, p: port%): bool
function Broker::__peers%(%): PeerInfos function Broker::__peers%(%): PeerInfos
%{ %{
bro_broker::Manager::ScriptScopeGuard ssg; bro_broker::Manager::ScriptScopeGuard ssg;
VectorVal* rval = new VectorVal(internal_type("Broker::PeerInfos")->AsVectorType()); auto rval = make_intrusive<VectorVal>(internal_type("Broker::PeerInfos")->AsVectorType());
auto i = 0; auto i = 0;
for ( auto& p : broker_mgr->Peers() ) for ( auto& p : broker_mgr->Peers() )

View file

@ -146,7 +146,7 @@ function Broker::__set_iterator_next%(it: opaque of Broker::SetIterator%): bool
function Broker::__set_iterator_value%(it: opaque of Broker::SetIterator%): Broker::Data function Broker::__set_iterator_value%(it: opaque of Broker::SetIterator%): Broker::Data
%{ %{
auto set_it = static_cast<bro_broker::SetIterator*>(it); auto set_it = static_cast<bro_broker::SetIterator*>(it);
auto rval = new RecordVal(BifType::Record::Broker::Data); auto rval = make_intrusive<RecordVal>(BifType::Record::Broker::Data);
if ( set_it->it == set_it->dat.end() ) if ( set_it->it == set_it->dat.end() )
{ {
@ -300,7 +300,7 @@ function Broker::__table_iterator_next%(it: opaque of Broker::TableIterator%): b
function Broker::__table_iterator_value%(it: opaque of Broker::TableIterator%): Broker::TableItem function Broker::__table_iterator_value%(it: opaque of Broker::TableIterator%): Broker::TableItem
%{ %{
auto ti = static_cast<bro_broker::TableIterator*>(it); auto ti = static_cast<bro_broker::TableIterator*>(it);
auto rval = new RecordVal(BifType::Record::Broker::TableItem); auto rval = make_intrusive<RecordVal>(BifType::Record::Broker::TableItem);
auto key_val = new RecordVal(BifType::Record::Broker::Data); auto key_val = new RecordVal(BifType::Record::Broker::Data);
auto val_val = new RecordVal(BifType::Record::Broker::Data); auto val_val = new RecordVal(BifType::Record::Broker::Data);
rval->Assign(0, key_val); rval->Assign(0, key_val);
@ -423,7 +423,7 @@ function Broker::__vector_iterator_next%(it: opaque of Broker::VectorIterator%):
function Broker::__vector_iterator_value%(it: opaque of Broker::VectorIterator%): Broker::Data function Broker::__vector_iterator_value%(it: opaque of Broker::VectorIterator%): Broker::Data
%{ %{
auto vi = static_cast<bro_broker::VectorIterator*>(it); auto vi = static_cast<bro_broker::VectorIterator*>(it);
auto rval = new RecordVal(BifType::Record::Broker::Data); auto rval = make_intrusive<RecordVal>(BifType::Record::Broker::Data);
if ( vi->it == vi->dat.end() ) if ( vi->it == vi->dat.end() )
{ {
@ -502,7 +502,7 @@ function Broker::__record_iterator_next%(it: opaque of Broker::RecordIterator%):
function Broker::__record_iterator_value%(it: opaque of Broker::RecordIterator%): Broker::Data function Broker::__record_iterator_value%(it: opaque of Broker::RecordIterator%): Broker::Data
%{ %{
auto ri = static_cast<bro_broker::RecordIterator*>(it); auto ri = static_cast<bro_broker::RecordIterator*>(it);
auto rval = new RecordVal(BifType::Record::Broker::Data); auto rval = make_intrusive<RecordVal>(BifType::Record::Broker::Data);
if ( ri->it == ri->dat.end() ) if ( ri->it == ri->dat.end() )
{ {

View file

@ -89,8 +89,7 @@ function Broker::make_event%(...%): Broker::Event
for ( auto i = 0u; i < bif_args->size(); ++i ) for ( auto i = 0u; i < bif_args->size(); ++i )
args.push_back((*bif_args)[i].get()); args.push_back((*bif_args)[i].get());
auto rval = broker_mgr->MakeEvent(&args, frame); return IntrusivePtr<RecordVal>{AdoptRef{}, broker_mgr->MakeEvent(&args, frame)};
return rval;
%} %}
## Publishes an event at a given topic. ## Publishes an event at a given topic.

View file

@ -42,16 +42,13 @@ function Broker::__create_master%(id: string, b: BackendType,
auto rval = broker_mgr->LookupStore(name); auto rval = broker_mgr->LookupStore(name);
if ( rval ) if ( rval )
{ return IntrusivePtr<Val>{NewRef{}, rval};
::Ref(rval);
return rval;
}
auto e = static_cast<BifEnum::Broker::BackendType>(b->AsEnum()); auto e = static_cast<BifEnum::Broker::BackendType>(b->AsEnum());
auto type = bro_broker::to_backend_type(e); auto type = bro_broker::to_backend_type(e);
auto opts = bro_broker::to_backend_options(type, options->AsRecordVal()); auto opts = bro_broker::to_backend_options(type, options->AsRecordVal());
auto store = broker_mgr->MakeMaster(name, type, std::move(opts)); IntrusivePtr<Val> store{AdoptRef{}, broker_mgr->MakeMaster(name, type, std::move(opts))};
if ( ! store ) if ( ! store )
{ {
@ -71,13 +68,13 @@ function Broker::__create_clone%(id: string, resync_interval: interval,
auto rval = broker_mgr->LookupStore(name); auto rval = broker_mgr->LookupStore(name);
if ( rval ) if ( rval )
{ return IntrusivePtr<Val>{NewRef{}, rval};
::Ref(rval);
return rval; IntrusivePtr<Val> store {AdoptRef{},
} broker_mgr->MakeClone(name, resync_interval,
stale_interval,
mutation_buffer_interval)};
auto store = broker_mgr->MakeClone(name, resync_interval, stale_interval,
mutation_buffer_interval);
if ( ! store ) if ( ! store )
{ {
builtin_error(fmt("Could not create clone of Broker store '%s'", name)); builtin_error(fmt("Could not create clone of Broker store '%s'", name));

View file

@ -23,7 +23,7 @@ module GLOBAL;
function hll_cardinality_init%(err: double, confidence: double%): opaque of cardinality function hll_cardinality_init%(err: double, confidence: double%): opaque of cardinality
%{ %{
CardinalityCounter* c = new CardinalityCounter(err, confidence); CardinalityCounter* c = new CardinalityCounter(err, confidence);
CardinalityVal* cv = new CardinalityVal(c); auto cv = make_intrusive<CardinalityVal>(c);
return cv; return cv;
%} %}
@ -129,7 +129,7 @@ function hll_cardinality_copy%(handle: opaque of cardinality%): opaque of cardin
CardinalityVal* cv = static_cast<CardinalityVal*>(handle); CardinalityVal* cv = static_cast<CardinalityVal*>(handle);
CardinalityCounter* h = cv->Get(); CardinalityCounter* h = cv->Get();
CardinalityCounter* h2 = new CardinalityCounter(*h); CardinalityCounter* h2 = new CardinalityCounter(*h);
CardinalityVal* out = new CardinalityVal(h2); auto out = make_intrusive<CardinalityVal>(h2);
return out; return out;
%} %}

View file

@ -14,7 +14,7 @@
## topk_size topk_sum topk_merge topk_merge_prune ## topk_size topk_sum topk_merge topk_merge_prune
function topk_init%(size: count%): opaque of topk function topk_init%(size: count%): opaque of topk
%{ %{
probabilistic::TopkVal* v = new probabilistic::TopkVal(size); auto v = make_intrusive<probabilistic::TopkVal>(size);
return v; return v;
%} %}

View file

@ -54,7 +54,7 @@ function get_net_stats%(%): NetStats
bytes_recv += stat.bytes_received; bytes_recv += stat.bytes_received;
} }
RecordVal* r = new RecordVal(NetStats); auto r = make_intrusive<RecordVal>(NetStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(recv)); r->Assign(n++, val_mgr->Count(recv));
@ -83,7 +83,7 @@ function get_net_stats%(%): NetStats
## get_reporter_stats ## get_reporter_stats
function get_conn_stats%(%): ConnStats function get_conn_stats%(%): ConnStats
%{ %{
RecordVal* r = new RecordVal(ConnStats); auto r = make_intrusive<RecordVal>(ConnStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(Connection::TotalConnections())); r->Assign(n++, val_mgr->Count(Connection::TotalConnections()));
@ -137,7 +137,7 @@ function get_proc_stats%(%): ProcStats
if ( getrusage(RUSAGE_SELF, &ru) < 0 ) if ( getrusage(RUSAGE_SELF, &ru) < 0 )
reporter->InternalError("getrusage() failed in get_proc_stats()"); reporter->InternalError("getrusage() failed in get_proc_stats()");
RecordVal* r = new RecordVal(ProcStats); auto r = make_intrusive<RecordVal>(ProcStats);
int n = 0; int n = 0;
double elapsed_time = current_time() - bro_start_time; double elapsed_time = current_time() - bro_start_time;
@ -190,7 +190,7 @@ function get_proc_stats%(%): ProcStats
## get_reporter_stats ## get_reporter_stats
function get_event_stats%(%): EventStats function get_event_stats%(%): EventStats
%{ %{
RecordVal* r = new RecordVal(EventStats); auto r = make_intrusive<RecordVal>(EventStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(num_events_queued)); r->Assign(n++, val_mgr->Count(num_events_queued));
@ -217,7 +217,7 @@ function get_event_stats%(%): EventStats
## get_reporter_stats ## get_reporter_stats
function get_reassembler_stats%(%): ReassemblerStats function get_reassembler_stats%(%): ReassemblerStats
%{ %{
RecordVal* r = new RecordVal(ReassemblerStats); auto r = make_intrusive<RecordVal>(ReassemblerStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(Reassembler::MemoryAllocation(REASSEM_FILE))); r->Assign(n++, val_mgr->Count(Reassembler::MemoryAllocation(REASSEM_FILE)));
@ -246,7 +246,7 @@ function get_reassembler_stats%(%): ReassemblerStats
## get_reporter_stats ## get_reporter_stats
function get_dns_stats%(%): DNSStats function get_dns_stats%(%): DNSStats
%{ %{
RecordVal* r = new RecordVal(DNSStats); auto r = make_intrusive<RecordVal>(DNSStats);
int n = 0; int n = 0;
DNS_Mgr::Stats dstats; DNS_Mgr::Stats dstats;
@ -280,7 +280,7 @@ function get_dns_stats%(%): DNSStats
## get_reporter_stats ## get_reporter_stats
function get_timer_stats%(%): TimerStats function get_timer_stats%(%): TimerStats
%{ %{
RecordVal* r = new RecordVal(TimerStats); auto r = make_intrusive<RecordVal>(TimerStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(unsigned(timer_mgr->Size()))); r->Assign(n++, val_mgr->Count(unsigned(timer_mgr->Size())));
@ -308,7 +308,7 @@ function get_timer_stats%(%): TimerStats
## get_reporter_stats ## get_reporter_stats
function get_file_analysis_stats%(%): FileAnalysisStats function get_file_analysis_stats%(%): FileAnalysisStats
%{ %{
RecordVal* r = new RecordVal(FileAnalysisStats); auto r = make_intrusive<RecordVal>(FileAnalysisStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(file_mgr->CurrentFiles())); r->Assign(n++, val_mgr->Count(file_mgr->CurrentFiles()));
@ -336,7 +336,7 @@ function get_file_analysis_stats%(%): FileAnalysisStats
## get_reporter_stats ## get_reporter_stats
function get_thread_stats%(%): ThreadStats function get_thread_stats%(%): ThreadStats
%{ %{
RecordVal* r = new RecordVal(ThreadStats); auto r = make_intrusive<RecordVal>(ThreadStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(thread_mgr->NumThreads())); r->Assign(n++, val_mgr->Count(thread_mgr->NumThreads()));
@ -362,7 +362,7 @@ function get_thread_stats%(%): ThreadStats
## get_reporter_stats ## get_reporter_stats
function get_gap_stats%(%): GapStats function get_gap_stats%(%): GapStats
%{ %{
RecordVal* r = new RecordVal(GapStats); auto r = make_intrusive<RecordVal>(GapStats);
int n = 0; int n = 0;
r->Assign(n++, val_mgr->Count(tot_ack_events)); r->Assign(n++, val_mgr->Count(tot_ack_events));
@ -394,7 +394,7 @@ function get_gap_stats%(%): GapStats
## get_reporter_stats ## get_reporter_stats
function get_matcher_stats%(%): MatcherStats function get_matcher_stats%(%): MatcherStats
%{ %{
RecordVal* r = new RecordVal(MatcherStats); auto r = make_intrusive<RecordVal>(MatcherStats);
int n = 0; int n = 0;
RuleMatcher::Stats s; RuleMatcher::Stats s;
@ -432,7 +432,7 @@ function get_matcher_stats%(%): MatcherStats
## get_reporter_stats ## get_reporter_stats
function get_broker_stats%(%): BrokerStats function get_broker_stats%(%): BrokerStats
%{ %{
RecordVal* r = new RecordVal(BrokerStats); auto r = make_intrusive<RecordVal>(BrokerStats);
int n = 0; int n = 0;
auto cs = broker_mgr->GetStatistics(); auto cs = broker_mgr->GetStatistics();
@ -467,16 +467,15 @@ function get_broker_stats%(%): BrokerStats
## get_broker_stats ## get_broker_stats
function get_reporter_stats%(%): ReporterStats function get_reporter_stats%(%): ReporterStats
%{ %{
RecordVal* r = new RecordVal(ReporterStats); auto r = make_intrusive<RecordVal>(ReporterStats);
int n = 0; int n = 0;
TableVal* weirds_by_type = new TableVal({NewRef{}, internal_type("table_string_of_count")->AsTableType()}); TableVal* weirds_by_type = new TableVal({NewRef{}, internal_type("table_string_of_count")->AsTableType()});
for ( auto& kv : reporter->GetWeirdsByType() ) for ( auto& kv : reporter->GetWeirdsByType() )
{ {
Val* weird = new StringVal(kv.first); auto weird = make_intrusive<StringVal>(kv.first);
weirds_by_type->Assign(weird, val_mgr->Count(kv.second)); weirds_by_type->Assign(weird.get(), val_mgr->Count(kv.second));
Unref(weird);
} }
r->Assign(n++, val_mgr->Count(reporter->GetWeirdCount())); r->Assign(n++, val_mgr->Count(reporter->GetWeirdCount()));

View file

@ -647,7 +647,7 @@ function is_ascii%(str: string%): bool
function escape_string%(s: string%): string function escape_string%(s: string%): string
%{ %{
char* escstr = s->AsString()->Render(BroString::ESC_HEX | BroString::ESC_ESC); char* escstr = s->AsString()->Render(BroString::ESC_HEX | BroString::ESC_ESC);
Val* val = new StringVal(escstr); auto val = make_intrusive<StringVal>(escstr);
delete [] escstr; delete [] escstr;
return val; return val;
%} %}
@ -686,7 +686,7 @@ function str_smith_waterman%(s1: string, s2: string, params: sw_params%) : sw_su
BroSubstring::Vec* subseq = BroSubstring::Vec* subseq =
smith_waterman(s1->AsString(), s2->AsString(), sw_params); smith_waterman(s1->AsString(), s2->AsString(), sw_params);
VectorVal* result = BroSubstring::VecToPolicy(subseq); auto result = IntrusivePtr<VectorVal>{AdoptRef{}, BroSubstring::VecToPolicy(subseq)};
delete_each(subseq); delete_each(subseq);
delete subseq; delete subseq;
@ -713,7 +713,7 @@ function str_split%(s: string, idx: index_vec%): string_vec
indices[i] = (*idx_v)[i]->AsCount(); indices[i] = (*idx_v)[i]->AsCount();
BroString::Vec* result = s->AsString()->Split(indices); BroString::Vec* result = s->AsString()->Split(indices);
VectorVal* result_v = new VectorVal( auto result_v = make_intrusive<VectorVal>(
internal_type("string_vec")->AsVectorType()); internal_type("string_vec")->AsVectorType());
if ( result ) if ( result )
@ -909,7 +909,7 @@ function safe_shell_quote%(source: string%): string
## .. zeek:see: find_last strstr ## .. zeek:see: find_last strstr
function find_all%(str: string, re: pattern%) : string_set function find_all%(str: string, re: pattern%) : string_set
%{ %{
TableVal* a = new TableVal({NewRef{}, string_set}); auto a = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, string_set});
const u_char* s = str->Bytes(); const u_char* s = str->Bytes();
const u_char* e = s + str->Len(); const u_char* e = s + str->Len();
@ -919,9 +919,8 @@ function find_all%(str: string, re: pattern%) : string_set
int n = re->MatchPrefix(t, e - t); int n = re->MatchPrefix(t, e - t);
if ( n >= 0 ) if ( n >= 0 )
{ {
Val* idx = new StringVal(n, (const char*) t); auto idx = make_intrusive<StringVal>(n, (const char*) t);
a->Assign(idx, 0); a->Assign(idx.get(), 0);
Unref(idx);
t += n - 1; t += n - 1;
} }
} }
@ -1068,7 +1067,7 @@ function hexdump%(data_str: string%) : string
*ascii_ptr++ = '\n'; *ascii_ptr++ = '\n';
*ascii_ptr = 0; *ascii_ptr = 0;
StringVal* result = new StringVal((const char*) hex_data); auto result = make_intrusive<StringVal>((const char*) hex_data);
delete [] hex_data; delete [] hex_data;
return result; return result;

View file

@ -639,7 +639,7 @@ function md5_hmac%(...%): string
## sha256_hash sha256_hash_init sha256_hash_update sha256_hash_finish ## sha256_hash sha256_hash_init sha256_hash_update sha256_hash_finish
function md5_hash_init%(%): opaque of md5 function md5_hash_init%(%): opaque of md5
%{ %{
HashVal* digest = new MD5Val(); auto digest = make_intrusive<MD5Val>();
digest->Init(); digest->Init();
return digest; return digest;
%} %}
@ -664,7 +664,7 @@ function md5_hash_init%(%): opaque of md5
## sha256_hash sha256_hash_init sha256_hash_update sha256_hash_finish ## sha256_hash sha256_hash_init sha256_hash_update sha256_hash_finish
function sha1_hash_init%(%): opaque of sha1 function sha1_hash_init%(%): opaque of sha1
%{ %{
HashVal* digest = new SHA1Val(); auto digest = make_intrusive<SHA1Val>();
digest->Init(); digest->Init();
return digest; return digest;
%} %}
@ -689,7 +689,7 @@ function sha1_hash_init%(%): opaque of sha1
## sha256_hash sha256_hash_update sha256_hash_finish ## sha256_hash sha256_hash_update sha256_hash_finish
function sha256_hash_init%(%): opaque of sha256 function sha256_hash_init%(%): opaque of sha256
%{ %{
HashVal* digest = new SHA256Val(); auto digest = make_intrusive<SHA256Val>();
digest->Init(); digest->Init();
return digest; return digest;
%} %}
@ -1050,7 +1050,7 @@ function find_entropy%(data: string%): entropy_test_result
e.Feed(data->Bytes(), data->Len()); e.Feed(data->Bytes(), data->Len());
e.Get(&ent, &chisq, &mean, &montepi, &scc); e.Get(&ent, &chisq, &mean, &montepi, &scc);
RecordVal* ent_result = new RecordVal(entropy_test_result); auto ent_result = make_intrusive<RecordVal>(entropy_test_result);
ent_result->Assign(0, make_intrusive<Val>(ent, TYPE_DOUBLE)); ent_result->Assign(0, make_intrusive<Val>(ent, TYPE_DOUBLE));
ent_result->Assign(1, make_intrusive<Val>(chisq, TYPE_DOUBLE)); ent_result->Assign(1, make_intrusive<Val>(chisq, TYPE_DOUBLE));
ent_result->Assign(2, make_intrusive<Val>(mean, TYPE_DOUBLE)); ent_result->Assign(2, make_intrusive<Val>(mean, TYPE_DOUBLE));
@ -1101,7 +1101,7 @@ function entropy_test_finish%(handle: opaque of entropy%): entropy_test_result
montepi = scc = ent = mean = chisq = 0.0; montepi = scc = ent = mean = chisq = 0.0;
static_cast<EntropyVal*>(handle)->Get(&ent, &chisq, &mean, &montepi, &scc); static_cast<EntropyVal*>(handle)->Get(&ent, &chisq, &mean, &montepi, &scc);
RecordVal* ent_result = new RecordVal(entropy_test_result); auto ent_result = make_intrusive<RecordVal>(entropy_test_result);
ent_result->Assign(0, make_intrusive<Val>(ent, TYPE_DOUBLE)); ent_result->Assign(0, make_intrusive<Val>(ent, TYPE_DOUBLE));
ent_result->Assign(1, make_intrusive<Val>(chisq, TYPE_DOUBLE)); ent_result->Assign(1, make_intrusive<Val>(chisq, TYPE_DOUBLE));
ent_result->Assign(2, make_intrusive<Val>(mean, TYPE_DOUBLE)); ent_result->Assign(2, make_intrusive<Val>(mean, TYPE_DOUBLE));
@ -1399,12 +1399,12 @@ bool indirect_unsigned_sort_function(size_t a, size_t b)
## .. zeek:see:: order ## .. zeek:see:: order
function sort%(v: any, ...%) : any function sort%(v: any, ...%) : any
%{ %{
v->Ref(); // we always return v IntrusivePtr<Val> rval{NewRef{}, v};
if ( v->Type()->Tag() != TYPE_VECTOR ) if ( v->Type()->Tag() != TYPE_VECTOR )
{ {
builtin_error("sort() requires vector"); builtin_error("sort() requires vector");
return v; return rval;
} }
BroType* elt_type = v->Type()->YieldType(); BroType* elt_type = v->Type()->YieldType();
@ -1419,7 +1419,7 @@ function sort%(v: any, ...%) : any
if ( ! IsFunc(comp_val->Type()->Tag()) ) if ( ! IsFunc(comp_val->Type()->Tag()) )
{ {
builtin_error("second argument to sort() needs to be comparison function"); builtin_error("second argument to sort() needs to be comparison function");
return v; return rval;
} }
comp = comp_val->AsFunc(); comp = comp_val->AsFunc();
@ -1437,7 +1437,7 @@ function sort%(v: any, ...%) : any
! comp_type->ArgTypes()->AllMatch(elt_type, 0) ) ! comp_type->ArgTypes()->AllMatch(elt_type, 0) )
{ {
builtin_error("invalid comparison function in call to sort()"); builtin_error("invalid comparison function in call to sort()");
return v; return rval;
} }
sort_function_comp = comp; sort_function_comp = comp;
@ -1452,7 +1452,7 @@ function sort%(v: any, ...%) : any
sort(vv.begin(), vv.end(), signed_sort_function); sort(vv.begin(), vv.end(), signed_sort_function);
} }
return v; return rval;
%} %}
## Returns the order of the elements in a vector according to some ## Returns the order of the elements in a vector according to some
@ -1468,7 +1468,7 @@ function sort%(v: any, ...%) : any
## .. zeek:see:: sort ## .. zeek:see:: sort
function order%(v: any, ...%) : index_vec function order%(v: any, ...%) : index_vec
%{ %{
VectorVal* result_v = new VectorVal( auto result_v = make_intrusive<VectorVal>(
internal_type("index_vec")->AsVectorType()); internal_type("index_vec")->AsVectorType());
if ( v->Type()->Tag() != TYPE_VECTOR ) if ( v->Type()->Tag() != TYPE_VECTOR )
@ -1489,7 +1489,7 @@ function order%(v: any, ...%) : index_vec
if ( ! IsFunc(comp_val->Type()->Tag()) ) if ( ! IsFunc(comp_val->Type()->Tag()) )
{ {
builtin_error("second argument to order() needs to be comparison function"); builtin_error("second argument to order() needs to be comparison function");
return v; return IntrusivePtr<Val>{NewRef{}, v};
} }
comp = comp_val->AsFunc(); comp = comp_val->AsFunc();
@ -1519,7 +1519,7 @@ function order%(v: any, ...%) : index_vec
! comp_type->ArgTypes()->AllMatch(elt_type, 0) ) ! comp_type->ArgTypes()->AllMatch(elt_type, 0) )
{ {
builtin_error("invalid comparison function in call to order()"); builtin_error("invalid comparison function in call to order()");
return v; return IntrusivePtr<Val>{NewRef{}, v};
} }
sort_function_comp = comp; sort_function_comp = comp;
@ -1822,8 +1822,8 @@ function zeek_version%(%): string
## Returns: A string vector with the field names of *rt*. ## Returns: A string vector with the field names of *rt*.
function record_type_to_vector%(rt: string%): string_vec function record_type_to_vector%(rt: string%): string_vec
%{ %{
VectorVal* result = auto result =
new VectorVal(internal_type("string_vec")->AsVectorType()); make_intrusive<VectorVal>(internal_type("string_vec")->AsVectorType());
RecordType *type = internal_type(rt->CheckString())->AsRecordType(); RecordType *type = internal_type(rt->CheckString())->AsRecordType();
@ -1916,7 +1916,7 @@ function packet_source%(%): PacketSource
## .. zeek:see:: global_ids ## .. zeek:see:: global_ids
function global_sizes%(%): var_sizes function global_sizes%(%): var_sizes
%{ %{
TableVal* sizes = new TableVal({NewRef{}, var_sizes}); auto sizes = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, var_sizes});
const auto& globals = global_scope()->Vars(); const auto& globals = global_scope()->Vars();
for ( const auto& global : globals ) for ( const auto& global : globals )
@ -1924,10 +1924,9 @@ function global_sizes%(%): var_sizes
ID* id = global.second.get(); ID* id = global.second.get();
if ( id->HasVal() ) if ( id->HasVal() )
{ {
Val* id_name = new StringVal(id->Name()); auto id_name = make_intrusive<StringVal>(id->Name());
auto id_size = val_mgr->Count(id->ID_Val()->MemoryAllocation()); auto id_size = val_mgr->Count(id->ID_Val()->MemoryAllocation());
sizes->Assign(id_name, std::move(id_size)); sizes->Assign(id_name.get(), std::move(id_size));
Unref(id_name);
} }
} }
@ -1944,7 +1943,7 @@ function global_sizes%(%): var_sizes
## .. zeek:see:: global_sizes ## .. zeek:see:: global_sizes
function global_ids%(%): id_table function global_ids%(%): id_table
%{ %{
TableVal* ids = new TableVal({NewRef{}, id_table}); auto ids = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, id_table});
const auto& globals = global_scope()->Vars(); const auto& globals = global_scope()->Vars();
for ( const auto& global : globals ) for ( const auto& global : globals )
@ -2193,7 +2192,7 @@ function is_v6_subnet%(s: subnet%): bool
## Returns: The vector of addresses contained in the routing header data. ## Returns: The vector of addresses contained in the routing header data.
function routing0_data_to_addrs%(s: string%): addr_vec function routing0_data_to_addrs%(s: string%): addr_vec
%{ %{
VectorVal* rval = new VectorVal(internal_type("addr_vec")->AsVectorType()); auto rval = make_intrusive<VectorVal>(internal_type("addr_vec")->AsVectorType());
int len = s->Len(); int len = s->Len();
const u_char* bytes = s->Bytes(); const u_char* bytes = s->Bytes();
@ -2224,7 +2223,7 @@ function routing0_data_to_addrs%(s: string%): addr_vec
## .. zeek:see:: counts_to_addr ## .. zeek:see:: counts_to_addr
function addr_to_counts%(a: addr%): index_vec function addr_to_counts%(a: addr%): index_vec
%{ %{
VectorVal* rval = new VectorVal(internal_type("index_vec")->AsVectorType()); auto rval = make_intrusive<VectorVal>(internal_type("index_vec")->AsVectorType());
const uint32_t* bytes; const uint32_t* bytes;
int len = a->AsAddr().GetBytes(&bytes); int len = a->AsAddr().GetBytes(&bytes);
@ -2445,14 +2444,14 @@ function count_to_port%(num: count, proto: transport_proto%): port
function to_addr%(ip: string%): addr function to_addr%(ip: string%): addr
%{ %{
char* s = ip->AsString()->Render(); char* s = ip->AsString()->Render();
Val* ret = nullptr; IntrusivePtr<Val> ret;
in6_addr tmp; in6_addr tmp;
if ( IPAddr::ConvertString(s, &tmp) ) if ( IPAddr::ConvertString(s, &tmp) )
ret = new AddrVal(IPAddr(tmp)); ret = make_intrusive<AddrVal>(IPAddr(tmp));
else else
{ {
ret = new AddrVal(IPAddr()); ret = make_intrusive<AddrVal>(IPAddr());
builtin_error("failed converting string to IP address", ip); builtin_error("failed converting string to IP address", ip);
} }
@ -2490,7 +2489,7 @@ function to_subnet%(sn: string%): subnet
if ( ! IPPrefix::ConvertString(s, &tmp) ) if ( ! IPPrefix::ConvertString(s, &tmp) )
builtin_error("failed converting string to IP prefix", sn); builtin_error("failed converting string to IP prefix", sn);
Val* ret = new SubNetVal(tmp); auto ret = make_intrusive<SubNetVal>(tmp);
delete [] s; delete [] s;
return ret; return ret;
%} %}
@ -3045,7 +3044,7 @@ char* to_pat_str(int sn, const char* ss)
function convert_for_pattern%(s: string%): string function convert_for_pattern%(s: string%): string
%{ %{
char* t = to_pat_str(s->Len(), (const char*)(s->Bytes())); char* t = to_pat_str(s->Len(), (const char*)(s->Bytes()));
StringVal* ret = new StringVal(t); auto ret = make_intrusive<StringVal>(t);
delete [] t; delete [] t;
return ret; return ret;
%} %}
@ -3390,7 +3389,7 @@ function dump_current_packet%(file_name: string%) : bool
function get_current_packet%(%) : pcap_packet function get_current_packet%(%) : pcap_packet
%{ %{
const Packet* p; const Packet* p;
RecordVal* pkt = new RecordVal(pcap_packet); auto pkt = make_intrusive<RecordVal>(pcap_packet);
if ( ! current_pktsrc || if ( ! current_pktsrc ||
! current_pktsrc->GetCurrentPacket(&p) ) ! current_pktsrc->GetCurrentPacket(&p) )
@ -3976,7 +3975,7 @@ function mmdb_open_asn_db%(f: string%) : bool
## .. zeek:see:: lookup_asn ## .. zeek:see:: lookup_asn
function lookup_location%(a: addr%) : geo_location function lookup_location%(a: addr%) : geo_location
%{ %{
RecordVal* location = new RecordVal(geo_location); auto location = make_intrusive<RecordVal>(geo_location);
#ifdef USE_GEOIP #ifdef USE_GEOIP
mmdb_check_loc(); mmdb_check_loc();
@ -4601,12 +4600,13 @@ function get_file_name%(f: file%): string
## .. zeek:see:: rotate_file_by_name calc_next_rotate ## .. zeek:see:: rotate_file_by_name calc_next_rotate
function rotate_file%(f: file%): rotate_info function rotate_file%(f: file%): rotate_info
%{ %{
RecordVal* info = f->Rotate(); IntrusivePtr<RecordVal> info{AdoptRef{}, f->Rotate()};
if ( info ) if ( info )
return info; return info;
// Record indicating error. // Record indicating error.
info = new RecordVal(rotate_info); info = make_intrusive<RecordVal>(rotate_info);
info->Assign(0, val_mgr->EmptyString()); info->Assign(0, val_mgr->EmptyString());
info->Assign(1, val_mgr->EmptyString()); info->Assign(1, val_mgr->EmptyString());
info->Assign(2, make_intrusive<Val>(0.0, TYPE_TIME)); info->Assign(2, make_intrusive<Val>(0.0, TYPE_TIME));
@ -4625,7 +4625,7 @@ function rotate_file%(f: file%): rotate_info
## .. zeek:see:: rotate_file calc_next_rotate ## .. zeek:see:: rotate_file calc_next_rotate
function rotate_file_by_name%(f: string%): rotate_info function rotate_file_by_name%(f: string%): rotate_info
%{ %{
RecordVal* info = new RecordVal(rotate_info); auto info = make_intrusive<RecordVal>(rotate_info);
bool is_pkt_dumper = false; bool is_pkt_dumper = false;
bool is_addl_pkt_dumper = false; bool is_addl_pkt_dumper = false;
@ -4644,7 +4644,7 @@ function rotate_file_by_name%(f: string%): rotate_info
addl_pkt_dumper->Close(); addl_pkt_dumper->Close();
} }
FILE* file = rotate_file(f->CheckString(), info); FILE* file = rotate_file(f->CheckString(), info.get());
if ( ! file ) if ( ! file )
{ {
// Record indicating error. // Record indicating error.