@@ -611,6 +611,35 @@ enc_object_element(Encoder* e, int first, ERL_NIF_TERM curr, ERL_NIF_TERM* stack
611
611
return 0 ;
612
612
}
613
613
614
+ ERL_NIF_TERM
615
+ enc_array_element (Encoder * e , int first , ERL_NIF_TERM curr , ERL_NIF_TERM * stackp )
616
+ {
617
+ ErlNifEnv * env = e -> env ;
618
+ ERL_NIF_TERM stack = * stackp ;
619
+ ERL_NIF_TERM item ;
620
+
621
+ if (first && !enc_start_array (e )) {
622
+ return enc_error (e , "internal_error" );
623
+ }
624
+ if (enif_is_empty_list (env , curr )) {
625
+ if (!enc_end_array (e )) {
626
+ return enc_error (e , "internal_error" );
627
+ }
628
+ return 0 ;
629
+ }
630
+ if (!enif_get_list_cell (env , curr , & item , & curr )) {
631
+ return enc_error (e , "internal_error" );
632
+ }
633
+ if (!first && !enc_comma (e )) {
634
+ return enc_error (e , "internal_error" );
635
+ }
636
+ stack = enif_make_list_cell (env , curr , stack );
637
+ stack = enif_make_list_cell (env , e -> atoms -> ref_array , stack );
638
+ stack = enif_make_list_cell (env , item , stack );
639
+ * stackp = stack ;
640
+ return 0 ;
641
+ }
642
+
614
643
ERL_NIF_TERM
615
644
encode_init (ErlNifEnv * env , int argc , const ERL_NIF_TERM argv [])
616
645
{
@@ -732,24 +761,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
732
761
ret = enc_error (e , "internal_error" );
733
762
goto done ;
734
763
}
735
- if (enif_is_empty_list (env , curr )) {
736
- if (!enc_end_array (e )) {
737
- ret = enc_error (e , "internal_error" );
738
- goto done ;
739
- }
740
- continue ;
741
- }
742
- if (!enc_comma (e )) {
743
- ret = enc_error (e , "internal_error" );
744
- goto done ;
745
- }
746
- if (!enif_get_list_cell (env , curr , & item , & curr )) {
747
- ret = enc_error (e , "internal_error" );
748
- goto done ;
749
- }
750
- stack = enif_make_list_cell (env , curr , stack );
751
- stack = enif_make_list_cell (env , e -> atoms -> ref_array , stack );
752
- stack = enif_make_list_cell (env , item , stack );
764
+ ret = enc_array_element (e , 0 , curr , & stack );
765
+ if (ret ) { goto done ; }
753
766
} else if (enif_compare (curr , e -> atoms -> atom_null ) == 0 ) {
754
767
if (!enc_literal (e , "null" , 4 )) {
755
768
ret = enc_error (e , "null" );
@@ -813,24 +826,8 @@ encode_iter(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
813
826
stack = enif_make_list_cell (env , curr , stack );
814
827
#endif
815
828
} else if (enif_is_list (env , curr )) {
816
- if (!enc_start_array (e )) {
817
- ret = enc_error (e , "internal_error" );
818
- goto done ;
819
- }
820
- if (enif_is_empty_list (env , curr )) {
821
- if (!enc_end_array (e )) {
822
- ret = enc_error (e , "internal_error" );
823
- goto done ;
824
- }
825
- continue ;
826
- }
827
- if (!enif_get_list_cell (env , curr , & item , & curr )) {
828
- ret = enc_error (e , "internal_error" );
829
- goto done ;
830
- }
831
- stack = enif_make_list_cell (env , curr , stack );
832
- stack = enif_make_list_cell (env , e -> atoms -> ref_array , stack );
833
- stack = enif_make_list_cell (env , item , stack );
829
+ ret = enc_array_element (e , 1 , curr , & stack );
830
+ if (ret ) { goto done ; }
834
831
} else {
835
832
if (!enc_unknown (e , curr )) {
836
833
ret = enc_error (e , "internal_error" );
0 commit comments