diff options
author | Björn Gustavsson <[email protected]> | 2014-04-16 14:35:23 +0200 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2014-05-06 11:40:08 +0200 |
commit | 8eadd0297d9676a9004673f9efa2574283942f9f (patch) | |
tree | 503d6cc33bba0f4f2859bae5d017ff35359371d7 /lib/asn1/src/asn1ct_gen_ber_bin_v2.erl | |
parent | a86d63b3940c19dedb6ebcf0f684fa9641a9833e (diff) | |
download | otp-8eadd0297d9676a9004673f9efa2574283942f9f.tar.gz otp-8eadd0297d9676a9004673f9efa2574283942f9f.tar.bz2 otp-8eadd0297d9676a9004673f9efa2574283942f9f.zip |
BER: Optimize decoding of ENUMERATED
Diffstat (limited to 'lib/asn1/src/asn1ct_gen_ber_bin_v2.erl')
-rw-r--r-- | lib/asn1/src/asn1ct_gen_ber_bin_v2.erl | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl index 4c08f24619..bf5d649029 100644 --- a/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl +++ b/lib/asn1/src/asn1ct_gen_ber_bin_v2.erl @@ -537,7 +537,7 @@ gen_dec_prim(Att, BytesVar, DoTag) -> [{curr,val},{asis,NNL}]}]) end); {'ENUMERATED',NNL} -> - call(decode_enumerated, [BytesVar,{asis,NNL},TagStr]); + gen_dec_enumerated(BytesVar, NNL, TagStr); 'REAL' -> asn1ct_name:new(tmpbuf), emit(["begin",nl, @@ -677,6 +677,32 @@ check_constraint(F, Args, Constr, PreConstr0, ReturnVal0) -> "end",nl, "end"]) end. + +gen_dec_enumerated(BytesVar, NNL0, TagStr) -> + asn1ct_name:new(enum), + emit(["case ", + {call,ber,decode_integer,[BytesVar,TagStr]}, + " of",nl]), + NNL = case NNL0 of + {L1,L2} -> + L1 ++ L2 ++ [accept]; + [_|_] -> + NNL0 ++ [error] + end, + gen_dec_enumerated_1(NNL), + emit("end"). + +gen_dec_enumerated_1([accept]) -> + asn1ct_name:new(default), + emit([{curr,default}," -> {asn1_enum,",{curr,default},"}",nl]); +gen_dec_enumerated_1([error]) -> + asn1ct_name:new(default), + emit([{curr,default}," -> exit({error,{asn1,{illegal_enumerated,", + {curr,default},"}}})",nl]); +gen_dec_enumerated_1([{V,K}|T]) -> + emit([{asis,K}," -> ",{asis,V},";",nl]), + gen_dec_enumerated_1(T). + %% Object code generating for encoding and decoding %% ------------------------------------------------ |