summaryrefslogtreecommitdiff
path: root/codegen
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2021-09-29 00:29:20 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2021-10-01 20:52:01 +0200
commitb60266ea9ba52558a9190d8637676d68b22442b9 (patch)
treeb1737210eff6249a1cceac3bfee825a51cdb40b5 /codegen
parent76a08b801f5f0db5322d4c6d5bd17cae4f1ab337 (diff)
downloadvala-b60266ea9ba52558a9190d8637676d68b22442b9.tar.gz
Set TypeParameter as symbol of GenericType
Diffstat (limited to 'codegen')
-rw-r--r--codegen/valaccodeattribute.vala16
-rw-r--r--codegen/valaccodebasemodule.vala2
-rw-r--r--codegen/valaccodememberaccessmodule.vala3
-rw-r--r--codegen/valagirwriter.vala8
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 ());