@@ -59,6 +59,17 @@ ast_type_t ast_type_clone(const ast_type_t *original){
5959 ((ast_elem_func_t * ) new .elements [i ])-> traits = ((ast_elem_func_t * ) original -> elements [i ])-> traits ;
6060 ((ast_elem_func_t * ) new .elements [i ])-> ownership = false;
6161 break ;
62+ case AST_ELEM_POLYMORPH : {
63+ char * original_name = ((ast_elem_polymorph_t * ) original -> elements [i ])-> name ;
64+ length_t original_name_length = strlen (original_name );
65+ char * new_name = malloc (original_name_length + 1 );
66+ memcpy (new_name , original_name , original_name_length + 1 );
67+ new .elements [i ] = malloc (sizeof (ast_elem_polymorph_t ));
68+ ((ast_elem_polymorph_t * ) new .elements [i ])-> id = AST_ELEM_POLYMORPH ;
69+ ((ast_elem_polymorph_t * ) new .elements [i ])-> source = original -> elements [i ]-> source ;
70+ ((ast_elem_polymorph_t * ) new .elements [i ])-> name = new_name ;
71+ break ;
72+ }
6273 default :
6374 redprintf ("INTERNAL ERROR: Encountered unexpected type element id when cloning ast_type_t, a crash will probably follow...\n" );
6475 }
@@ -91,6 +102,10 @@ void ast_type_free(ast_type_t *type){
91102 }
92103 free (type -> elements [i ]);
93104 break ;
105+ case AST_ELEM_POLYMORPH :
106+ free (((ast_elem_polymorph_t * ) type -> elements [i ])-> name );
107+ free (type -> elements [i ]);
108+ break ;
94109 default :
95110 redprintf ("INTERNAL ERROR: Encountered unexpected type element id when freeing ast_type_t\n" );
96111 }
@@ -180,6 +195,18 @@ void ast_type_prepend_ptr(ast_type_t *type){
180195 type -> elements_length ++ ;
181196}
182197
198+ void ast_type_make_polymorph (ast_type_t * type , strong_cstr_t name ){
199+ ast_elem_polymorph_t * elem = malloc (sizeof (ast_elem_polymorph_t ));
200+ elem -> id = AST_ELEM_POLYMORPH ;
201+ elem -> name = name ;
202+ elem -> source = NULL_SOURCE ;
203+
204+ type -> elements = malloc (sizeof (ast_elem_t * ));
205+ type -> elements [0 ] = (ast_elem_t * ) elem ;
206+ type -> elements_length = 1 ;
207+ type -> source = NULL_SOURCE ;
208+ }
209+
183210void ast_type_make_generic_int (ast_type_t * type ){
184211 ast_elem_base_t * elem = malloc (sizeof (ast_elem_t ));
185212 elem -> id = AST_ELEM_GENERIC_INT ;
@@ -307,6 +334,15 @@ strong_cstr_t ast_type_str(const ast_type_t *type){
307334 free (type_str );
308335 }
309336 break ;
337+ case AST_ELEM_POLYMORPH : {
338+ const char * polyname = ((ast_elem_polymorph_t * ) type -> elements [i ])-> name ;
339+ length_t polyname_length = strlen (polyname );
340+ EXTEND_NAME_MACRO (polyname_length + 1 );
341+ name [name_length ] = '$' ;
342+ memcpy (& name [name_length + 1 ], polyname , polyname_length + 1 );
343+ name_length += polyname_length + 1 ;
344+ }
345+ break ;
310346 default :
311347 printf ("INTERNAL ERROR: Encountered unexpected element type 0x%08X when converting ast_type_t to a string\n" , type -> elements [i ]-> id );
312348 return NULL ;
@@ -415,3 +451,29 @@ bool ast_type_is_pointer_to(const ast_type_t *type, const ast_type_t *to){
415451
416452 return ast_types_identical (& stripped , to );
417453}
454+
455+ bool ast_type_has_polymorph (const ast_type_t * type ){
456+ for (length_t i = 0 ; i != type -> elements_length ; i ++ ){
457+ switch (type -> elements [i ]-> id ){
458+ case AST_ELEM_BASE :
459+ case AST_ELEM_POINTER :
460+ case AST_ELEM_GENERIC_INT :
461+ case AST_ELEM_GENERIC_FLOAT :
462+ case AST_ELEM_FIXED_ARRAY :
463+ break ;
464+ case AST_ELEM_FUNC : {
465+ ast_elem_func_t * func_elem = (ast_elem_func_t * ) type -> elements [i ];
466+ for (length_t i = 0 ; i != func_elem -> arity ; i ++ ){
467+ if (ast_type_has_polymorph (& func_elem -> arg_types [i ])) return true;
468+ }
469+ if (ast_type_has_polymorph (func_elem -> return_type )) return true;
470+ }
471+ break ;
472+ case AST_ELEM_POLYMORPH :
473+ return true;
474+ default :
475+ redprintf ("INTERNAL ERROR: ast_type_has_polymorph encountered unknown element id 0x%8X" , type -> elements [i ]-> id );
476+ }
477+ }
478+ return false;
479+ }
0 commit comments