diff options
author | Björn Gustavsson <[email protected]> | 2013-05-31 06:58:28 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2013-08-26 14:04:23 +0200 |
commit | 777cf498fb8735121f99eb3bb8f1dacab47c18c3 (patch) | |
tree | 10bc9ee62006b5aad4f8314205e1c906b7eae93f /lib | |
parent | 8369dbfe5b5d70de339f9a8a84931d4ba354d6e7 (diff) | |
download | otp-777cf498fb8735121f99eb3bb8f1dacab47c18c3.tar.gz otp-777cf498fb8735121f99eb3bb8f1dacab47c18c3.tar.bz2 otp-777cf498fb8735121f99eb3bb8f1dacab47c18c3.zip |
Encode SEQUENCE OF / SET OF using a list comprehension
Using a list comprehension will simplify both the code generator
and the generated code. Also, if there is an ObjFun argument in
the host function, the BEAM compiler will make sure it is only
passed to the generated list comprehension function if it is
actually used.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/asn1/src/asn1ct_constructed_per.erl | 71 |
1 files changed, 26 insertions, 45 deletions
diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl index d279e9697f..614512e7ea 100644 --- a/lib/asn1/src/asn1ct_constructed_per.erl +++ b/lib/asn1/src/asn1ct_constructed_per.erl @@ -511,11 +511,32 @@ gen_encode_sof(Erule,Typename,SeqOrSetOf,D) when is_record(D,type) -> "" end, gen_encode_length(Erule, SizeConstraint), - emit({indent(3),"'enc_",asn1ct_gen:list2name(Typename), - "_components'(Val",ObjFun,", [])"}), - emit({nl,"].",nl}), - gen_encode_sof_components(Erule, Typename, SeqOrSetOf, ComponentType). - + emit(["[begin",nl]), + Constructed_Suffix = + asn1ct_gen:constructed_suffix(SeqOrSetOf, + ComponentType#type.def), + Conttype = asn1ct_gen:get_inner(ComponentType#type.def), + Currmod = get(currmod), + case asn1ct_gen:type(Conttype) of + {primitive,bif} -> + asn1ct_gen_per:gen_encode_prim(Erule, ComponentType, "Comp"); + {constructed,bif} -> + NewTypename = [Constructed_Suffix|Typename], + emit(["'enc_",asn1ct_gen:list2name(NewTypename), + "'(Comp",ObjFun,")"]); + #'Externaltypereference'{module=Currmod,type=Ename} -> + emit(["'enc_",Ename,"'(Comp)"]); + #'Externaltypereference'{module=EMod,type=EType} -> + emit(["'",EMod,"':'enc_",EType,"'(Comp)"]); + 'ASN1_OPEN_TYPE' -> + asn1ct_gen_per:gen_encode_prim(Erule, + #type{def='ASN1_OPEN_TYPE'}, + "Comp"); + _ -> + emit(["'enc_",Conttype,"'(Comp)"]) + end, + emit([nl, + "end || Comp <- Val]].",nl,nl]). %% Logic copied from asn1_per_bin_rt2ct:encode_constrained_number gen_encode_length(per, {Lb,Ub}) when Ub =< 65535, Lb >= 0 -> @@ -586,46 +607,6 @@ gen_decode_length(Constraint, Erule) -> Imm = asn1ct_imm:per_dec_length(Constraint, true, is_aligned(Erule)), asn1ct_imm:dec_slim_cg(Imm, "Bytes"). -gen_encode_sof_components(Erule,Typename,SeqOrSetOf,Cont) -> - {ObjFun,ObjFun_Var} = - case Cont#type.tablecinf of - [{objfun,_}|_R] -> - {", ObjFun",", _"}; - _ -> - {"",""} - end, - emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'([]", - ObjFun_Var,", Acc) -> lists:reverse(Acc);",nl,nl}), - emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'([H|T]", - ObjFun,", Acc) ->",nl}), - emit({"'enc_",asn1ct_gen:list2name(Typename),"_components'(T"}), - emit({ObjFun,", ["}), - %% the component encoder - Constructed_Suffix = asn1ct_gen:constructed_suffix(SeqOrSetOf, - Cont#type.def), - - Conttype = asn1ct_gen:get_inner(Cont#type.def), - Currmod = get(currmod), - case asn1ct_gen:type(Conttype) of - {primitive,bif} -> - asn1ct_gen_per:gen_encode_prim(Erule, Cont, "H"); - {constructed,bif} -> - NewTypename = [Constructed_Suffix|Typename], - emit({"'enc_",asn1ct_gen:list2name(NewTypename),"'(H", - ObjFun,")",nl,nl}); - #'Externaltypereference'{module=Currmod,type=Ename} -> - emit({"'enc_",Ename,"'(H)",nl,nl}); - #'Externaltypereference'{module=EMod,type=EType} -> - emit({"'",EMod,"':'enc_",EType,"'(H)",nl,nl}); - 'ASN1_OPEN_TYPE' -> - asn1ct_gen_per:gen_encode_prim(Erule, - #type{def='ASN1_OPEN_TYPE'}, - "H"); - _ -> - emit({"'enc_",Conttype,"'(H)",nl,nl}) - end, - emit({" | Acc]).",nl}). - gen_decode_sof_components(Erule,Typename,SeqOrSetOf,Cont) -> {ObjFun,ObjFun_Var} = case Cont#type.tablecinf of |