aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2013-08-27 14:41:52 +0200
committerBjörn Gustavsson <[email protected]>2013-08-30 10:13:18 +0200
commitc6ba0f6aa81c2b9ce9b348106bffb808b385bd18 (patch)
treea25cf949061b83990ed096aad3964af2416f6f15
parenta9a6646832b6ea67ecc8350f1e1df995a5b9ae74 (diff)
downloadotp-c6ba0f6aa81c2b9ce9b348106bffb808b385bd18.tar.gz
otp-c6ba0f6aa81c2b9ce9b348106bffb808b385bd18.tar.bz2
otp-c6ba0f6aa81c2b9ce9b348106bffb808b385bd18.zip
Refactor decoding of components of SEQUENCE OF / SET OF
As a preparation for rewriting handling of table constraints, we must make sure that code for decoding a SEQUENCE OF / SET OF can be be contained in a single clause of a function; thus, we must not output the helper function for decoding of each component directly following the code that follows it. Use asn1ct_func:call_gen/3 to delay outputting the helper function.
-rw-r--r--lib/asn1/src/asn1ct_constructed_per.erl26
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/asn1/src/asn1ct_constructed_per.erl b/lib/asn1/src/asn1ct_constructed_per.erl
index 92f087cc4d..f609cf31d0 100644
--- a/lib/asn1/src/asn1ct_constructed_per.erl
+++ b/lib/asn1/src/asn1ct_constructed_per.erl
@@ -597,10 +597,15 @@ gen_decode_sof(Erules,Typename,SeqOrSetOf,D) when is_record(D,type) ->
""
end,
{Num,Buf} = gen_decode_length(SizeConstraint, Erules),
+ Key = erlang:md5(term_to_binary({Typename,SeqOrSetOf,ComponentType})),
+ Gen = fun(_Fd, Name) ->
+ gen_decode_sof_components(Erules, Name,
+ Typename, SeqOrSetOf,
+ ComponentType)
+ end,
+ F = asn1ct_func:call_gen("dec_components", Key, Gen),
emit([",",nl,
- "'dec_",asn1ct_gen:list2name(Typename),
- "_components'(",Num,", ",Buf,ObjFun,", []).",nl,nl]),
- gen_decode_sof_components(Erules, Typename, SeqOrSetOf, ComponentType).
+ {asis,F},"(",Num,", ",Buf,ObjFun,", []).",nl,nl]).
is_aligned(per) -> true;
is_aligned(uper) -> false.
@@ -610,7 +615,7 @@ gen_decode_length(Constraint, Erule) ->
Imm = asn1ct_imm:per_dec_length(Constraint, true, is_aligned(Erule)),
asn1ct_imm:dec_slim_cg(Imm, "Bytes").
-gen_decode_sof_components(Erule,Typename,SeqOrSetOf,Cont) ->
+gen_decode_sof_components(Erule, Name, Typename, SeqOrSetOf, Cont) ->
{ObjFun,ObjFun_Var} =
case Cont#type.tablecinf of
[{objfun,_}|_R] ->
@@ -618,12 +623,10 @@ gen_decode_sof_components(Erule,Typename,SeqOrSetOf,Cont) ->
_ ->
{"",""}
end,
- emit({"'dec_",asn1ct_gen:list2name(Typename),
- "_components'(0, Bytes",ObjFun_Var,", Acc) ->",nl,
- indent(3),"{lists:reverse(Acc), Bytes};",nl}),
- emit({"'dec_",asn1ct_gen:list2name(Typename),
- "_components'(Num, Bytes",ObjFun,", Acc) ->",nl}),
- emit({indent(3),"{Term,Remain} = "}),
+ emit([{asis,Name},"(0, Bytes",ObjFun_Var,", Acc) ->",nl,
+ "{lists:reverse(Acc),Bytes};",nl,
+ {asis,Name},"(Num, Bytes",ObjFun,", Acc) ->",nl,
+ "{Term,Remain} = "]),
Constructed_Suffix = asn1ct_gen:constructed_suffix(SeqOrSetOf,
Cont#type.def),
Conttype = asn1ct_gen:get_inner(Cont#type.def),
@@ -646,8 +649,7 @@ gen_decode_sof_components(Erule,Typename,SeqOrSetOf,Cont) ->
_ ->
emit({"'dec_",Conttype,"'(Bytes),",nl})
end,
- emit({indent(3),"'dec_",asn1ct_gen:list2name(Typename),
- "_components'(Num-1, Remain",ObjFun,", [Term|Acc]).",nl}).
+ emit([{asis,Name},"(Num-1, Remain",ObjFun,", [Term|Acc]).",nl]).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%