@@ -176,7 +176,7 @@ namespace clib {
176
176
return 1 ;
177
177
if (ptr == 1 )
178
178
return LEX_SIZE (type);
179
- return sizeof (void *);
179
+ return sizeof (void *);
180
180
}
181
181
if (t == x_matrix) {
182
182
// TODO: Fix bug, ID Assignment L-Value
@@ -285,7 +285,7 @@ namespace clib {
285
285
}
286
286
287
287
sym_id_t::sym_id_t (const type_t ::ref &base, const string_t &id)
288
- : base(base), id(id) {}
288
+ : base(base), id(id) {}
289
289
290
290
symbol_t sym_id_t::get_type () const {
291
291
return s_id;
@@ -364,9 +364,12 @@ namespace clib {
364
364
int sym_struct_t::size (sym_size_t t) const {
365
365
if (_size == 0 ) {
366
366
if (_struct) {
367
- for (auto & decl : decls) {
367
+ for (auto & decl : decls) {
368
368
decl->addr = _size;
369
- *const_cast <int *>(&_size) += decl->size (t);
369
+ auto size = decl->size (t);
370
+ if ((size & 3 ) != 0 )
371
+ size += 4 - (size & 3 );
372
+ *const_cast <int *>(&_size) += size;
370
373
decl->addr_end = _size;
371
374
}
372
375
} else {
@@ -477,19 +480,30 @@ namespace clib {
477
480
* [38] 8B-4B double转float
478
481
*/
479
482
static int _cast[][12 ] = { // 转换矩阵
480
- /* [SRC] [DST] C UC S US I UI L UL F D P T */
481
- /* char */ { 0 , 1 , 13 , 1 , 13 , 1 , 13 , 3 , 21 , 31 , 1 , -1 },
482
- /* uchar */ { 2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
483
- /* short */ { 0 , 1 , 0 , 1 , 14 , 1 , 14 , 3 , 21 , 31 , 1 , -1 },
484
- /* ushort */ { 2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
485
- /* int */ { 0 , 1 , 0 , 1 , 0 , 1 , 9 , 3 , 21 , 31 , 1 , -1 },
486
- /* uint */ { 2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
487
- /* long */ { 11 , 5 , 11 , 5 , 11 , 5 , 0 , 7 , 23 , 33 , 5 , -1 },
488
- /* ulong */ { 6 , 12 , 6 , 12 , 6 , 12 , 8 , 0 , 22 , 32 , 12 , -1 },
489
- /* float */ { 25 , 24 , 25 , 24 , 25 , 24 , 27 , 26 , 0 , 28 , -1 , -1 },
490
- /* double */ { 35 , 34 , 35 , 34 , 35 , 34 , 37 , 36 , 38 , 0 , -1 , -1 },
491
- /* ptr */ { 2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , -1 , -1 , 0 , -1 },
492
- /* struct */ { -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 },
483
+ /* [SRC] [DST] C UC S US I UI L UL F D P T */
484
+ /* char */ {0 , 1 , 13 , 1 , 13 , 1 , 13 , 3 , 21 , 31 , 1 , -1 },
485
+ /* uchar */
486
+ {2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
487
+ /* short */
488
+ {0 , 1 , 0 , 1 , 14 , 1 , 14 , 3 , 21 , 31 , 1 , -1 },
489
+ /* ushort */
490
+ {2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
491
+ /* int */
492
+ {0 , 1 , 0 , 1 , 0 , 1 , 9 , 3 , 21 , 31 , 1 , -1 },
493
+ /* uint */
494
+ {2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , 20 , 30 , 0 , -1 },
495
+ /* long */
496
+ {11 , 5 , 11 , 5 , 11 , 5 , 0 , 7 , 23 , 33 , 5 , -1 },
497
+ /* ulong */
498
+ {6 , 12 , 6 , 12 , 6 , 12 , 8 , 0 , 22 , 32 , 12 , -1 },
499
+ /* float */
500
+ {25 , 24 , 25 , 24 , 25 , 24 , 27 , 26 , 0 , 28 , -1 , -1 },
501
+ /* double */
502
+ {35 , 34 , 35 , 34 , 35 , 34 , 37 , 36 , 38 , 0 , -1 , -1 },
503
+ /* ptr */
504
+ {2 , 0 , 2 , 0 , 2 , 0 , 4 , 10 , -1 , -1 , 0 , -1 },
505
+ /* struct */
506
+ {-1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0 },
493
507
};
494
508
return _cast[src][dst];
495
509
}
@@ -549,6 +563,27 @@ namespace clib {
549
563
return base->size (t);
550
564
}
551
565
566
+ gen_t type_exp_t::gen_invoke (igen &gen, sym_t ::ref &list) {
567
+ assert (list->get_type () == s_list);
568
+ auto args = std::dynamic_pointer_cast<sym_list_t >(list);
569
+ auto &exps = args->exps ;
570
+ auto total_size = 0 ;
571
+ for (size_t i = 0 ; i < exps.size (); ++i) {
572
+ exps[i]->gen_rvalue (gen);
573
+ auto exp_type = exps[i]->base ->get_cast ();
574
+ auto c = exp_type == t_struct ? exps[i]->size (x_size) : cast_size (exp_type);
575
+ gen.emit (PUSH, c);
576
+ total_size += c;
577
+ }
578
+ gen_rvalue (gen);
579
+ gen.emit (CALL);
580
+ if (!exps.empty ()) {
581
+ gen.emit (ADJ, total_size / 4 );
582
+ }
583
+ base = std::make_shared<type_base_t >(l_int);
584
+ return g_ok;
585
+ }
586
+
552
587
sym_var_t::sym_var_t (const type_t ::ref &base, ast_node *node) : type_exp_t (base), node(node) {
553
588
line = node->line ;
554
589
column = node->column ;
@@ -624,7 +659,7 @@ namespace clib {
624
659
}
625
660
626
661
sym_var_id_t::sym_var_id_t (const type_t ::ref &base, ast_node *node, const sym_t ::ref &symbol)
627
- : sym_var_t (base, node), id(symbol) {}
662
+ : sym_var_t (base, node), id(symbol) {}
628
663
629
664
symbol_t sym_var_id_t::get_type () const {
630
665
return s_var_id;
@@ -718,7 +753,7 @@ namespace clib {
718
753
}
719
754
720
755
sym_unop_t::sym_unop_t (const type_exp_t ::ref &exp, ast_node *op)
721
- : type_exp_t (nullptr ), exp(exp), op(op) {
756
+ : type_exp_t (nullptr ), exp(exp), op(op) {
722
757
line = exp ->line ;
723
758
column = exp ->column ;
724
759
}
@@ -858,7 +893,7 @@ namespace clib {
858
893
}
859
894
860
895
sym_sinop_t::sym_sinop_t (const type_exp_t ::ref &exp, ast_node *op)
861
- : type_exp_t (nullptr ), exp(exp), op(op) {
896
+ : type_exp_t (nullptr ), exp(exp), op(op) {
862
897
line = exp ->line ;
863
898
column = exp ->column ;
864
899
}
@@ -941,7 +976,7 @@ namespace clib {
941
976
}
942
977
943
978
sym_binop_t::sym_binop_t (const type_exp_t ::ref &exp1, const type_exp_t ::ref &exp2, ast_node *op)
944
- : type_exp_t (nullptr ), exp1(exp1), exp2(exp2), op(op) {
979
+ : type_exp_t (nullptr ), exp1(exp1), exp2(exp2), op(op) {
945
980
line = exp1->line ;
946
981
column = exp1->column ;
947
982
}
@@ -1260,7 +1295,7 @@ namespace clib {
1260
1295
1261
1296
sym_triop_t::sym_triop_t (const type_exp_t ::ref &exp1, const type_exp_t ::ref &exp2,
1262
1297
const type_exp_t ::ref &exp3, ast_node *op1, ast_node *op2)
1263
- : type_exp_t (nullptr ), exp1(exp1), exp2(exp2), exp3(exp3), op1(op1), op2(op2) {
1298
+ : type_exp_t (nullptr ), exp1(exp1), exp2(exp2), exp3(exp3), op1(op1), op2(op2) {
1264
1299
line = exp1->line ;
1265
1300
column = exp1->column ;
1266
1301
}
@@ -1443,15 +1478,15 @@ namespace clib {
1443
1478
error (" main() not defined" );
1444
1479
}
1445
1480
auto magic = string_t (PE_MAGIC);
1446
- std::copy ((byte*) magic.data (), (byte*) magic.data () + magic.size (), std::back_inserter (file));
1481
+ std::copy ((byte *) magic.data (), (byte *) magic.data () + magic.size (), std::back_inserter (file));
1447
1482
auto addr = std::dynamic_pointer_cast<sym_func_t >(entry->second )->addr ;
1448
- std::copy ((byte*) &addr, (byte*) &addr + sizeof (addr), std::back_inserter (file));
1483
+ std::copy ((byte *) &addr, (byte *) &addr + sizeof (addr), std::back_inserter (file));
1449
1484
auto data_size = data.size () * sizeof (data[0 ]);
1450
- std::copy ((byte*) &data_size, (byte*) &data_size + sizeof (data_size), std::back_inserter (file));
1485
+ std::copy ((byte *) &data_size, (byte *) &data_size + sizeof (data_size), std::back_inserter (file));
1451
1486
auto text_size = text.size () * sizeof (text[0 ]);
1452
- std::copy ((byte*) &text_size, (byte*) &text_size + sizeof (text_size), std::back_inserter (file));
1487
+ std::copy ((byte *) &text_size, (byte *) &text_size + sizeof (text_size), std::back_inserter (file));
1453
1488
std::copy (data.begin (), data.end (), std::back_inserter (file));
1454
- std::copy ((byte*) text.data (), (byte*) text.data () + text_size, std::back_inserter (file));
1489
+ std::copy ((byte *) text.data (), (byte *) text.data () + text_size, std::back_inserter (file));
1455
1490
return file;
1456
1491
}
1457
1492
@@ -2705,7 +2740,7 @@ namespace clib {
2705
2740
((char *) &node->data ._ins ) + size,
2706
2741
std::back_inserter (data));
2707
2742
if (delta > 0 ) {
2708
- *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2743
+ *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2709
2744
}
2710
2745
} else {
2711
2746
load_string (node->data ._string );
@@ -2720,7 +2755,7 @@ namespace clib {
2720
2755
data.data () + var2->addr_end ,
2721
2756
std::back_inserter (data));
2722
2757
if (delta > 0 ) {
2723
- *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2758
+ *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2724
2759
}
2725
2760
} else if (init->get_type () == s_unop) {
2726
2761
auto v1 = std::dynamic_pointer_cast<sym_unop_t >(init);
@@ -2735,27 +2770,27 @@ namespace clib {
2735
2770
case ast_char:
2736
2771
case ast_short:
2737
2772
case ast_int:
2738
- *(((int *) (data.data () + data.size ())) - 1 ) = -*(((int *) (data.data () + data.size ())) - 1 );
2773
+ *(((int *) (data.data () + data.size ())) - 1 ) = -*(((int *) (data.data () + data.size ())) - 1 );
2739
2774
if (delta > 0 ) {
2740
- *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2775
+ *(((int *) (data.data () + data.size ())) - 1 ) += delta;
2741
2776
}
2742
2777
break ;
2743
2778
case ast_long:
2744
- *(((int64*) (data.data () + data.size ())) - 1 ) = -*(((int64*) (data.data () + data.size ())) - 1 );
2779
+ *(((int64 *) (data.data () + data.size ())) - 1 ) = -*(((int64 *) (data.data () + data.size ())) - 1 );
2745
2780
if (delta > 0 ) {
2746
- *(((int64*) (data.data () + data.size ())) - 1 ) += (int64) delta;
2781
+ *(((int64 *) (data.data () + data.size ())) - 1 ) += (int64) delta;
2747
2782
}
2748
2783
break ;
2749
2784
case ast_float:
2750
- *(((float *) (data.data () + data.size ())) - 1 ) = -*(((float *) (data.data () + data.size ())) - 1 );
2785
+ *(((float *) (data.data () + data.size ())) - 1 ) = -*(((float *) (data.data () + data.size ())) - 1 );
2751
2786
if (delta > 0 ) {
2752
- *(((float *) (data.data () + data.size ())) - 1 ) += (float ) delta;
2787
+ *(((float *) (data.data () + data.size ())) - 1 ) += (float ) delta;
2753
2788
}
2754
2789
break ;
2755
2790
case ast_double:
2756
- *(((double *) (data.data () + data.size ())) - 1 ) = -*(((double *) (data.data () + data.size ())) - 1 );
2791
+ *(((double *) (data.data () + data.size ())) - 1 ) = -*(((double *) (data.data () + data.size ())) - 1 );
2757
2792
if (delta > 0 ) {
2758
- *(((double *) (data.data () + data.size ())) - 1 ) += (double ) delta;
2793
+ *(((double *) (data.data () + data.size ())) - 1 ) += (double ) delta;
2759
2794
}
2760
2795
break ;
2761
2796
default :
@@ -2794,16 +2829,16 @@ namespace clib {
2794
2829
case ast_char:
2795
2830
case ast_short:
2796
2831
case ast_int:
2797
- *(((int *) (data.data () + data.size ())) - 1 ) = -*(((int *) (data.data () + data.size ())) - 1 );
2832
+ *(((int *) (data.data () + data.size ())) - 1 ) = -*(((int *) (data.data () + data.size ())) - 1 );
2798
2833
break ;
2799
2834
case ast_long:
2800
- *(((int64*) (data.data () + data.size ())) - 1 ) = -*(((int64*) (data.data () + data.size ())) - 1 );
2835
+ *(((int64 *) (data.data () + data.size ())) - 1 ) = -*(((int64 *) (data.data () + data.size ())) - 1 );
2801
2836
break ;
2802
2837
case ast_float:
2803
- *(((float *) (data.data () + data.size ())) - 1 ) = -*(((float *) (data.data () + data.size ())) - 1 );
2838
+ *(((float *) (data.data () + data.size ())) - 1 ) = -*(((float *) (data.data () + data.size ())) - 1 );
2804
2839
break ;
2805
2840
case ast_double:
2806
- *(((double *) (data.data () + data.size ())) - 1 ) = -*(((double *) (data.data () + data.size ())) - 1 );
2841
+ *(((double *) (data.data () + data.size ())) - 1 ) = -*(((double *) (data.data () + data.size ())) - 1 );
2807
2842
break ;
2808
2843
default :
2809
2844
error (id, " allocate: unop not supported" );
@@ -3026,12 +3061,12 @@ namespace clib {
3026
3061
}
3027
3062
3028
3063
std::tuple<sym_class_t , string_t > sym_class_string_list[] = {
3029
- std::make_tuple (z_undefined, " undefined" ),
3030
- std::make_tuple (z_global_var, " global id" ),
3031
- std::make_tuple (z_local_var, " local id" ),
3032
- std::make_tuple (z_param_var, " param id" ),
3033
- std::make_tuple (z_struct_var, " struct id" ),
3034
- std::make_tuple (z_function, " func id" ),
3064
+ std::make_tuple (z_undefined, " undefined" ),
3065
+ std::make_tuple (z_global_var, " global id" ),
3066
+ std::make_tuple (z_local_var, " local id" ),
3067
+ std::make_tuple (z_param_var, " param id" ),
3068
+ std::make_tuple (z_struct_var, " struct id" ),
3069
+ std::make_tuple (z_function, " func id" ),
3035
3070
};
3036
3071
3037
3072
const string_t &sym_class_string (sym_class_t t) {
0 commit comments