diff options
author | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-09-29 00:29:20 +0200 |
---|---|---|
committer | Rico Tzschichholz <ricotz@ubuntu.com> | 2021-10-01 20:52:01 +0200 |
commit | b60266ea9ba52558a9190d8637676d68b22442b9 (patch) | |
tree | b1737210eff6249a1cceac3bfee825a51cdb40b5 /codegen | |
parent | 76a08b801f5f0db5322d4c6d5bd17cae4f1ab337 (diff) | |
download | vala-b60266ea9ba52558a9190d8637676d68b22442b9.tar.gz |
Set TypeParameter as symbol of GenericType
Diffstat (limited to 'codegen')
-rw-r--r-- | codegen/valaccodeattribute.vala | 16 | ||||
-rw-r--r-- | codegen/valaccodebasemodule.vala | 2 | ||||
-rw-r--r-- | codegen/valaccodememberaccessmodule.vala | 3 | ||||
-rw-r--r-- | codegen/valagirwriter.vala | 8 |
4 files changed, 23 insertions, 6 deletions
diff --git a/codegen/valaccodeattribute.vala b/codegen/valaccodeattribute.vala index d39fc284e..c3144e0c6 100644 --- a/codegen/valaccodeattribute.vala +++ b/codegen/valaccodeattribute.vala @@ -798,6 +798,22 @@ public class Vala.CCodeAttribute : AttributeCache { } else { return name; } + } else if (sym is TypeParameter) { + assert (node is GenericType); + var type = (GenericType) node; + if (type.value_owned) { + if (CodeContext.get ().profile == Profile.GOBJECT) { + return "gpointer"; + } else { + return "void *"; + } + } else { + if (CodeContext.get ().profile == Profile.GOBJECT) { + return "gconstpointer"; + } else { + return "const void *"; + } + } } else { return "%s%s".printf (get_ccode_prefix (sym.parent_symbol), sym.name); } diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala index 14a8efa91..ff41d344a 100644 --- a/codegen/valaccodebasemodule.vala +++ b/codegen/valaccodebasemodule.vala @@ -5901,7 +5901,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator { return new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, instance_domain, type_domain); } else { CCodeFunctionCall ccheck; - if (type.type_symbol == null || type.type_symbol.external_package) { + if (type is GenericType || type.type_symbol == null || type.type_symbol.external_package) { ccheck = new CCodeFunctionCall (new CCodeIdentifier ("G_TYPE_CHECK_INSTANCE_TYPE")); ccheck.add_argument ((CCodeExpression) ccodenode); ccheck.add_argument (get_type_id_expression (type)); diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala index 4e411c73e..4f0b6a97e 100644 --- a/codegen/valaccodememberaccessmodule.vala +++ b/codegen/valaccodememberaccessmodule.vala @@ -415,7 +415,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule { // Add cast for narrowed type access of variables if needed if (expr.symbol_reference is Variable) { unowned GLibValue cvalue = (GLibValue) expr.target_value; - if (cvalue.value_type.type_symbol != null && cvalue.value_type.type_symbol != expr.value_type.type_symbol) { + if (!(cvalue.value_type is GenericType) && cvalue.value_type.type_symbol != null + && cvalue.value_type.type_symbol != expr.value_type.type_symbol) { cvalue.cvalue = new CCodeCastExpression (cvalue.cvalue, get_ccode_name (expr.value_type)); } } diff --git a/codegen/valagirwriter.vala b/codegen/valagirwriter.vala index 22b024513..696c6c8a6 100644 --- a/codegen/valagirwriter.vala +++ b/codegen/valagirwriter.vala @@ -1672,6 +1672,10 @@ public class Vala.GIRWriter : CodeVisitor { } else if (type is PointerType) { write_indent (); buffer.append_printf ("<type name=\"gpointer\" c:type=\"%s%s\"/>\n", get_ccode_name (type), direction == ParameterDirection.IN ? "" : "*"); + } else if (type is GenericType) { + // generic type parameters not supported in GIR + write_indent (); + buffer.append ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n"); } else if (type is DelegateType) { var deleg_type = (DelegateType) type; write_indent (); @@ -1700,10 +1704,6 @@ public class Vala.GIRWriter : CodeVisitor { write_indent (); buffer.append_printf ("</%s>\n", is_array ? "array" : "type"); } - } else if (type is GenericType) { - // generic type parameters not supported in GIR - write_indent (); - buffer.append ("<type name=\"gpointer\" c:type=\"gpointer\"/>\n"); } else { write_indent (); buffer.append_printf ("<type name=\"%s\"/>\n", type.to_string ()); |