diff --git a/compiler2/Value.cc b/compiler2/Value.cc index 85a7c5742fccc8a26de84b1f6dde930f57045997..2c641816cc594e34b85c913e86faf19be1c6ba8b 100644 --- a/compiler2/Value.cc +++ b/compiler2/Value.cc @@ -13917,10 +13917,14 @@ void Value::chk_expr_operand_execute_refd(Value *v1, expr->expr = mputprintf(expr->expr, "oct2bit(%s)", tmp_id.c_str()); if (expr2.postamble) expr->postamble = mputstr(expr->postamble, expr2.postamble); - } else + } else { + if (expr2.preamble != NULL) { + expr->preamble = mputstr(expr->preamble, expr2.preamble); + } expr->expr = mputprintf(expr->expr, "%s(%s%s)", gov_last->get_legacy_coding_function(true)->get_genname_from_scope(scope).c_str(), expr2.expr, is_templ ? ".valueof()" : ""); + } } else { // new codec handling Type* gov = templ->get_my_governor(); @@ -14168,6 +14172,9 @@ void Value::chk_expr_operand_execute_refd(Value *v1, if (expr2.postamble) expr->postamble = mputstr(expr->postamble, expr2.postamble); } else { + if (expr2.preamble != NULL) { + expr->preamble = mputstr(expr->preamble, expr2.preamble); + } expr->expr = mputprintf(expr->expr, "oct2unichar(bit2oct(%s(%s%s)), %s)", gov_last->get_legacy_coding_function(true)->get_genname_from_scope(scope).c_str(), expr2.expr, is_templ ? ".valueof()" : "", v2_code); diff --git a/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc b/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc index bd90dc8620897b4b13ff1c60c624a860429376b7..ecbf260464ed438a1511e7c82c5132fe24dbf6d2 100644 --- a/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc +++ b/regression_test/nondeterministicDefaultParam/ExternalFunctions.cc @@ -26,4 +26,8 @@ void ef__reset() current_number = 0; } +BITSTRING ef__enc__uni(const Uni& x) { + return int2bit(x.i(), 8); +} + } diff --git a/regression_test/nondeterministicDefaultParam/Resources.ttcn b/regression_test/nondeterministicDefaultParam/Resources.ttcn index dbc720ba28ba96d8ab62774e5e73332f0495b0d1..5f2b6e7392d3d0b4a8bed4b0199d878363aafd31 100644 --- a/regression_test/nondeterministicDefaultParam/Resources.ttcn +++ b/regression_test/nondeterministicDefaultParam/Resources.ttcn @@ -38,6 +38,18 @@ type set Set { record of integer roi } +type union Uni { + integer i +} +with { + encode "custom" +} + + +// Custom encoding function for type Uni (equivalent to an 'int2bit' on the integer field) +external function ef_enc_uni(in Uni x) return bitstring + with { extension "prototype(convert) encode(custom)" } + type component CT {} /******************** Templates *********************/ @@ -86,4 +98,6 @@ template Set t_set_template_lists( template Set.roi p3 := { [0] := 0, [ef_next_number()] := 3 }) := { soi1 := p1, soi2 := p2, roi := p3 }; +template Uni t_uni(template integer p := ef_next_number()) := { i := p }; + } diff --git a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn index 29263fa47c0f4489634b980337adea86a048c8d2..e7a843afb5bc727a3b8f8939ced555e8aeabc284 100644 --- a/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn +++ b/regression_test/nondeterministicDefaultParam/TestsRT1.ttcn @@ -172,6 +172,34 @@ testcase tc_pard_def_template_lists() runs on CT } } +testcase tc_pard_def_encvalue_w_custom_encoding() runs on CT +{ + ef_reset(); + var bitstring results[4] := { encvalue(t_uni), encvalue(t_uni()), encvalue(t_uni(-)), encvalue(t_uni(p := -)) }; + var bitstring exp_results[4] := { '00010110'B, '00010110'B, '00010110'B, '00010110'B }; + if (results == exp_results) { + setverdict(pass); + } + else { + setverdict(fail, "Got: ", results, ", expected: ", exp_results); + } +} + +testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT +{ + ef_reset(); + var universal charstring results[4] := { encvalue_unichar(t_uni), encvalue_unichar(t_uni()), + encvalue_unichar(t_uni(-)), encvalue_unichar(t_uni(p := -)) }; + var universal charstring exp_results[4] := { char(0, 0, 0, 22), char(0, 0, 0, 22), + char(0, 0, 0, 22), char(0, 0, 0, 22) }; + if (results == exp_results) { + setverdict(pass); + } + else { + setverdict(fail, "Got: ", results, ", expected: ", exp_results); + } +} + control { execute(tc_pard_def_int()); execute(tc_pard_def_int_expr()); @@ -183,6 +211,8 @@ control { execute(tc_pard_def_set()); execute(tc_pard_def_rec_named_template_list()); execute(tc_pard_def_template_lists()); + execute(tc_pard_def_encvalue_w_custom_encoding()); + execute(tc_pard_def_encvalue_unichar_w_custom_encoding()); } } diff --git a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn index 94faa453a473daf57dde7e17fdcba88326032982..23603d14fe49b003fe331cde2b8445be863b930e 100644 --- a/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn +++ b/regression_test/nondeterministicDefaultParam/TestsRT2.ttcn @@ -170,6 +170,34 @@ testcase tc_pard_def_template_lists() runs on CT } } +testcase tc_pard_def_encvalue_w_custom_encoding() runs on CT +{ + ef_reset(); + var bitstring results[4] := { encvalue(t_uni), encvalue(t_uni()), encvalue(t_uni(-)), encvalue(t_uni(p := -)) }; + var bitstring exp_results[4] := { '00000001'B, '00000010'B, '00000011'B, '00000100'B }; + if (results == exp_results) { + setverdict(pass); + } + else { + setverdict(fail, "Got: ", results, ", expected: ", exp_results); + } +} + +testcase tc_pard_def_encvalue_unichar_w_custom_encoding() runs on CT +{ + ef_reset(); + var universal charstring results[4] := { encvalue_unichar(t_uni), encvalue_unichar(t_uni()), + encvalue_unichar(t_uni(-)), encvalue_unichar(t_uni(p := -)) }; + var universal charstring exp_results[4] := { char(0, 0, 0, 1), char(0, 0, 0, 2), + char(0, 0, 0, 3), char(0, 0, 0, 4) }; + if (results == exp_results) { + setverdict(pass); + } + else { + setverdict(fail, "Got: ", results, ", expected: ", exp_results); + } +} + control { execute(tc_pard_def_int()); execute(tc_pard_def_int_expr()); @@ -181,6 +209,8 @@ control { execute(tc_pard_def_set()); execute(tc_pard_def_rec_named_template_list()); execute(tc_pard_def_template_lists()); + execute(tc_pard_def_encvalue_w_custom_encoding()); + execute(tc_pard_def_encvalue_unichar_w_custom_encoding()); } }