@@ -665,6 +665,122 @@ bool read_preproc_directive(void)
665
665
666
666
void read_parameter_list_decl (func_t * func , int anon );
667
667
668
+ /* Forward declaration for ternary handling used by initializers */
669
+ void read_ternary_operation (block_t * parent , basic_block_t * * bb );
670
+
671
+ /* Parse array initializer to determine size for implicit arrays and
672
+ * optionally emit initialization code.
673
+ */
674
+ void parse_array_init (var_t * var ,
675
+ block_t * parent ,
676
+ basic_block_t * * bb ,
677
+ int emit_code )
678
+ {
679
+ int elem_size = var -> type -> size ;
680
+ int count = 0 ;
681
+ var_t * base_addr = NULL ;
682
+
683
+ /* Store values if we need to emit code later for implicit arrays */
684
+ var_t * stored_vals [256 ]; /* Max 256 elements for now */
685
+ int is_implicit = (var -> array_size == 0 );
686
+
687
+ /* If emitting code and size is known, arrays are already addresses */
688
+ if (emit_code && !is_implicit ) {
689
+ /* Arrays are already addresses, no need for OP_address_of */
690
+ base_addr = var ;
691
+ }
692
+
693
+ lex_expect (T_open_curly );
694
+ if (!lex_peek (T_close_curly , NULL )) {
695
+ for (;;) {
696
+ /* Parse element expression */
697
+ read_expr (parent , bb );
698
+ read_ternary_operation (parent , bb );
699
+ var_t * val = opstack_pop ();
700
+
701
+ /* Store value for implicit arrays */
702
+ if (is_implicit && emit_code && count < 256 )
703
+ stored_vals [count ] = val ;
704
+
705
+ if (emit_code && !is_implicit && count < var -> array_size ) {
706
+ /* Emit code for explicit size arrays */
707
+ var_t target ;
708
+ memset (& target , 0 , sizeof (target ));
709
+ target .type = var -> type ;
710
+ target .is_ptr = 0 ;
711
+ var_t * v = resize_var (parent , bb , val , & target );
712
+
713
+ /* Compute element address: base + count*elem_size */
714
+ var_t * elem_addr = base_addr ;
715
+ if (count > 0 ) {
716
+ var_t * offset = require_var (parent );
717
+ gen_name_to (offset -> var_name );
718
+ offset -> init_val = count * elem_size ;
719
+ add_insn (parent , * bb , OP_load_constant , offset , NULL , NULL ,
720
+ 0 , NULL );
721
+
722
+ var_t * addr = require_var (parent );
723
+ gen_name_to (addr -> var_name );
724
+ add_insn (parent , * bb , OP_add , addr , base_addr , offset , 0 ,
725
+ NULL );
726
+ elem_addr = addr ;
727
+ }
728
+
729
+ /* Write element */
730
+ add_insn (parent , * bb , OP_write , NULL , elem_addr , v , elem_size ,
731
+ NULL );
732
+ }
733
+
734
+ count ++ ;
735
+ if (!lex_accept (T_comma ))
736
+ break ;
737
+ if (lex_peek (T_close_curly , NULL ))
738
+ break ;
739
+ }
740
+ }
741
+ lex_expect (T_close_curly );
742
+
743
+ /* For implicit size arrays, set the size and emit code */
744
+ if (is_implicit ) {
745
+ if (var -> is_ptr > 0 )
746
+ var -> is_ptr = 0 ;
747
+ var -> array_size = count ;
748
+
749
+ /* Now emit the code since we know the size */
750
+ if (emit_code && count > 0 ) {
751
+ base_addr = var ; /* Arrays are already addresses */
752
+
753
+ for (int i = 0 ; i < count && i < 256 ; i ++ ) {
754
+ var_t target ;
755
+ memset (& target , 0 , sizeof (target ));
756
+ target .type = var -> type ;
757
+ target .is_ptr = 0 ;
758
+ var_t * v = resize_var (parent , bb , stored_vals [i ], & target );
759
+
760
+ /* Compute element address */
761
+ var_t * elem_addr = base_addr ;
762
+ if (i > 0 ) {
763
+ var_t * offset = require_var (parent );
764
+ gen_name_to (offset -> var_name );
765
+ offset -> init_val = i * elem_size ;
766
+ add_insn (parent , * bb , OP_load_constant , offset , NULL , NULL ,
767
+ 0 , NULL );
768
+
769
+ var_t * addr = require_var (parent );
770
+ gen_name_to (addr -> var_name );
771
+ add_insn (parent , * bb , OP_add , addr , base_addr , offset , 0 ,
772
+ NULL );
773
+ elem_addr = addr ;
774
+ }
775
+
776
+ /* Write element */
777
+ add_insn (parent , * bb , OP_write , NULL , elem_addr , v , elem_size ,
778
+ NULL );
779
+ }
780
+ }
781
+ }
782
+ }
783
+
668
784
void read_inner_var_decl (var_t * vd , int anon , int is_param )
669
785
{
670
786
vd -> init_val = 0 ;
@@ -885,7 +1001,6 @@ void read_char_param(block_t *parent, basic_block_t *bb)
885
1001
}
886
1002
887
1003
void read_logical (opcode_t op , block_t * parent , basic_block_t * * bb );
888
- void read_ternary_operation (block_t * parent , basic_block_t * * bb );
889
1004
void read_func_parameters (func_t * func , block_t * parent , basic_block_t * * bb )
890
1005
{
891
1006
int param_num = 0 ;
@@ -969,6 +1084,7 @@ void read_expr_operand(block_t *parent, basic_block_t **bb)
969
1084
read_literal_param (parent , * bb );
970
1085
else if (lex_peek (T_char , NULL ))
971
1086
read_char_param (parent , * bb );
1087
+
972
1088
else if (lex_peek (T_numeric , NULL ))
973
1089
read_numeric_param (parent , * bb , is_neg );
974
1090
else if (lex_accept (T_log_not )) {
@@ -3068,11 +3184,17 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
3068
3184
add_insn (parent , bb , OP_allocat , var , NULL , NULL , 0 , NULL );
3069
3185
add_symbol (bb , var );
3070
3186
if (lex_accept (T_assign )) {
3071
- read_expr (parent , & bb );
3072
- read_ternary_operation (parent , & bb );
3187
+ if (lex_peek (T_open_curly , NULL ) &&
3188
+ (var -> array_size > 0 || var -> is_ptr > 0 )) {
3189
+ parse_array_init (var , parent , & bb ,
3190
+ 1 ); /* Always emit code */
3191
+ } else {
3192
+ read_expr (parent , & bb );
3193
+ read_ternary_operation (parent , & bb );
3073
3194
3074
- rs1 = resize_var (parent , & bb , opstack_pop (), var );
3075
- add_insn (parent , bb , OP_assign , var , rs1 , NULL , 0 , NULL );
3195
+ rs1 = resize_var (parent , & bb , opstack_pop (), var );
3196
+ add_insn (parent , bb , OP_assign , var , rs1 , NULL , 0 , NULL );
3197
+ }
3076
3198
}
3077
3199
while (lex_accept (T_comma )) {
3078
3200
var_t * nv ;
@@ -3086,11 +3208,16 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
3086
3208
add_insn (parent , bb , OP_allocat , nv , NULL , NULL , 0 , NULL );
3087
3209
add_symbol (bb , nv );
3088
3210
if (lex_accept (T_assign )) {
3089
- read_expr (parent , & bb );
3090
- read_ternary_operation (parent , & bb );
3211
+ if (lex_peek (T_open_curly , NULL ) &&
3212
+ (nv -> array_size > 0 || nv -> is_ptr > 0 )) {
3213
+ parse_array_init (nv , parent , & bb , 1 );
3214
+ } else {
3215
+ read_expr (parent , & bb );
3216
+ read_ternary_operation (parent , & bb );
3091
3217
3092
- rs1 = resize_var (parent , & bb , opstack_pop (), nv );
3093
- add_insn (parent , bb , OP_assign , nv , rs1 , NULL , 0 , NULL );
3218
+ rs1 = resize_var (parent , & bb , opstack_pop (), nv );
3219
+ add_insn (parent , bb , OP_assign , nv , rs1 , NULL , 0 , NULL );
3220
+ }
3094
3221
}
3095
3222
}
3096
3223
lex_expect (T_semicolon );
@@ -3150,11 +3277,18 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
3150
3277
add_insn (parent , bb , OP_allocat , var , NULL , NULL , 0 , NULL );
3151
3278
add_symbol (bb , var );
3152
3279
if (lex_accept (T_assign )) {
3153
- read_expr (parent , & bb );
3154
- read_ternary_operation (parent , & bb );
3280
+ if (lex_peek (T_open_curly , NULL ) &&
3281
+ (var -> array_size > 0 || var -> is_ptr > 0 )) {
3282
+ parse_array_init (
3283
+ var , parent , & bb ,
3284
+ 1 ); /* FIXED: Emit code for locals in functions */
3285
+ } else {
3286
+ read_expr (parent , & bb );
3287
+ read_ternary_operation (parent , & bb );
3155
3288
3156
- rs1 = resize_var (parent , & bb , opstack_pop (), var );
3157
- add_insn (parent , bb , OP_assign , var , rs1 , NULL , 0 , NULL );
3289
+ rs1 = resize_var (parent , & bb , opstack_pop (), var );
3290
+ add_insn (parent , bb , OP_assign , var , rs1 , NULL , 0 , NULL );
3291
+ }
3158
3292
}
3159
3293
while (lex_accept (T_comma )) {
3160
3294
var_t * nv ;
@@ -3168,10 +3302,16 @@ basic_block_t *read_body_statement(block_t *parent, basic_block_t *bb)
3168
3302
add_insn (parent , bb , OP_allocat , nv , NULL , NULL , 0 , NULL );
3169
3303
add_symbol (bb , nv );
3170
3304
if (lex_accept (T_assign )) {
3171
- read_expr (parent , & bb );
3305
+ if (lex_peek (T_open_curly , NULL ) &&
3306
+ (nv -> array_size > 0 || nv -> is_ptr > 0 )) {
3307
+ parse_array_init (nv , parent , & bb ,
3308
+ 1 ); /* FIXED: Emit code for locals */
3309
+ } else {
3310
+ read_expr (parent , & bb );
3172
3311
3173
- rs1 = resize_var (parent , & bb , opstack_pop (), nv );
3174
- add_insn (parent , bb , OP_assign , nv , rs1 , NULL , 0 , NULL );
3312
+ rs1 = resize_var (parent , & bb , opstack_pop (), nv );
3313
+ add_insn (parent , bb , OP_assign , nv , rs1 , NULL , 0 , NULL );
3314
+ }
3175
3315
}
3176
3316
}
3177
3317
lex_expect (T_semicolon );
0 commit comments