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",
|
"&deprecated",
|
||||||
"&is_assigned",
|
"&is_assigned",
|
||||||
"&is_used",
|
"&is_used",
|
||||||
|
"&ordered",
|
||||||
};
|
};
|
||||||
|
|
||||||
return attr_names[int(t)];
|
return attr_names[int(t)];
|
||||||
|
@ -624,6 +625,11 @@ void Attributes::CheckAttr(Attr* a)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ATTR_ORDERED:
|
||||||
|
if ( type->Tag() != TYPE_TABLE )
|
||||||
|
Error("&ordered only applicable to tables");
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
BadTag("Attributes::CheckAttr", attr_name(a->Tag()));
|
BadTag("Attributes::CheckAttr", attr_name(a->Tag()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ enum AttrTag
|
||||||
ATTR_DEPRECATED,
|
ATTR_DEPRECATED,
|
||||||
ATTR_IS_ASSIGNED, // to suppress usage warnings
|
ATTR_IS_ASSIGNED, // to suppress usage warnings
|
||||||
ATTR_IS_USED, // 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
|
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)
|
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));
|
SetAttrs(std::move(a));
|
||||||
|
|
||||||
if ( ! run_state::is_parsing )
|
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);
|
table_type = std::move(t);
|
||||||
expire_func = nullptr;
|
expire_func = nullptr;
|
||||||
|
@ -1423,7 +1424,11 @@ void TableVal::Init(TableTypePtr t)
|
||||||
subnets = nullptr;
|
subnets = nullptr;
|
||||||
|
|
||||||
table_hash = new detail::CompositeHash(table_type->GetIndices());
|
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);
|
table_val->SetDeleteFunc(table_entry_val_delete_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -998,7 +998,7 @@ public:
|
||||||
void EnableChangeNotifications() { in_change_func = false; }
|
void EnableChangeNotifications() { in_change_func = false; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void Init(TableTypePtr t);
|
void Init(TableTypePtr t, bool ordered = false);
|
||||||
|
|
||||||
using TableRecordDependencies = std::unordered_map<RecordType*, std::vector<TableValPtr>>;
|
using TableRecordDependencies = std::unordered_map<RecordType*, std::vector<TableValPtr>>;
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
// Switching parser table type fixes ambiguity problems.
|
// Switching parser table type fixes ambiguity problems.
|
||||||
%define lr.type ielr
|
%define lr.type ielr
|
||||||
|
|
||||||
%expect 199
|
%expect 205
|
||||||
|
|
||||||
%token TOK_ADD TOK_ADD_TO TOK_ADDR TOK_ANY
|
%token TOK_ADD TOK_ADD_TO TOK_ADDR TOK_ANY
|
||||||
%token TOK_ATENDIF TOK_ATELSE TOK_ATIF TOK_ATIFDEF TOK_ATIFNDEF
|
%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_BROKER_STORE_ALLOW_COMPLEX TOK_ATTR_BACKEND
|
||||||
%token TOK_ATTR_PRIORITY TOK_ATTR_LOG TOK_ATTR_ERROR_HANDLER
|
%token TOK_ATTR_PRIORITY TOK_ATTR_LOG TOK_ATTR_ERROR_HANDLER
|
||||||
%token TOK_ATTR_TYPE_COLUMN TOK_ATTR_DEPRECATED
|
%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
|
%token TOK_DEBUG
|
||||||
|
|
||||||
|
@ -1730,6 +1730,8 @@ attr:
|
||||||
$$ = new Attr(ATTR_DEPRECATED);
|
$$ = new Attr(ATTR_DEPRECATED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
| TOK_ATTR_ORDERED
|
||||||
|
{ $$ = new Attr(ATTR_ORDERED); }
|
||||||
;
|
;
|
||||||
|
|
||||||
stmt:
|
stmt:
|
||||||
|
|
|
@ -330,6 +330,7 @@ when return TOK_WHEN;
|
||||||
&broker_store return TOK_ATTR_BROKER_STORE;
|
&broker_store return TOK_ATTR_BROKER_STORE;
|
||||||
&broker_allow_complex_type return TOK_ATTR_BROKER_STORE_ALLOW_COMPLEX;
|
&broker_allow_complex_type return TOK_ATTR_BROKER_STORE_ALLOW_COMPLEX;
|
||||||
&backend return TOK_ATTR_BACKEND;
|
&backend return TOK_ATTR_BACKEND;
|
||||||
|
&ordered return TOK_ATTR_ORDERED;
|
||||||
|
|
||||||
@deprecated.* {
|
@deprecated.* {
|
||||||
auto num_files = file_stack.length();
|
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