diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2011-07-06 09:54:18 +0200 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2011-08-01 19:09:00 +0200 |
commit | f6166af03fa3db947637a8157d6ff507b6f795f2 (patch) | |
tree | dde593203fe150209e236ade6e1bf9cb45545c85 /vapigen | |
parent | e00603e1955886dc012a3fc949e28ed4069b007c (diff) | |
download | vala-f6166af03fa3db947637a8157d6ff507b6f795f2.tar.gz |
gidlparser: Do not use C specific methods of code nodes
Diffstat (limited to 'vapigen')
-rw-r--r-- | vapigen/valagidlparser.vala | 559 |
1 files changed, 348 insertions, 211 deletions
diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala index 55c414c85..7655d5e41 100644 --- a/vapigen/valagidlparser.vala +++ b/vapigen/valagidlparser.vala @@ -88,8 +88,8 @@ public class Vala.GIdlParser : CodeVisitor { } private void visit_type (TypeSymbol t) { - if (!cname_type_map.contains (t.get_cname ())) { - cname_type_map[t.get_cname ()] = t; + if (!cname_type_map.contains (get_cname (t))) { + cname_type_map[get_cname (t)] = t; } } @@ -165,23 +165,10 @@ public class Vala.GIdlParser : CodeVisitor { if (type_name.has_prefix (container.name)) { return type_name.substring (container.name.length); - } else if (container.name == "GLib" && type_name.has_prefix ("G")) { - return type_name.substring (1); - } else { - string best_match = null; - if (container is Namespace) { - foreach (string cprefix in ((Namespace) container).get_cprefixes ()) { - if (type_name.has_prefix (cprefix)) { - if (best_match == null || cprefix.length > best_match.length) - best_match = cprefix; - } - } - } else { - best_match = container.get_cprefix (); - } - - if (best_match != null) { - return type_name.substring (best_match.length);; + } else { + var cprefix = get_cprefix (container); + if (type_name.has_prefix (cprefix)) { + return type_name.substring (cprefix.length);; } } @@ -189,24 +176,141 @@ public class Vala.GIdlParser : CodeVisitor { } private string fix_const_name (string const_name, Symbol container) { - var pref = container.get_lower_case_cprefix ().up (); + var pref = get_lower_case_cprefix (container).up (); if (const_name.has_prefix (pref)) { return const_name.substring (pref.length); } return const_name; } + private string get_cheader_filename (Symbol sym) { + var cheader_filename = sym.get_attribute_string ("CCode", "cheader_filename"); + if (cheader_filename != null) { + return cheader_filename; + } + if (sym.parent_symbol != null) { + return get_cheader_filename (sym.parent_symbol); + } else if (sym.source_reference != null) { + return sym.source_reference.file.get_cinclude_filename (); + } + return ""; + } + + private string get_cname (Symbol sym, Symbol? container = null) { + if (container == null) { + container = sym.parent_symbol; + } + var cname = sym.get_attribute_string ("CCode", "cname"); + if (cname != null) { + return cname; + } + if (sym is Method) { + var name = sym.name; + if (sym is CreationMethod) { + if (name == null || name == ".new") { + name = "new"; + } else { + name = "new_"+name; + } + } + if (container != null) { + return "%s%s".printf (get_lower_case_cprefix (container), name); + } else { + return name; + } + } else { + if (container != null) { + return "%s%s".printf (get_cprefix (container), sym.name); + } else { + return sym.name; + } + } + } + + private string get_finish_cname (Method m) { + var finish_cname = m.get_attribute_string ("CCode", "finish_name"); + if (finish_cname != null) { + return finish_cname; + } + var result = get_cname (m); + if (result.has_suffix ("_async")) { + result = result.substring (0, result.length - "_async".length); + } + return result + "_finish"; + } + + private string get_lower_case_cname (Symbol sym) { + var lower_case_csuffix = Symbol.camel_case_to_lower_case (sym.name); + if (sym is ObjectTypeSymbol) { + // remove underscores in some cases to avoid conflicts of type macros + if (lower_case_csuffix.has_prefix ("type_")) { + lower_case_csuffix = "type" + lower_case_csuffix.substring ("type_".length); + } else if (lower_case_csuffix.has_prefix ("is_")) { + lower_case_csuffix = "is" + lower_case_csuffix.substring ("is_".length); + } + if (lower_case_csuffix.has_suffix ("_class")) { + lower_case_csuffix = lower_case_csuffix.substring (0, lower_case_csuffix.length - "_class".length) + "class"; + } + } + if (sym.parent_symbol != null) { + return "%s%s".printf (get_lower_case_cprefix (sym.parent_symbol), lower_case_csuffix); + } else { + return lower_case_csuffix; + } + } + + private string get_lower_case_cprefix (Symbol sym) { + if (sym.name == null) { + return ""; + } + string cprefix; + if (sym is Namespace) { + cprefix = sym.get_attribute_string ("CCode", "lower_case_cprefix"); + } else { + cprefix = sym.get_attribute_string ("CCode", "cprefix"); + } + if (cprefix != null) { + return cprefix; + } + return get_lower_case_cname (sym) + "_"; + } + + public string get_cprefix (Symbol sym) { + if (sym is ObjectTypeSymbol) { + return get_cname (sym); + } else if (sym is Enum || sym is ErrorDomain) { + return "%s_".printf (get_lower_case_cname (sym).up ()); + } else if (sym is Namespace) { + if (sym.name != null) { + var cprefix = sym.get_attribute_string ("CCode", "cprefix"); + if (cprefix != null) { + return cprefix; + } + if (sym.parent_symbol != null) { + return "%s%s".printf (get_cprefix (sym.parent_symbol), sym.name); + } else { + return sym.name; + } + } else { + return ""; + } + } else if (sym.name != null) { + return sym.name; + } + return ""; + } + private string[] get_attributes_for_node (IdlNode node) { string name; if (node.type == IdlNodeTypeId.FUNCTION) { name = ((IdlNodeFunction) node).symbol; } else if (node.type == IdlNodeTypeId.SIGNAL) { - name = "%s::%s".printf (current_data_type.get_cname (), node.name); + name = "%s::%s".printf (get_cname (current_data_type), node.name); } else if (node.type == IdlNodeTypeId.PROPERTY) { - name = "%s:%s".printf (current_data_type.get_cname (), node.name); + name = "%s:%s".printf (get_cname (current_data_type), node.name); } else if (node.type == IdlNodeTypeId.FIELD) { - name = "%s.%s".printf (current_data_type.get_cname (), node.name); + name = "%s.%s".printf (get_cname (current_data_type), node.name); } else { name = node.name; } @@ -304,6 +408,11 @@ public class Vala.GIdlParser : CodeVisitor { st.add_property ((Property) sym); } } + + if (!(sym is Namespace) && container is Namespace) { + // set C headers + sym.set_attribute_string ("CCode", "cheader_filename", get_cheader_filename (sym)); + } } private void parse_node (IdlNode node, IdlModule module, Symbol container) { @@ -349,13 +458,15 @@ public class Vala.GIdlParser : CodeVisitor { private Symbol? get_container_from_name (string name) { var path = name.split ("."); Symbol? cp = current_namespace; + if (cp.parent_symbol != context.root) { + cp = cp.parent_symbol; + } Symbol? cc = null; foreach ( unowned string tok in path ) { cc = cp.scope.lookup (tok) as Symbol; if ( cc == null ) { cc = new Namespace (tok, current_source_reference); - ((Namespace) cc).add_cprefix (cp.get_cprefix () + tok); add_symbol_to_container (cp, cc); } cp = cc; @@ -384,18 +495,17 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - ns.set_cheader_filename (eval (nv[1])); + ns.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "cprefix") { - var cprefixes = eval (nv[1]).split (","); - foreach(string name in cprefixes) { - ns.add_cprefix (name); - } + ns.set_attribute_string ("CCode", "cprefix", eval (nv[1])); } else if (nv[0] == "lower_case_cprefix") { - ns.set_lower_case_cprefix (eval (nv[1])); + ns.set_attribute_string ("CCode", "lower_case_cprefix", eval (nv[1])); } else if (nv[0] == "gir_namespace") { ns.source_reference.file.gir_namespace = eval (nv[1]); + ns.set_attribute_string ("CCode", "gir_namespace", eval (nv[1])); } else if (nv[0] == "gir_version") { ns.source_reference.file.gir_version = eval (nv[1]); + ns.set_attribute_string ("CCode", "gir_version", eval (nv[1])); } } } @@ -432,7 +542,14 @@ public class Vala.GIdlParser : CodeVisitor { } } + if (container is Namespace) { + current_namespace = (Namespace) container; + } else { + current_data_type = (TypeSymbol) container; + } parse_node (node, module, container); + current_namespace = ns; + current_data_type = null; } current_namespace = null; @@ -465,7 +582,7 @@ public class Vala.GIdlParser : CodeVisitor { return null; } } else if (nv[0] == "cheader_filename") { - cb.add_cheader_filename (eval (nv[1])); + cb.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "has_target") { if (eval (nv[1]) == "0") { check_has_target = false; @@ -488,28 +605,28 @@ public class Vala.GIdlParser : CodeVisitor { } else if (nv[0] == "error_types") { error_types = eval (nv[1]); } else if (nv[0] == "array_length_type") { - cb.array_length_type = eval (nv[1]); + cb.set_attribute_string ("CCode", "array_length_type", eval (nv[1])); } else if (nv[0] == "type_name") { cb.return_type = return_type = parse_type_from_string (eval (nv[1]), return_type.value_owned); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - cb.deprecated = true; + cb.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - cb.replacement = eval (nv[1]); + cb.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - cb.deprecated_since = eval (nv[1]); + cb.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "type_arguments") { parse_type_arguments_from_string (return_type, eval (nv[1])); } else if (nv[0] == "instance_pos") { - cb.cinstance_parameter_position = double.parse (eval (nv[1])); + cb.set_attribute_double ("CCode", "instance_pos", double.parse (eval (nv[1]))); } else if (nv[0] == "type_parameters") { foreach (string type_param_name in eval (nv[1]).split (",")) { cb.add_type_parameter (new TypeParameter (type_param_name, current_source_reference)); } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - cb.experimental = true; + cb.set_attribute ("Experimental", true); } } } @@ -599,14 +716,14 @@ public class Vala.GIdlParser : CodeVisitor { parse_type_arguments_from_string (param_type, eval (nv[1])); } else if (nv[0] == "no_array_length") { if (eval (nv[1]) == "1") { - p.no_array_length = true; + p.set_attribute_bool ("CCode", "array_length", false); } } else if (nv[0] == "array_length_type") { - p.array_length_type = eval (nv[1]); + p.set_attribute_string ("CCode", "array_length_type", eval (nv[1])); } else if (nv[0] == "array_null_terminated") { if (eval (nv[1]) == "1") { - p.no_array_length = true; - p.array_null_terminated = true; + p.set_attribute_bool ("CCode", "array_length", false); + p.set_attribute_bool ("CCode", "array_null_terminated", true); } } else if (nv[0] == "type_name") { p.variable_type = param_type = parse_type_from_string (eval (nv[1]), false); @@ -665,7 +782,7 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in st_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - st.add_cheader_filename (eval (nv[1])); + st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return; @@ -680,33 +797,33 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "immutable") { if (eval (nv[1]) == "1") { - st.is_immutable = true; + st.set_attribute ("Immutable", true); } } else if (nv[0] == "has_type_id") { if (eval (nv[1]) == "0") { - st.has_type_id = false; + st.set_attribute_bool ("CCode", "has_type_id", false); } } else if (nv[0] == "type_id") { - st.set_type_id (eval (nv[1])); + st.set_attribute_string ("CCode", "type_id", eval (nv[1])); } else if (nv[0] == "has_copy_function") { if (eval (nv[1]) == "0") { - st.has_copy_function = false; + st.set_attribute_bool ("CCode", "has_copy_function", false); } } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - st.deprecated = true; + st.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - st.replacement = eval (nv[1]); + st.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - st.deprecated_since = eval (nv[1]); + st.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "has_destroy_function") { if (eval (nv[1]) == "0") { - st.has_destroy_function = false; + st.set_attribute_bool ("CCode", "has_destroy_function", false); } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - st.experimental = true; + st.set_attribute ("Experimental", true); } } } @@ -743,17 +860,17 @@ public class Vala.GIdlParser : CodeVisitor { var cl = container.scope.lookup (name) as Class; if (cl == null) { string base_class = null; + bool is_fundamental = false; cl = new Class (name, current_source_reference); cl.access = SymbolAccessibility.PUBLIC; - cl.is_compact = true; var cl_attributes = get_attributes (node.name); if (cl_attributes != null) { foreach (string attr in cl_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - cl.add_cheader_filename (eval (nv[1])); + cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "base_class") { base_class = eval (nv[1]); } else if (nv[0] == "hidden") { @@ -765,10 +882,10 @@ public class Vala.GIdlParser : CodeVisitor { cl.is_immutable = true; } } else if (nv[0] == "const_cname") { - cl.const_cname = eval (nv[1]); + cl.set_attribute_string ("CCode", "const_cname", eval (nv[1])); } else if (nv[0] == "is_fundamental") { if (eval (nv[1]) == "1") { - cl.is_compact = false; + is_fundamental = true; } } else if (nv[0] == "abstract" && base_class != null) { if (eval (nv[1]) == "1") { @@ -788,19 +905,19 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - cl.deprecated = true; + cl.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - cl.replacement = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - cl.deprecated_since = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "type_parameters") { foreach (string type_param_name in eval (nv[1]).split (",")) { cl.add_type_parameter (new TypeParameter (type_param_name, current_source_reference)); } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - cl.experimental = true; + cl.set_attribute ("Experimental", true); } } } @@ -813,6 +930,9 @@ public class Vala.GIdlParser : CodeVisitor { var parent = parse_type_string (base_class); cl.add_base_type (parent); } + if (base_class == null && !is_fundamental) { + cl.is_compact = true; + } } current_data_type = cl; @@ -844,16 +964,17 @@ public class Vala.GIdlParser : CodeVisitor { } if (ref_function != null) { - cl.set_ref_function (ref_function); - cl.ref_function_void = ref_function_void; - } - if (copy_function != null) { - cl.set_dup_function (copy_function); + cl.set_attribute_string ("CCode", "ref_function", ref_function); + if (ref_function_void) { + cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void); + } + } else if (copy_function != null) { + cl.set_attribute_string ("CCode", "copy_function", copy_function); } if (unref_function != null) { - cl.set_unref_function (unref_function); - } else if (free_function != null) { - cl.set_free_function (free_function); + cl.set_attribute_string ("CCode", "unref_function", unref_function); + } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) { + cl.set_attribute_string ("CCode", "free_function", free_function); } current_data_type = null; @@ -880,22 +1001,22 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in st_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - st.add_cheader_filename (eval (nv[1])); + st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - st.deprecated = true; + st.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - st.replacement = eval (nv[1]); + st.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - st.deprecated_since = eval (nv[1]); + st.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return; } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - st.experimental = true; + st.set_attribute ("Experimental", true); } } } @@ -934,7 +1055,7 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in cl_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - cl.add_cheader_filename (eval (nv[1])); + cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return; @@ -982,16 +1103,17 @@ public class Vala.GIdlParser : CodeVisitor { } if (ref_function != null) { - cl.set_ref_function (ref_function); - cl.ref_function_void = ref_function_void; - } - if (copy_function != null) { - cl.set_dup_function (copy_function); + cl.set_attribute_string ("CCode", "ref_function", ref_function); + if (ref_function_void) { + cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void); + } + } else if (copy_function != null) { + cl.set_attribute_string ("CCode", "copy_function", copy_function); } if (unref_function != null) { - cl.set_unref_function (unref_function); - } else if (free_function != null) { - cl.set_free_function (free_function); + cl.set_attribute_string ("CCode", "unref_function", unref_function); + } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) { + cl.set_attribute_string ("CCode", "free_function", free_function); } current_data_type = null; @@ -1024,37 +1146,36 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in st_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - st.add_cheader_filename (eval (nv[1])); + st.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - st.deprecated = true; + st.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - st.replacement = eval (nv[1]); + st.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - st.deprecated_since = eval (nv[1]); + st.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "immutable") { if (eval (nv[1]) == "1") { - st.is_immutable = true; + st.set_attribute ("Immutable", true); } } else if (nv[0] == "has_copy_function") { if (eval (nv[1]) == "0") { - st.has_copy_function = false; + st.set_attribute_bool ("CCode", "has_copy_function", false); } } else if (nv[0] == "has_destroy_function") { if (eval (nv[1]) == "0") { - st.has_destroy_function = false; + st.set_attribute_bool ("CCode", "has_destroy_function", false); } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - st.experimental = true; + st.set_attribute ("Experimental", true); } } } } add_symbol_to_container (container, st); - st.set_type_id (st.get_upper_case_cname ("TYPE_")); current_source_file.add_node (st); } @@ -1095,7 +1216,7 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in cl_attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - cl.add_cheader_filename (eval (nv[1])); + cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "base_class") { base_class = eval (nv[1]); } else if (nv[0] == "is_immutable") { @@ -1104,14 +1225,14 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - cl.deprecated = true; + cl.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - cl.replacement = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - cl.deprecated_since = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "const_cname") { - cl.const_cname = eval (nv[1]); + cl.set_attribute_string ("CCode", "const_cname", eval (nv[1])); } else if (nv[0] == "free_function") { free_function = eval (nv[1]); } else if (nv[0] == "ref_function") { @@ -1126,14 +1247,13 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - cl.experimental = true; + cl.set_attribute ("Experimental", true); } } } } add_symbol_to_container (container, cl); - cl.set_type_id (cl.get_upper_case_cname ("TYPE_")); current_source_file.add_node (cl); if (base_class != null) { @@ -1171,16 +1291,17 @@ public class Vala.GIdlParser : CodeVisitor { } if (ref_function != null) { - cl.set_ref_function (ref_function); - cl.ref_function_void = ref_function_void; - } - if (copy_function != null) { - cl.set_dup_function (copy_function); + cl.set_attribute_string ("CCode", "ref_function", ref_function); + if (ref_function_void) { + cl.set_attribute_bool ("CCode", "ref_function_void", ref_function_void); + } + } else if (copy_function != null) { + cl.set_attribute_string ("CCode", "copy_function", copy_function); } if (unref_function != null) { - cl.set_unref_function (unref_function); - } else if (free_function != null) { - cl.set_free_function (free_function); + cl.set_attribute_string ("CCode", "unref_function", unref_function); + } else if (free_function != null && free_function != "%sfree".printf (get_lower_case_cprefix (cl))) { + cl.set_attribute_string ("CCode", "free_function", free_function); } current_data_type = null; @@ -1207,7 +1328,9 @@ public class Vala.GIdlParser : CodeVisitor { } } - en.has_type_id = (en_node.gtype_name != null && en_node.gtype_name != ""); + if (en_node.gtype_name == null || en_node.gtype_name == "") { + en.set_attribute_bool ("CCode", "has_type_id", false); + } string common_prefix = null; @@ -1247,7 +1370,7 @@ public class Vala.GIdlParser : CodeVisitor { bool is_errordomain = false; - var cheader_filenames = new ArrayList<string> (); + string cheader_filename = null; var en_attributes = get_attributes (node.name); if (en_attributes != null) { @@ -1256,20 +1379,20 @@ public class Vala.GIdlParser : CodeVisitor { if (nv[0] == "common_prefix") { common_prefix = eval (nv[1]); } else if (nv[0] == "cheader_filename") { - cheader_filenames.add (eval (nv[1])); - en.add_cheader_filename (eval (nv[1])); + cheader_filename = eval (nv[1]); + en.set_attribute_string ("CCode", "cheader_filename", cheader_filename); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return; } } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - en.deprecated = true; + en.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - en.replacement = eval (nv[1]); + en.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - en.deprecated_since = eval (nv[1]); + en.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "rename_to") { en.name = eval (nv[1]); } else if (nv[0] == "errordomain") { @@ -1282,17 +1405,17 @@ public class Vala.GIdlParser : CodeVisitor { return_type.value_owned = false; var m = new Method ("to_string", return_type, current_source_reference); m.access = SymbolAccessibility.PUBLIC; - m.set_cname (eval(nv[1])); + m.set_attribute_string ("CCode", "cname", eval(nv[1])); en.add_method (m); } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - en.experimental = true; + en.set_attribute ("Experimental", true); } } } } - en.set_cprefix (common_prefix); + en.set_attribute_string ("CCode", "cprefix", common_prefix); foreach (weak IdlNode value2 in en_node.values) { var val_attributes = get_attributes (value2.name); @@ -1315,10 +1438,10 @@ public class Vala.GIdlParser : CodeVisitor { if (is_errordomain) { var ed = new ErrorDomain (en.name, current_source_reference); ed.access = SymbolAccessibility.PUBLIC; - ed.set_cprefix (common_prefix); + ed.set_attribute_string ("CCode", "cprefix", common_prefix); - foreach (string filename in cheader_filenames) { - ed.add_cheader_filename (filename); + if (cheader_filename != null) { + ed.set_attribute_string ("CCode", "cheader_filename", cheader_filename); } foreach (EnumValue ev in en.get_values ()) { @@ -1330,7 +1453,7 @@ public class Vala.GIdlParser : CodeVisitor { add_symbol_to_container (container, ed); } } else { - en.is_flags = is_flags; + en.set_attribute ("Flags", is_flags); current_source_file.add_node (en); if (!existing) { add_symbol_to_container (container, en); @@ -1353,7 +1476,7 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - cl.add_cheader_filename (eval (nv[1])); + cl.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "base_class") { base_class = eval (nv[1]); } else if (nv[0] == "hidden") { @@ -1361,24 +1484,24 @@ public class Vala.GIdlParser : CodeVisitor { return; } } else if (nv[0] == "type_check_function") { - cl.type_check_function = eval (nv[1]); + cl.set_attribute_string ("CCode", "type_check_function", eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - cl.deprecated = true; + cl.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - cl.replacement = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - cl.deprecated_since = eval (nv[1]); + cl.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "type_id") { - cl.set_type_id (eval (nv[1])); + cl.set_attribute_string ("CCode", "type_id", eval (nv[1])); } else if (nv[0] == "abstract") { if (eval (nv[1]) == "1") { cl.is_abstract = true; } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - cl.experimental = true; + cl.set_attribute ("Experimental", true); } } } @@ -1479,17 +1602,17 @@ public class Vala.GIdlParser : CodeVisitor { var getter = "get_%s".printf (prop.name); if (prop.get_accessor != null && !current_type_symbol_set.contains (getter)) { - prop.no_accessor_method = true; + prop.set_attribute ("NoAccessorMethod", true); } var setter = "set_%s".printf (prop.name); if (prop.set_accessor != null && prop.set_accessor.writable && !current_type_symbol_set.contains (setter)) { - prop.no_accessor_method = true; + prop.set_attribute ("NoAccessorMethod", true); } - if (prop.no_accessor_method && prop.get_accessor != null) { + if (prop.get_attribute ("NoAccessorMethod") != null && prop.get_accessor != null) { prop.get_accessor.value_type.value_owned = true; } } @@ -1522,15 +1645,15 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - iface.add_cheader_filename (eval (nv[1])); + iface.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return; } } else if (nv[0] == "type_cname") { - iface.set_type_cname (eval (nv[1])); + iface.set_attribute_string ("CCode", "type_cname", eval (nv[1])); } else if (nv[0] == "lower_case_csuffix") { - iface.set_lower_case_csuffix (eval (nv[1])); + iface.set_attribute_string ("CCode", "lower_case_csuffix", eval (nv[1])); } } } @@ -1607,9 +1730,9 @@ public class Vala.GIdlParser : CodeVisitor { // check if the method is using non-standard finish method name if (finish_method == null) { - var method_cname = m.get_finish_cname (); + var method_cname = get_finish_cname (m); foreach (Method method in type_symbol.get_methods ()) { - if (method.get_cname () == method_cname) { + if (get_cname (method) == method_cname) { finish_method = method; break; } @@ -1618,8 +1741,13 @@ public class Vala.GIdlParser : CodeVisitor { if (finish_method != null) { m.return_type = finish_method.return_type.copy (); - m.no_array_length = finish_method.no_array_length; - m.array_null_terminated = finish_method.array_null_terminated; + var a = finish_method.get_attribute ("CCode"); + if (a != null && a.has_argument ("array_length")) { + m.set_attribute_bool ("CCode", "array_length", a.get_bool ("array_length")); + } + if (a != null && a.has_argument ("array_null_terminated")) { + m.set_attribute_bool ("CCode", "array_null_terminated", a.get_bool ("array_null_terminated")); + } foreach (var param in finish_method.get_parameters ()) { if (param.direction == ParameterDirection.OUT) { var async_param = param.copy (); @@ -1847,6 +1975,8 @@ public class Vala.GIdlParser : CodeVisitor { if (n.has_prefix (current_namespace.name)) { type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, current_namespace.name), n.substring (current_namespace.name.length)); + } else if (current_namespace.parent_symbol != null && current_namespace.parent_symbol.name != null && n.has_prefix (current_namespace.parent_symbol.name)) { + type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, current_namespace.parent_symbol.name), n.substring (current_namespace.parent_symbol.name.length)); } else if (n.has_prefix ("G")) { type.unresolved_symbol = new UnresolvedSymbol (new UnresolvedSymbol (null, "GLib"), n.substring (1)); } else { @@ -2015,8 +2145,8 @@ public class Vala.GIdlParser : CodeVisitor { // gtk widgets) add an attribute to the creation method indicating the used // return type. if (current_data_type is Class && res != null) { - if ("%s*".printf (current_data_type.get_cname()) != res.type.unparsed) { - m.custom_return_type_cname = res.type.unparsed; + if ("%s*".printf (get_cname (current_data_type)) != res.type.unparsed) { + m.set_attribute_string ("CCode", "type", res.type.unparsed); } } } else { @@ -2029,7 +2159,7 @@ public class Vala.GIdlParser : CodeVisitor { } if (current_data_type != null) { - var sig_attributes = get_attributes ("%s::%s".printf (current_data_type.get_cname (), name)); + var sig_attributes = get_attributes ("%s::%s".printf (get_cname (current_data_type), name)); if (sig_attributes != null) { foreach (string attr in sig_attributes) { var nv = attr.split ("=", 2); @@ -2043,13 +2173,13 @@ public class Vala.GIdlParser : CodeVisitor { bool add_ellipsis = false; bool suppress_throws = false; string? error_types = null; + Symbol? container = null; var attributes = get_attributes (symbol); if (attributes != null) { foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "name") { - m.set_cname (m.name); m.name = eval (nv[1]); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { @@ -2061,7 +2191,7 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "printf_format") { if (eval (nv[1]) == "1") { - m.printf_format = true; + m.set_attribute ("PrintfFormat", true); } } else if (nv[0] == "transfer_ownership") { if (eval (nv[1]) == "1") { @@ -2069,14 +2199,14 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "destroys_instance") { if (eval (nv[1]) == "1") { - m.attributes.append (new Attribute ("DestroysInstance", m.source_reference)); + m.set_attribute ("DestroysInstance", true, m.source_reference); } } else if (nv[0] == "nullable") { if (eval (nv[1]) == "1") { return_type.nullable = true; } } else if (nv[0] == "sentinel") { - m.sentinel = eval (nv[1]); + m.set_attribute_string ("CCode", "sentinel", eval (nv[1])); } else if (nv[0] == "is_array") { if (eval (nv[1]) == "1") { return_type = new ArrayType (return_type, 1, return_type.source_reference); @@ -2090,29 +2220,29 @@ public class Vala.GIdlParser : CodeVisitor { error_types = eval (nv[1]); } else if (nv[0] == "no_array_length") { if (eval (nv[1]) == "1") { - m.no_array_length = true; + m.set_attribute_bool ("CCode", "array_length", false); } } else if (nv[0] == "array_null_terminated") { if (eval (nv[1]) == "1") { - m.no_array_length = true; - m.array_null_terminated = true; + m.set_attribute_bool ("CCode", "array_length", false); + m.set_attribute_bool ("CCode", "array_null_terminated", true);; } } else if (nv[0] == "array_length_type") { - m.array_length_type = eval (nv[1]); + m.set_attribute_string ("CCode", "array_length_type", eval (nv[1])); } else if (nv[0] == "type_name") { m.return_type = return_type = parse_type_from_string (eval (nv[1]), return_type.value_owned); } else if (nv[0] == "type_arguments") { parse_type_arguments_from_string (return_type, eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - m.deprecated = true; + m.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - m.replacement = eval (nv[1]); + m.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - m.deprecated_since = eval (nv[1]); + m.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "cheader_filename") { - m.add_cheader_filename (eval (nv[1])); + m.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "abstract") { if (eval (nv[1]) == "1") { m.is_abstract = true; @@ -2122,35 +2252,32 @@ public class Vala.GIdlParser : CodeVisitor { m.is_virtual = true; } } else if (nv[0] == "vfunc_name") { - m.vfunc_name = eval (nv[1]); + m.set_attribute_string ("CCode", "vfunc_name", eval (nv[1])); } else if (nv[0] == "finish_name") { - m.set_finish_cname (eval (nv[1])); + m.set_attribute_string ("CCode", "finish_name", eval (nv[1])); } else if (nv[0] == "async") { if (eval (nv[1]) == "1") { // force async function, even if it doesn't end in _async m.coroutine = true; } } else if (nv[0] == "parent") { - Symbol container = get_container_from_name (eval (nv[1])); - var prefix = container.get_lower_case_cprefix (); + container = get_container_from_name (eval (nv[1])); + var prefix = get_lower_case_cprefix (container); if (symbol.has_prefix (prefix)) { - m.set_cname (m.name); m.name = symbol.substring (prefix.length); } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - m.experimental = true; + m.set_attribute ("Experimental", true); } } else if (nv[0] == "simple_generics") { if (eval (nv[1]) == "1") { - m.simple_generics = true; + m.set_attribute_bool ("CCode", "simple_generics", true); } } } } - - m.set_cname (symbol); - + bool first = true; Parameter last_param = null; DataType last_param_type = null; @@ -2163,14 +2290,14 @@ public class Vala.GIdlParser : CodeVisitor { current_data_type != null && param.type.is_interface && (param_node.name == "self" || - param.type.@interface.has_suffix (current_data_type.get_cname ()))) { + param.type.@interface.has_suffix (get_cname (current_data_type)))) { // instance method continue; } else if (!(m is CreationMethod) && current_data_type != null && param.type.is_interface && (param_node.name == "klass" || - param.type.@interface.has_suffix ("%sClass".printf(current_data_type.get_cname ())))) { + param.type.@interface.has_suffix ("%sClass".printf(get_cname (current_data_type))))) { // class method m.binding = MemberBinding.CLASS; if (m.name.has_prefix ("class_")) { @@ -2275,14 +2402,14 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "no_array_length") { if (eval (nv[1]) == "1") { - p.no_array_length = true; + p.set_attribute_bool ("CCode", "array_length", false); } } else if (nv[0] == "array_length_type") { - p.array_length_type = eval (nv[1]); + p.set_attribute_string ("CCode", "array_length_type", eval (nv[1])); } else if (nv[0] == "array_null_terminated") { if (eval (nv[1]) == "1") { - p.no_array_length = true; - p.array_null_terminated = true; + p.set_attribute_bool ("CCode", "array_length", false); + p.set_attribute_bool ("CCode", "array_null_terminated", true); } } else if (nv[0] == "array_length_pos") { set_array_length_pos = true; @@ -2293,7 +2420,7 @@ public class Vala.GIdlParser : CodeVisitor { } else if (nv[0] == "type_name") { p.variable_type = param_type = parse_type_from_string (eval (nv[1]), false); } else if (nv[0] == "ctype") { - p.ctype = eval (nv[1]); + p.set_attribute_string ("CCode", "type", eval (nv[1])); } else if (nv[0] == "type_arguments") { parse_type_arguments_from_string (param_type, eval (nv[1])); } else if (nv[0] == "default_value") { @@ -2347,10 +2474,10 @@ public class Vala.GIdlParser : CodeVisitor { if (show_param || !hide_param) { m.add_parameter (p); if (set_array_length_pos) { - p.carray_length_parameter_position = array_length_pos; + p.set_attribute_double ("CCode", "array_length_pos", array_length_pos); } if (set_delegate_target_pos) { - p.cdelegate_target_parameter_position = delegate_target_pos; + p.set_attribute_double ("CCode", "delegate_target_pos", delegate_target_pos); } } @@ -2375,6 +2502,16 @@ public class Vala.GIdlParser : CodeVisitor { } else if (add_ellipsis) { m.add_parameter (new Parameter.with_ellipsis ()); } + + if (container == null) { + container = current_data_type; + if (container == null) { + container = current_namespace; + } + } + if (symbol != get_cname (m, container)) { + m.set_attribute_string ("CCode", "cname", symbol); + } return m; } @@ -2402,7 +2539,7 @@ public class Vala.GIdlParser : CodeVisitor { private Method parse_virtual (IdlNodeVFunc v, IdlNodeFunction? func, bool is_interface = false) { weak IdlNode node = (IdlNode) v; - string symbol = "%s%s".printf (current_data_type.get_lower_case_cprefix(), node.name); + string symbol = "%s%s".printf (get_lower_case_cprefix (current_data_type), node.name); if (func != null) { symbol = func.symbol; @@ -2431,7 +2568,7 @@ public class Vala.GIdlParser : CodeVisitor { } if (func == null) { - m.attributes.append (new Attribute ("NoWrapper", null)); + m.set_attribute ("NoWrapper", true); } } @@ -2475,8 +2612,8 @@ public class Vala.GIdlParser : CodeVisitor { prop.interface_only = true; if (prop_node.type.is_interface && prop_node.type.interface == "GStrv") { - prop.no_array_length = true; - prop.array_null_terminated = true; + prop.set_attribute_bool ("CCode", "array_length", false); + prop.set_attribute_bool ("CCode", "array_null_terminated", true); } if (prop_node.readable) { @@ -2492,7 +2629,7 @@ public class Vala.GIdlParser : CodeVisitor { } } - var attributes = get_attributes ("%s:%s".printf (current_data_type.get_cname (), node.name)); + var attributes = get_attributes ("%s:%s".printf (get_cname (current_data_type), node.name)); if (attributes != null) { foreach (string attr in attributes) { var nv = attr.split ("=", 2); @@ -2504,15 +2641,15 @@ public class Vala.GIdlParser : CodeVisitor { parse_type_arguments_from_string (prop.property_type, eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - prop.deprecated = true; + prop.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - prop.replacement = eval (nv[1]); + prop.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - prop.deprecated_since = eval (nv[1]); + prop.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "accessor_method") { if (eval (nv[1]) == "0") { - prop.no_accessor_method = true; + prop.set_attribute ("NoAccessorMethod", true); } } else if (nv[0] == "owned_get") { if (eval (nv[1]) == "1") { @@ -2522,7 +2659,7 @@ public class Vala.GIdlParser : CodeVisitor { prop.property_type = parse_type_from_string (eval (nv[1]), false); } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - prop.experimental = true; + prop.set_attribute ("Experimental", true); } } else if (nv[0] == "nullable") { if (eval (nv[1]) == "1") { @@ -2555,22 +2692,22 @@ public class Vala.GIdlParser : CodeVisitor { foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "cheader_filename") { - c.add_cheader_filename (eval (nv[1])); + c.set_attribute_string ("CCode", "cheader_filename", eval (nv[1])); } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - c.deprecated = true; + c.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - c.replacement = eval (nv[1]); + c.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - c.deprecated_since = eval (nv[1]); + c.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return null; } } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - c.experimental = true; + c.set_attribute ("Experimental", true); } } } @@ -2601,7 +2738,7 @@ public class Vala.GIdlParser : CodeVisitor { bool experimental = false; bool no_delegate_target = false; - var attributes = get_attributes ("%s.%s".printf (current_data_type.get_cname (), node.name)); + var attributes = get_attributes ("%s.%s".printf (get_cname (current_data_type), node.name)); if (attributes != null) { foreach (string attr in attributes) { var nv = attr.split ("=", 2); @@ -2679,50 +2816,50 @@ public class Vala.GIdlParser : CodeVisitor { field.access = SymbolAccessibility.PUBLIC; if (field_name != node.name) { - field.set_cname (node.name); + field.set_attribute_string ("CCode", "cname", node.name); } if (deprecated) { - field.deprecated = true; + field.set_attribute ("Deprecated", true); if (deprecated_since != null) { - field.deprecated_since = deprecated_since; + field.set_attribute_string ("Deprecated", "since", deprecated_since); } if (replacement != null) { - field.replacement = replacement; + field.set_attribute_string ("Deprecated", "replacement", replacement); } } if (experimental) { - field.experimental = true; + field.set_attribute ("Experimental", true); } if (ctype != null) { - field.set_ctype (ctype); + field.set_attribute_string ("CCode", "type", ctype); } if (cheader_filename != null) { - field.add_cheader_filename (cheader_filename); + field.set_attribute_string ("CCode", "cheader_filename", cheader_filename); } if (array_null_terminated) { - field.array_null_terminated = true; + field.set_attribute_bool ("CCode", "array_null_terminated", true); } if (array_length_cname != null || array_length_type != null) { if (array_length_cname != null) { - field.set_array_length_cname (array_length_cname); + field.set_attribute_string ("CCode", "array_length_cname", array_length_cname); } if (array_length_type != null) { - field.array_length_type = array_length_type; + field.set_attribute_string ("CCode", "array_length_type", array_length_type); } - } else { - field.no_array_length = true; + } else if (field.variable_type is ArrayType) { + field.set_attribute_bool ("CCode", "array_length", false); } if (no_delegate_target) { - field.no_delegate_target = true; + field.set_attribute_bool ("CCode", "delegate_target", false); } return field; @@ -2809,28 +2946,28 @@ public class Vala.GIdlParser : CodeVisitor { var sig = new Signal (fix_prop_name (node.name), parse_param (sig_node.result), current_source_reference); sig.access = SymbolAccessibility.PUBLIC; - var attributes = get_attributes ("%s::%s".printf (current_data_type.get_cname (), sig.name)); + var attributes = get_attributes ("%s::%s".printf (get_cname (current_data_type), sig.name)); if (attributes != null) { string ns_name = null; foreach (string attr in attributes) { var nv = attr.split ("=", 2); if (nv[0] == "name") { - sig.set_cname (sig.name); + sig.set_attribute_string ("CCode", "cname", sig.name); sig.name = eval (nv[1]); } else if (nv[0] == "has_emitter" && eval (nv[1]) == "1") { - sig.has_emitter = true; + sig.set_attribute ("HasEmitter", true); } else if (nv[0] == "hidden") { if (eval (nv[1]) == "1") { return null; } } else if (nv[0] == "deprecated") { if (eval (nv[1]) == "1") { - sig.deprecated = true; + sig.set_attribute ("Deprecated", true); } } else if (nv[0] == "replacement") { - sig.replacement = eval (nv[1]); + sig.set_attribute_string ("Deprecated", "replacement", eval (nv[1])); } else if (nv[0] == "deprecated_since") { - sig.deprecated_since = eval (nv[1]); + sig.set_attribute_string ("Deprecated", "since", eval (nv[1])); } else if (nv[0] == "transfer_ownership") { if (eval (nv[1]) == "1") { sig.return_type.value_owned = true; @@ -2843,7 +2980,7 @@ public class Vala.GIdlParser : CodeVisitor { parse_type_arguments_from_string (sig.return_type, eval (nv[1])); } else if (nv[0] == "experimental") { if (eval (nv[1]) == "1") { - sig.experimental = true; + sig.set_attribute ("Experimental", true); } } } @@ -2872,7 +3009,7 @@ public class Vala.GIdlParser : CodeVisitor { bool hide_param = false; bool show_param = false; - attributes = get_attributes ("%s::%s.%s".printf (current_data_type.get_cname (), sig.name, param_node.name)); + attributes = get_attributes ("%s::%s.%s".printf (get_cname (current_data_type), sig.name, param_node.name)); if (attributes != null) { string ns_name = null; foreach (string attr in attributes) { @@ -2891,14 +3028,14 @@ public class Vala.GIdlParser : CodeVisitor { } } else if (nv[0] == "no_array_length") { if (eval (nv[1]) == "1") { - p.no_array_length = true; + p.set_attribute_bool ("CCode", "array_length", false); } } else if (nv[0] == "array_length_type") { - p.array_length_type = eval (nv[1]); + p.set_attribute_string ("CCode", "array_length_type", nv[1]); } else if (nv[0] == "array_null_terminated") { if (eval (nv[1]) == "1") { - p.no_array_length = true; - p.array_null_terminated = true; + p.set_attribute_bool ("CCode", "array_length", false); + p.set_attribute_bool ("CCode", "array_null_terminated", true); } } else if (nv[0] == "is_out") { if (eval (nv[1]) == "1") { |