let meta_init bindings =
let to_ptr klass = Format.sprintf "m_classes[%s]" (String.trim (String.uppercase (GenCast.get_tname klass))) in
let init (klass, ancestors) =
let ancestors_strings = String.concat ", " (List.map to_ptr ancestors) in
Format.sprintf "class_info_init(&M_%s, %d, %s);" klass (List.length ancestors) ancestors_strings in
let bindings = List.filter (fun (k, _) -> not (StringSet.mem (GenCast.get_tname k) GenCast.built_in_names)) bindings in
let inits = List.map init bindings in
let inits = List.map (Format.sprintf "\t%s") inits in
let built_in_init = "\tinit_built_in_infos();" in
Format.sprintf "void init_class_infos() {\n%s\n}\n" (String.concat "\n" (built_in_init::inits))