diff --git a/NEWS b/NEWS index 64bf414e91..803456ea52 100644 --- a/NEWS +++ b/NEWS @@ -135,6 +135,22 @@ New Functionality - The QUIC analyzer has been extended to support analyzing QUIC Version 2 INITIAL packets (RFC 9369). +- Conditional directives (``@if``, ``@ifdef``, ``@ifndef``, ``@else`` and + ``@endif``) can now be placed within a record's definition to conditionally + define or extend a record type's fields. + + type r: record { + c: count; + @if ( cond ) + d: double; + @else + d: count; + @endif + }; + + Note that generally you should prefer record extension in conditionally loaded + scripts rather than using conditional directives in the original record definition. + Changed Functionality --------------------- diff --git a/src/parse.y b/src/parse.y index 69fe94eda8..9107d13ed0 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1319,9 +1319,9 @@ type_list: ; type_decl_list: - type_decl_list type_decl + type_decl_list conditional_list type_decl { - $1->push_back($2); + $1->push_back($3); } | { diff --git a/testing/btest/Baseline/language.at-if-record-2/.stderr b/testing/btest/Baseline/language.at-if-record-2/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-2/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-2/.stdout b/testing/btest/Baseline/language.at-if-record-2/.stdout new file mode 100644 index 0000000000..e17b663120 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-2/.stdout @@ -0,0 +1,6 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[d] = [type_name=double, log=F, value=, default_val=, optional=F], +[s] = [type_name=string, log=F, value=, default_val=, optional=F] +} diff --git a/testing/btest/Baseline/language.at-if-record-3/.stderr b/testing/btest/Baseline/language.at-if-record-3/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-3/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-3/.stdout b/testing/btest/Baseline/language.at-if-record-3/.stdout new file mode 100644 index 0000000000..8657db43e0 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-3/.stdout @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[s] = [type_name=string, log=F, value=, default_val=, optional=F] +} diff --git a/testing/btest/Baseline/language.at-if-record-4/.stderr b/testing/btest/Baseline/language.at-if-record-4/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-4/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-4/.stdout b/testing/btest/Baseline/language.at-if-record-4/.stdout new file mode 100644 index 0000000000..009640e091 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-4/.stdout @@ -0,0 +1,6 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[s] = [type_name=string, log=F, value=, default_val=, optional=F], +[z] = [type_name=addr, log=F, value=, default_val=, optional=F] +} diff --git a/testing/btest/Baseline/language.at-if-record-5/.stderr b/testing/btest/Baseline/language.at-if-record-5/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-5/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-5/.stdout b/testing/btest/Baseline/language.at-if-record-5/.stdout new file mode 100644 index 0000000000..6cd8a2f0d6 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-5/.stdout @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=0, optional=T], +[d] = [type_name=double, log=F, value=, default_val=0.0, optional=T] +} diff --git a/testing/btest/Baseline/language.at-if-record-6/.stderr b/testing/btest/Baseline/language.at-if-record-6/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-6/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-6/.stdout b/testing/btest/Baseline/language.at-if-record-6/.stdout new file mode 100644 index 0000000000..3e98dc116b --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-6/.stdout @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[d] = [type_name=double, log=F, value=, default_val=, optional=F] +} diff --git a/testing/btest/Baseline/language.at-if-record-7/.stderr b/testing/btest/Baseline/language.at-if-record-7/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-7/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record-7/.stdout b/testing/btest/Baseline/language.at-if-record-7/.stdout new file mode 100644 index 0000000000..4a7878a446 --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record-7/.stdout @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[d] = [type_name=double, log=F, value=, default_val=42.0, optional=T] +} diff --git a/testing/btest/Baseline/language.at-if-record/.stderr b/testing/btest/Baseline/language.at-if-record/.stderr new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record/.stderr @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/Baseline/language.at-if-record/.stdout b/testing/btest/Baseline/language.at-if-record/.stdout new file mode 100644 index 0000000000..3e98dc116b --- /dev/null +++ b/testing/btest/Baseline/language.at-if-record/.stdout @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +r, { +[c] = [type_name=count, log=F, value=, default_val=, optional=F], +[d] = [type_name=double, log=F, value=, default_val=, optional=F] +} diff --git a/testing/btest/language/at-if-record.zeek b/testing/btest/language/at-if-record.zeek new file mode 100644 index 0000000000..7fbef48b80 --- /dev/null +++ b/testing/btest/language/at-if-record.zeek @@ -0,0 +1,85 @@ +# @TEST-DOC: Test that @if conditionals are allowed within record definitions. +# +# @TEST-REQUIRES: test "${ZEEK_USE_CPP}" != "1" +# @TEST-EXEC: zeek -b %INPUT common.zeek +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stdout +# @TEST-EXEC: TEST_DIFF_CANONIFIER= btest-diff .stderr + +type r: record { + c: count; +@if ( T ) + d: double; +@endif +}; + +# @TEST-START-NEXT +type r: record { + c: count; +@if ( T ) + d: double; + s: string; +@endif +}; + +# @TEST-START-NEXT +type r: record { + c: count; +@if ( F ) + d: double; +@else + s: string; +@endif +}; + +# @TEST-START-NEXT +type r: record { + c: count; +@if ( F ) + d: double; +@else + s: string; +@endif + z: addr; +}; + +# @TEST-START-NEXT +type r: record {}; + +redef record r += { + c: count &default=0; +@if ( T ) + d: double &default=0.0; +@endif +}; + +# @TEST-START-NEXT +# Pretty strange usage. +@if ( T ) +type r: record { + c: count; +@endif + d: double; +}; + +# @TEST-START-NEXT +# Even more strange. +@if ( T ) +type r: record { + c: count; +@endif + +@if ( F ) + d: double &default=1.0;; +}; +@else + d: double &default=42.0; +}; +@endif + + +# @TEST-START-FILE common.zeek +event zeek_init() + { + print "r", record_fields(r); + } +# @TEST-END-FILE