Make types into constants

Closes #4173

This allows types to be used in expressions, but they can't be
reassigned. Note that this was meant to be a special "type expression" -
but that is unnecessary complexity.

Type expressions would allow access to the type without going through
its constant value, but the constant value is never changed, so it's
simply a few more checks if necessary when functionality gets expanded.
This way, ZAM and other code will not need updates, so the potential for
increased work in the future is probably not worth caring about.
This commit is contained in:
Evan Typanski 2025-01-24 11:05:31 -05:00
parent fdf887ce3b
commit 0c27aa6c50
4 changed files with 69 additions and 32 deletions

3
NEWS
View file

@ -16,6 +16,9 @@ New Functionality
Zeek now raises a warning when a script declares these events while this Zeek now raises a warning when a script declares these events while this
option is set to true. option is set to true.
- Types can now be used as constants in Zeek script. This allows types to be
directly passed into BIFs without aliasing.
Changed Functionality Changed Functionality
--------------------- ---------------------

View file

@ -64,7 +64,7 @@
%type <expr> expr opt_expr rhs opt_init anonymous_function lambda_body index_slice opt_deprecated when_condition %type <expr> expr opt_expr rhs opt_init anonymous_function lambda_body index_slice opt_deprecated when_condition
%type <event_expr> event %type <event_expr> event
%type <stmt> stmt stmt_list func_body for_head %type <stmt> stmt stmt_list func_body for_head
%type <type> type opt_type enum_body %type <type> simple_type type opt_type enum_body
%type <func_type> func_hdr func_params %type <func_type> func_hdr func_params
%type <type_l> type_list %type <type_l> type_list
%type <type_decl> type_decl formal_args_decl %type <type_decl> type_decl formal_args_decl
@ -1026,6 +1026,13 @@ expr:
$$ = new ConstExpr({AdoptRef{}, $1}); $$ = new ConstExpr({AdoptRef{}, $1});
} }
| simple_type
{
set_location(@1);
TypePtr ty{AdoptRef(), $1};
$$ = new ConstExpr(make_intrusive<TypeVal>(ty, true));
}
| '/' { begin_RE(); } TOK_PATTERN_TEXT TOK_PATTERN_END | '/' { begin_RE(); } TOK_PATTERN_TEXT TOK_PATTERN_END
{ {
set_location(@3); set_location(@3);
@ -1153,63 +1160,75 @@ enum_body_elem:
} }
; ;
type: simple_type:
TOK_BOOL { TOK_BOOL
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_BOOL)->Ref(); $$ = base_type(TYPE_BOOL)->Ref();
} }
| TOK_INT { | TOK_INT
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_INT)->Ref(); $$ = base_type(TYPE_INT)->Ref();
} }
| TOK_COUNT { | TOK_COUNT
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_COUNT)->Ref(); $$ = base_type(TYPE_COUNT)->Ref();
} }
| TOK_DOUBLE { | TOK_DOUBLE
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_DOUBLE)->Ref(); $$ = base_type(TYPE_DOUBLE)->Ref();
} }
| TOK_TIME { | TOK_TIME
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_TIME)->Ref(); $$ = base_type(TYPE_TIME)->Ref();
} }
| TOK_INTERVAL { | TOK_INTERVAL
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_INTERVAL)->Ref(); $$ = base_type(TYPE_INTERVAL)->Ref();
} }
| TOK_STRING { | TOK_STRING
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_STRING)->Ref(); $$ = base_type(TYPE_STRING)->Ref();
} }
| TOK_PATTERN { | TOK_PATTERN
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_PATTERN)->Ref(); $$ = base_type(TYPE_PATTERN)->Ref();
} }
| TOK_PORT { | TOK_PORT
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_PORT)->Ref(); $$ = base_type(TYPE_PORT)->Ref();
} }
| TOK_ADDR { | TOK_ADDR
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_ADDR)->Ref(); $$ = base_type(TYPE_ADDR)->Ref();
} }
| TOK_SUBNET { | TOK_SUBNET
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_SUBNET)->Ref(); $$ = base_type(TYPE_SUBNET)->Ref();
} }
| TOK_ANY { | TOK_ANY
{
set_location(@1); set_location(@1);
$$ = base_type(TYPE_ANY)->Ref(); $$ = base_type(TYPE_ANY)->Ref();
} }
@ -1265,24 +1284,6 @@ type:
$$ = new VectorType({AdoptRef{}, $3}); $$ = new VectorType({AdoptRef{}, $3});
} }
| TOK_FUNCTION func_params
{
set_location(@1, @2);
$$ = $2;
}
| TOK_EVENT '(' formal_args ')'
{
set_location(@1, @3);
$$ = new FuncType({AdoptRef{}, $3}, nullptr, FUNC_FLAVOR_EVENT);
}
| TOK_HOOK '(' formal_args ')'
{
set_location(@1, @3);
$$ = new FuncType({AdoptRef{}, $3}, base_type(TYPE_BOOL), FUNC_FLAVOR_HOOK);
}
| TOK_FILE TOK_OF type | TOK_FILE TOK_OF type
{ {
set_location(@1, @3); set_location(@1, @3);
@ -1301,6 +1302,26 @@ type:
$$ = new OpaqueType($3); $$ = new OpaqueType($3);
} }
type:
simple_type
| TOK_FUNCTION func_params
{
set_location(@1, @2);
$$ = $2;
}
| TOK_HOOK '(' formal_args ')'
{
set_location(@1, @3);
$$ = new FuncType({AdoptRef{}, $3}, base_type(TYPE_BOOL), FUNC_FLAVOR_HOOK);
}
| TOK_EVENT '(' formal_args ')'
{
set_location(@1, @3);
$$ = new FuncType({AdoptRef{}, $3}, nullptr, FUNC_FLAVOR_EVENT);
}
| resolve_id | resolve_id
{ {
if ( ! $1 || ! ($$ = $1->IsType() ? $1->GetType().get() : nullptr) ) if ( ! $1 || ! ($$ = $1->IsType() ? $1->GetType().get() : nullptr) )

View file

@ -0,0 +1,3 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63.
[v=aoeu, valid=T]
type

View file

@ -0,0 +1,10 @@
# @TEST-DOC: Test valid use of type expressions in scripts
# @TEST-EXEC: zeek -b %INPUT
# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stdout
event zeek_init()
{
# Try a couple of functions that take types
print from_json("\"aoeu\"", string);
print type_name(string);
}