@@ -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