Skip to content
Snippets Groups Projects
Commit 66d5fa86 authored by Botond Baranyi's avatar Botond Baranyi
Browse files

Legacy switch added for unions with unbound selected alternatives (artf717563)


Change-Id: Ie1bc4cdaa2aa49e0a851060fe2ceec3078a5d99d
Signed-off-by: default avatarBotond Baranyi <botond.baranyi@ericsson.com>
parent 5eefae6b
No related branches found
No related tags found
1 merge request!27Legacy switch added for unions with unbound selected alternatives (ar…
...@@ -69,6 +69,12 @@ Disables the generation of ...@@ -69,6 +69,12 @@ Disables the generation of
.I BER .I BER
encoder/decoder routines for all ASN.1 types. encoder/decoder routines for all ASN.1 types.
.TP .TP
.B \-B
Allows the selected field in a union value to be unbound, when setting module
parameters (legacy behavior). A warning is displayed whenever a union value
receives an unbound selected field and when a union with an unbound selected field
is copied.
.TP
.B \-c .B \-c
Write out Write out
.I checksums .I checksums
......
...@@ -94,7 +94,8 @@ boolean generate_skeleton = FALSE, force_overwrite = FALSE, ...@@ -94,7 +94,8 @@ boolean generate_skeleton = FALSE, force_overwrite = FALSE,
check_subtype = TRUE, suppress_context = FALSE, display_up_to_date = FALSE, check_subtype = TRUE, suppress_context = FALSE, display_up_to_date = FALSE,
implicit_json_encoding = FALSE, json_refs_for_all_types = TRUE, implicit_json_encoding = FALSE, json_refs_for_all_types = TRUE,
force_gen_seof = FALSE, omit_in_value_list = FALSE, force_gen_seof = FALSE, omit_in_value_list = FALSE,
warnings_for_bad_variants = FALSE, debugger_active = FALSE; warnings_for_bad_variants = FALSE, debugger_active = FALSE,
legacy_unbound_union_fields = FALSE;
// Default code splitting mode is set to 'no splitting'. // Default code splitting mode is set to 'no splitting'.
CodeGenHelper::split_type code_splitting_mode = CodeGenHelper::SPLIT_NONE; CodeGenHelper::split_type code_splitting_mode = CodeGenHelper::SPLIT_NONE;
...@@ -392,6 +393,7 @@ static void usage() ...@@ -392,6 +393,7 @@ static void usage()
"OPTIONS:\n" "OPTIONS:\n"
" -a: force XER in ASN.1 files\n" " -a: force XER in ASN.1 files\n"
" -b: disable BER encoder/decoder functions\n" " -b: disable BER encoder/decoder functions\n"
" -B: allow selected union field to be unbound (legacy behavior)\n"
" -c: write out checksums in case of error\n" " -c: write out checksums in case of error\n"
" -d: treat default fields as omit\n" " -d: treat default fields as omit\n"
" -E: display only warnings for unrecognized encoding variants\n" " -E: display only warnings for unrecognized encoding variants\n"
...@@ -479,7 +481,7 @@ int main(int argc, char *argv[]) ...@@ -479,7 +481,7 @@ int main(int argc, char *argv[])
dflag = false, Xflag = false, Rflag = false, gflag = false, aflag = false, dflag = false, Xflag = false, Rflag = false, gflag = false, aflag = false,
s0flag = false, Cflag = false, yflag = false, Uflag = false, Qflag = false, s0flag = false, Cflag = false, yflag = false, Uflag = false, Qflag = false,
Sflag = false, Kflag = false, jflag = false, zflag = false, Fflag = false, Sflag = false, Kflag = false, jflag = false, zflag = false, Fflag = false,
Mflag = false, Eflag = false, nflag = false, errflag = false, Mflag = false, Eflag = false, nflag = false, Bflag = false, errflag = false,
print_usage = false, ttcn2json = false; print_usage = false, ttcn2json = false;
CodeGenHelper cgh; CodeGenHelper cgh;
...@@ -572,7 +574,7 @@ int main(int argc, char *argv[]) ...@@ -572,7 +574,7 @@ int main(int argc, char *argv[])
if (!ttcn2json) { if (!ttcn2json) {
for ( ; ; ) { for ( ; ; ) {
int c = getopt(argc, argv, "aA:bcC:dEfFgijK:lLMno:pP:qQ:rRsStT:uU:vV:wxXyYz:0-"); int c = getopt(argc, argv, "aA:bBcC:dEfFgijK:lLMno:pP:qQ:rRsStT:uU:vV:wxXyYz:0-");
if (c == -1) break; if (c == -1) break;
switch (c) { switch (c) {
case 'a': case 'a':
...@@ -747,6 +749,10 @@ int main(int argc, char *argv[]) ...@@ -747,6 +749,10 @@ int main(int argc, char *argv[])
SET_FLAG(n); SET_FLAG(n);
debugger_active = TRUE; debugger_active = TRUE;
break; break;
case 'B':
SET_FLAG(B);
legacy_unbound_union_fields = TRUE;
break;
case 'Q': { case 'Q': {
long max_errs; long max_errs;
...@@ -792,7 +798,7 @@ int main(int argc, char *argv[]) ...@@ -792,7 +798,7 @@ int main(int argc, char *argv[])
bflag || fflag || iflag || lflag || oflag || pflag || qflag || bflag || fflag || iflag || lflag || oflag || pflag || qflag ||
rflag || sflag || tflag || uflag || wflag || xflag || Xflag || Rflag || rflag || sflag || tflag || uflag || wflag || xflag || Xflag || Rflag ||
Uflag || yflag || Kflag || jflag || zflag || Fflag || Mflag || Eflag || Uflag || yflag || Kflag || jflag || zflag || Fflag || Mflag || Eflag ||
nflag) { nflag || Bflag) {
errflag = true; errflag = true;
print_usage = true; print_usage = true;
} }
......
...@@ -49,7 +49,8 @@ extern boolean generate_skeleton, force_overwrite, include_line_info, ...@@ -49,7 +49,8 @@ extern boolean generate_skeleton, force_overwrite, include_line_info,
output_only_linenum, default_as_optional, use_runtime_2, gcc_compat, asn1_xer, output_only_linenum, default_as_optional, use_runtime_2, gcc_compat, asn1_xer,
check_subtype, suppress_context, enable_set_bound_out_param, display_up_to_date, check_subtype, suppress_context, enable_set_bound_out_param, display_up_to_date,
implicit_json_encoding, json_refs_for_all_types, force_gen_seof, implicit_json_encoding, json_refs_for_all_types, force_gen_seof,
omit_in_value_list, warnings_for_bad_variants, debugger_active; omit_in_value_list, warnings_for_bad_variants, debugger_active,
legacy_unbound_union_fields;
extern const char *expected_platform; extern const char *expected_platform;
......
...@@ -136,10 +136,22 @@ void defUnionClass(struct_def const *sdef, output_struct *output) ...@@ -136,10 +136,22 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
"{\n" "{\n"
"switch (other_value.union_selection) {\n", name, name); "switch (other_value.union_selection) {\n", name, name);
for (i = 0; i < sdef->nElements; i++) { for (i = 0; i < sdef->nElements; i++) {
src = mputprintf(src, "case %s_%s:\n" src = mputprintf(src, "case %s_%s:\n", selection_prefix, sdef->elements[i].name);
"field_%s = new %s(*other_value.field_%s);\n" if (legacy_unbound_union_fields) {
"break;\n", selection_prefix, sdef->elements[i].name, src = mputprintf(src, "if (other_value.field_%s->is_bound()) ",
sdef->elements[i].name);
}
src = mputprintf(src, "field_%s = new %s(*other_value.field_%s);\n",
sdef->elements[i].name, sdef->elements[i].type, sdef->elements[i].name); sdef->elements[i].name, sdef->elements[i].type, sdef->elements[i].name);
if (legacy_unbound_union_fields) {
src = mputprintf(src,
"else {\n"
"field_%s = new %s;\n"
"TTCN_warning(\"Assignment of a union value with an unbound selected "
"alternative\");\n"
"}\n", sdef->elements[i].name, sdef->elements[i].type);
}
src = mputstr(src, "break;\n");
} }
src = mputprintf(src, "default:\n" src = mputprintf(src, "default:\n"
"TTCN_error(\"Assignment of an unbound union value of type %s.\");\n" "TTCN_error(\"Assignment of an unbound union value of type %s.\");\n"
...@@ -383,16 +395,27 @@ void defUnionClass(struct_def const *sdef, output_struct *output) ...@@ -383,16 +395,27 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
" }\n" " }\n"
" Module_Param* mp_last = m_p->get_elem(m_p->get_size()-1);\n", dispname); " Module_Param* mp_last = m_p->get_elem(m_p->get_size()-1);\n", dispname);
for (i = 0; i < sdef->nElements; i++) { for (i = 0; i < sdef->nElements; i++) {
src = mputprintf(src, src = mputprintf(src,
" if (!strcmp(mp_last->get_id()->get_name(), \"%s\")) {\n" " if (!strcmp(mp_last->get_id()->get_name(), \"%s\")) {\n"
" %s%s().set_param(*mp_last);\n" " %s%s().set_param(*mp_last);\n"
" if (!%s%s().is_bound()) "
, sdef->elements[i].dispname, at_field, sdef->elements[i].name
, at_field, sdef->elements[i].name);
if (legacy_unbound_union_fields) {
src = mputprintf(src,
"TTCN_warning(\"Alternative '%s' was selected for union of type '%s', "
"but its value is unbound\");\n"
, sdef->elements[i].dispname, sdef->dispname);
}
else {
// a union's alternative cannot be unbound // a union's alternative cannot be unbound
" if (!%s%s().is_bound()) clean_up();\n" src = mputstr(src, "clean_up();\n");
" return;\n"
" }\n", sdef->elements[i].dispname, at_field, sdef->elements[i].name,
at_field, sdef->elements[i].name);
} }
src = mputstr(src,
" return;\n"
" }\n");
}
src = mputprintf(src, src = mputprintf(src,
" mp_last->error(\"Field %%s does not exist in type %s.\", mp_last->get_id()->get_name());\n" " mp_last->error(\"Field %%s does not exist in type %s.\", mp_last->get_id()->get_name());\n"
"}\n\n", dispname); "}\n\n", dispname);
......
No preview for this file type
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment