Skip to content

Commit 2a5f0a2

Browse files
committed
Fix bug
1 parent e43a899 commit 2a5f0a2

File tree

5 files changed

+306
-49
lines changed

5 files changed

+306
-49
lines changed

cgen.cpp

+82-47
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ namespace clib {
176176
return 1;
177177
if (ptr == 1)
178178
return LEX_SIZE(type);
179-
return sizeof(void*);
179+
return sizeof(void *);
180180
}
181181
if (t == x_matrix) {
182182
// TODO: Fix bug, ID Assignment L-Value
@@ -285,7 +285,7 @@ namespace clib {
285285
}
286286

287287
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) {}
289289

290290
symbol_t sym_id_t::get_type() const {
291291
return s_id;
@@ -364,9 +364,12 @@ namespace clib {
364364
int sym_struct_t::size(sym_size_t t) const {
365365
if (_size == 0) {
366366
if (_struct) {
367-
for (auto &decl : decls) {
367+
for (auto& decl : decls) {
368368
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;
370373
decl->addr_end = _size;
371374
}
372375
} else {
@@ -477,19 +480,30 @@ namespace clib {
477480
* [38] 8B-4B double转float
478481
*/
479482
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},
493507
};
494508
return _cast[src][dst];
495509
}
@@ -549,6 +563,27 @@ namespace clib {
549563
return base->size(t);
550564
}
551565

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+
552587
sym_var_t::sym_var_t(const type_t::ref &base, ast_node *node) : type_exp_t(base), node(node) {
553588
line = node->line;
554589
column = node->column;
@@ -624,7 +659,7 @@ namespace clib {
624659
}
625660

626661
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) {}
628663

629664
symbol_t sym_var_id_t::get_type() const {
630665
return s_var_id;
@@ -718,7 +753,7 @@ namespace clib {
718753
}
719754

720755
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) {
722757
line = exp->line;
723758
column = exp->column;
724759
}
@@ -858,7 +893,7 @@ namespace clib {
858893
}
859894

860895
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) {
862897
line = exp->line;
863898
column = exp->column;
864899
}
@@ -941,7 +976,7 @@ namespace clib {
941976
}
942977

943978
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) {
945980
line = exp1->line;
946981
column = exp1->column;
947982
}
@@ -1260,7 +1295,7 @@ namespace clib {
12601295

12611296
sym_triop_t::sym_triop_t(const type_exp_t::ref &exp1, const type_exp_t::ref &exp2,
12621297
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) {
12641299
line = exp1->line;
12651300
column = exp1->column;
12661301
}
@@ -1443,15 +1478,15 @@ namespace clib {
14431478
error("main() not defined");
14441479
}
14451480
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));
14471482
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));
14491484
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));
14511486
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));
14531488
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));
14551490
return file;
14561491
}
14571492

@@ -2705,7 +2740,7 @@ namespace clib {
27052740
((char *) &node->data._ins) + size,
27062741
std::back_inserter(data));
27072742
if (delta > 0) {
2708-
*(((int*) (data.data() + data.size())) - 1) += delta;
2743+
*(((int *) (data.data() + data.size())) - 1) += delta;
27092744
}
27102745
} else {
27112746
load_string(node->data._string);
@@ -2720,7 +2755,7 @@ namespace clib {
27202755
data.data() + var2->addr_end,
27212756
std::back_inserter(data));
27222757
if (delta > 0) {
2723-
*(((int*) (data.data() + data.size())) - 1) += delta;
2758+
*(((int *) (data.data() + data.size())) - 1) += delta;
27242759
}
27252760
} else if (init->get_type() == s_unop) {
27262761
auto v1 = std::dynamic_pointer_cast<sym_unop_t>(init);
@@ -2735,27 +2770,27 @@ namespace clib {
27352770
case ast_char:
27362771
case ast_short:
27372772
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);
27392774
if (delta > 0) {
2740-
*(((int*) (data.data() + data.size())) - 1) += delta;
2775+
*(((int *) (data.data() + data.size())) - 1) += delta;
27412776
}
27422777
break;
27432778
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);
27452780
if (delta > 0) {
2746-
*(((int64*) (data.data() + data.size())) - 1) += (int64) delta;
2781+
*(((int64 *) (data.data() + data.size())) - 1) += (int64) delta;
27472782
}
27482783
break;
27492784
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);
27512786
if (delta > 0) {
2752-
*(((float*) (data.data() + data.size())) - 1) += (float) delta;
2787+
*(((float *) (data.data() + data.size())) - 1) += (float) delta;
27532788
}
27542789
break;
27552790
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);
27572792
if (delta > 0) {
2758-
*(((double*) (data.data() + data.size())) - 1) += (double) delta;
2793+
*(((double *) (data.data() + data.size())) - 1) += (double) delta;
27592794
}
27602795
break;
27612796
default:
@@ -2794,16 +2829,16 @@ namespace clib {
27942829
case ast_char:
27952830
case ast_short:
27962831
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);
27982833
break;
27992834
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);
28012836
break;
28022837
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);
28042839
break;
28052840
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);
28072842
break;
28082843
default:
28092844
error(id, "allocate: unop not supported");
@@ -3026,12 +3061,12 @@ namespace clib {
30263061
}
30273062

30283063
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"),
30353070
};
30363071

30373072
const string_t &sym_class_string(sym_class_t t) {

cgen.h

+1
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ namespace clib {
145145
symbol_t get_type() const override;
146146
symbol_t get_base_type() const override;
147147
int size(sym_size_t t) const override;
148+
gen_t gen_invoke(igen& gen, sym_t::ref& list) override;
148149
cast_t get_cast() const override;
149150
type_t::ref base;
150151
};

0 commit comments

Comments
 (0)