mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 14:48:21 +00:00
Add &ordered attribute for tables/sets
This commit is contained in:
parent
e3682a09e0
commit
bd7df9e2bf
9 changed files with 56 additions and 6 deletions
|
@ -40,6 +40,7 @@ const char* attr_name(AttrTag t)
|
|||
"&deprecated",
|
||||
"&is_assigned",
|
||||
"&is_used",
|
||||
"&ordered",
|
||||
};
|
||||
|
||||
return attr_names[int(t)];
|
||||
|
@ -624,6 +625,11 @@ void Attributes::CheckAttr(Attr* a)
|
|||
break;
|
||||
}
|
||||
|
||||
case ATTR_ORDERED:
|
||||
if ( type->Tag() != TYPE_TABLE )
|
||||
Error("&ordered only applicable to tables");
|
||||
break;
|
||||
|
||||
default:
|
||||
BadTag("Attributes::CheckAttr", attr_name(a->Tag()));
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@ enum AttrTag
|
|||
ATTR_DEPRECATED,
|
||||
ATTR_IS_ASSIGNED, // to suppress usage warnings
|
||||
ATTR_IS_USED, // to suppress usage warnings
|
||||
ATTR_ORDERED, // used to store tables in ordered mode
|
||||
NUM_ATTRS // this item should always be last
|
||||
};
|
||||
|
||||
|
|
11
src/Val.cc
11
src/Val.cc
|
@ -1389,7 +1389,8 @@ static void find_nested_record_types(const TypePtr& t, std::set<RecordType*>* fo
|
|||
|
||||
TableVal::TableVal(TableTypePtr t, detail::AttributesPtr a) : Val(t)
|
||||
{
|
||||
Init(std::move(t));
|
||||
bool ordered = (a != nullptr && a->Find(detail::ATTR_ORDERED) != nullptr);
|
||||
Init(std::move(t), ordered);
|
||||
SetAttrs(std::move(a));
|
||||
|
||||
if ( ! run_state::is_parsing )
|
||||
|
@ -1408,7 +1409,7 @@ TableVal::TableVal(TableTypePtr t, detail::AttributesPtr a) : Val(t)
|
|||
}
|
||||
}
|
||||
|
||||
void TableVal::Init(TableTypePtr t)
|
||||
void TableVal::Init(TableTypePtr t, bool ordered)
|
||||
{
|
||||
table_type = std::move(t);
|
||||
expire_func = nullptr;
|
||||
|
@ -1423,7 +1424,11 @@ void TableVal::Init(TableTypePtr t)
|
|||
subnets = nullptr;
|
||||
|
||||
table_hash = new detail::CompositeHash(table_type->GetIndices());
|
||||
table_val = new PDict<TableEntryVal>;
|
||||
if ( ordered )
|
||||
table_val = new PDict<TableEntryVal>(DictOrder::ORDERED);
|
||||
else
|
||||
table_val = new PDict<TableEntryVal>(DictOrder::UNORDERED);
|
||||
|
||||
table_val->SetDeleteFunc(table_entry_val_delete_func);
|
||||
}
|
||||
|
||||
|
|
|
@ -998,7 +998,7 @@ public:
|
|||
void EnableChangeNotifications() { in_change_func = false; }
|
||||
|
||||
protected:
|
||||
void Init(TableTypePtr t);
|
||||
void Init(TableTypePtr t, bool ordered = false);
|
||||
|
||||
using TableRecordDependencies = std::unordered_map<RecordType*, std::vector<TableValPtr>>;
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
// Switching parser table type fixes ambiguity problems.
|
||||
%define lr.type ielr
|
||||
|
||||
%expect 199
|
||||
%expect 205
|
||||
|
||||
%token TOK_ADD TOK_ADD_TO TOK_ADDR TOK_ANY
|
||||
%token TOK_ATENDIF TOK_ATELSE TOK_ATIF TOK_ATIFDEF TOK_ATIFNDEF
|
||||
|
@ -29,7 +29,7 @@
|
|||
%token TOK_ATTR_BROKER_STORE_ALLOW_COMPLEX TOK_ATTR_BACKEND
|
||||
%token TOK_ATTR_PRIORITY TOK_ATTR_LOG TOK_ATTR_ERROR_HANDLER
|
||||
%token TOK_ATTR_TYPE_COLUMN TOK_ATTR_DEPRECATED
|
||||
%token TOK_ATTR_IS_ASSIGNED TOK_ATTR_IS_USED
|
||||
%token TOK_ATTR_IS_ASSIGNED TOK_ATTR_IS_USED TOK_ATTR_ORDERED
|
||||
|
||||
%token TOK_DEBUG
|
||||
|
||||
|
@ -1730,6 +1730,8 @@ attr:
|
|||
$$ = new Attr(ATTR_DEPRECATED);
|
||||
}
|
||||
}
|
||||
| TOK_ATTR_ORDERED
|
||||
{ $$ = new Attr(ATTR_ORDERED); }
|
||||
;
|
||||
|
||||
stmt:
|
||||
|
|
|
@ -330,6 +330,7 @@ when return TOK_WHEN;
|
|||
&broker_store return TOK_ATTR_BROKER_STORE;
|
||||
&broker_allow_complex_type return TOK_ATTR_BROKER_STORE_ALLOW_COMPLEX;
|
||||
&backend return TOK_ATTR_BACKEND;
|
||||
&ordered return TOK_ATTR_ORDERED;
|
||||
|
||||
@deprecated.* {
|
||||
auto num_files = file_stack.length();
|
||||
|
|
1
testing/btest/Baseline/language.table-iteration/.stderr
Normal file
1
testing/btest/Baseline/language.table-iteration/.stderr
Normal file
|
@ -0,0 +1 @@
|
|||
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
|
7
testing/btest/Baseline/language.table-iteration/out
Normal file
7
testing/btest/Baseline/language.table-iteration/out
Normal file
|
@ -0,0 +1,7 @@
|
|||
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
|
||||
2
|
||||
1
|
||||
3
|
||||
1
|
||||
2
|
||||
3
|
27
testing/btest/language/table-iteration.zeek
Normal file
27
testing/btest/language/table-iteration.zeek
Normal file
|
@ -0,0 +1,27 @@
|
|||
# @TEST-EXEC: zeek -b %INPUT >out
|
||||
# @TEST-EXEC: btest-diff out
|
||||
# @TEST-EXEC: btest-diff .stderr
|
||||
|
||||
global tbl: table[count] of count;
|
||||
global tbl2: table[count] of count &ordered;
|
||||
|
||||
event zeek_init()
|
||||
{
|
||||
local i = 0;
|
||||
while ( i < 3 )
|
||||
{
|
||||
++i;
|
||||
tbl[i] = i;
|
||||
tbl2[i] = i;
|
||||
}
|
||||
|
||||
for ( [k], v in tbl )
|
||||
{
|
||||
print(v);
|
||||
}
|
||||
|
||||
for ( [k], v in tbl2 )
|
||||
{
|
||||
print(v);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue