Skip to content

Commit fde44e7

Browse files
INTinjなどがポインタ等価でないときにcoerceできない問題を修正
1 parent 9bb5964 commit fde44e7

1 file changed

Lines changed: 26 additions & 13 deletions

File tree

libC/capp.c

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -498,13 +498,19 @@ value coerce(value v, crc *s) {
498498
}
499499
#endif
500500
}
501-
default: {// v<id;G!> -> v<<id;G!>>
502-
// 関数とリストの id;G! のみがここでdynにされる
503-
value retv;
504-
retv.d.non_atom = (v_d*)GC_MALLOC(sizeof(v_d));
505-
retv.d.non_atom->v = v;
506-
retv.d.non_atom->d = s;
507-
return retv;
501+
default: { // v<id;G!> -> v<<id;G!>>
502+
switch(s->g_inj) {
503+
case G_INT: return tag_value(v, G_INT);
504+
case G_BOOL: return tag_value(v, G_BOOL);
505+
case G_UNIT: return tag_value(v, G_UNIT);
506+
default: {
507+
value retv;
508+
retv.d.non_atom = (v_d*)GC_MALLOC(sizeof(v_d));
509+
retv.d.non_atom->v = v;
510+
retv.d.non_atom->d = s;
511+
return retv;
512+
}
513+
}
508514
}
509515
}
510516

@@ -583,12 +589,19 @@ value coerce(value v, crc *s) {
583589
#endif
584590
}
585591

586-
default: { // u<<d>><s> -> u<d> -> u<<d>>
587-
value retv;
588-
retv.d.non_atom = (v_d*)GC_MALLOC(sizeof(v_d));
589-
retv.d.non_atom->v = v.d.non_atom->v;
590-
retv.d.non_atom->d = s;
591-
return retv;
592+
default: { // u<<d>><s> -> u<g;G!> -> u<<g;G!>>
593+
switch(s->g_inj) {
594+
case G_INT: return tag_value(v, G_INT);
595+
case G_BOOL: return tag_value(v, G_BOOL);
596+
case G_UNIT: return tag_value(v, G_UNIT);
597+
default: {
598+
value retv;
599+
retv.d.non_atom = (v_d*)GC_MALLOC(sizeof(v_d));
600+
retv.d.non_atom->v = v.d.non_atom->v;
601+
retv.d.non_atom->d = s;
602+
return retv;
603+
}
604+
}
592605
}
593606
}
594607
}

0 commit comments

Comments
 (0)