return decl;
}
+ private CCodeExpression get_type_id_expression (TypeReference! type) {
+ if (type.data_type != null) {
+ return new CCodeIdentifier (type.data_type.get_type_id ());
+ } else if (type.type_parameter != null) {
+ string var_name = "%s_type".printf (type.type_parameter.name.down ());
+ return new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), var_name);
+ } else {
+ return new CCodeIdentifier ("G_TYPE_NONE");
+ }
+ }
+
private CCodeExpression get_dup_func_expression (TypeReference! type) {
if (type.data_type != null) {
string dup_function;
if (expr.type_reference.data_type is Class && expr.type_reference.data_type.is_subtype_of (gobject_type)) {
foreach (TypeReference type_arg in expr.type_reference.get_type_arguments ()) {
+ creation_call.add_argument (get_type_id_expression (type_arg));
if (type_arg.takes_ownership) {
creation_call.add_argument (new CCodeCastExpression (get_dup_func_expression (type_arg), "GBoxedCopyFunc"));
creation_call.add_argument (get_destroy_func_expression (type_arg));
}
public override void visit_typeof_expression (TypeofExpression! expr) {
- expr.ccodenode = new CCodeIdentifier (expr.type_reference.data_type.get_type_id ());
+ expr.ccodenode = get_type_id_expression (expr.type_reference);
}
public override void visit_unary_expression (UnaryExpression! expr) {
}
if (cl.is_subtype_of (gobject_type)) {
- /* create dup_func and destroy_func properties for generic types */
+ /* create type, dup_func, and destroy_func properties for generic types */
foreach (TypeParameter type_param in cl.get_type_parameters ()) {
string func_name, enum_value;
CCodeConstant func_name_constant;
CCodeFunctionCall cinst, cspec;
+ func_name = "%s_type".printf (type_param.name.down ());
+ func_name_constant = new CCodeConstant ("\"%s-type\"".printf (type_param.name.down ()));
+ enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
+ cinst = new CCodeFunctionCall (new CCodeIdentifier ("g_object_class_install_property"));
+ cinst.add_argument (ccall);
+ cinst.add_argument (new CCodeConstant (enum_value));
+ cspec = new CCodeFunctionCall (new CCodeIdentifier ("g_param_spec_gtype"));
+ cspec.add_argument (func_name_constant);
+ cspec.add_argument (new CCodeConstant ("\"type\""));
+ cspec.add_argument (new CCodeConstant ("\"type\""));
+ cspec.add_argument (new CCodeIdentifier ("G_TYPE_NONE"));
+ cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE"));
+ cinst.add_argument (cspec);
+ init_block.add_statement (new CCodeExpressionStatement (cinst));
+ prop_enum.add_value (new CCodeEnumValue (enum_value));
+
+ instance_priv_struct.add_field ("GType", func_name);
+
+
func_name = "%s_dup_func".printf (type_param.name.down ());
func_name_constant = new CCodeConstant ("\"%s-dup-func\"".printf (type_param.name.down ()));
enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
block.add_statement (cswitch);
- /* destroy func properties for generic types */
+ /* type, dup func, and destroy func properties for generic types */
foreach (TypeParameter type_param in cl.get_type_parameters ()) {
- string func_name = "%s_destroy_func".printf (type_param.name.down ());
- string enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
+ string func_name, enum_value;
+ CCodeCaseStatement ccase;
+ CCodeMemberAccess cfield;
+ CCodeFunctionCall cgetcall;
+
+ func_name = "%s_type".printf (type_param.name.down ());
+ enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
+ ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+ cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_gtype"));
+ cgetcall.add_argument (new CCodeIdentifier ("value"));
+ ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
+ ccase.add_statement (new CCodeBreakStatement ());
+ cswitch.add_case (ccase);
+
+ func_name = "%s_dup_func".printf (type_param.name.down ());
+ enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
+ ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+ cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer"));
+ cgetcall.add_argument (new CCodeIdentifier ("value"));
+ ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
+ ccase.add_statement (new CCodeBreakStatement ());
+ cswitch.add_case (ccase);
- var ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
- var cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
- var cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer"));
+ func_name = "%s_destroy_func".printf (type_param.name.down ());
+ enum_value = "%s_%s".printf (cl.get_lower_case_cname (null), func_name).up ();
+ ccase = new CCodeCaseStatement (new CCodeIdentifier (enum_value));
+ cfield = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ cgetcall = new CCodeFunctionCall (new CCodeIdentifier ("g_value_get_pointer"));
cgetcall.add_argument (new CCodeIdentifier ("value"));
ccase.add_statement (new CCodeExpressionStatement (new CCodeAssignment (cfield, cgetcall)));
ccase.add_statement (new CCodeBreakStatement ());
if (in_gobject_creation_method) {
// memory management for generic types
foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
+ function.add_parameter (new CCodeFormalParameter ("%s_type".printf (type_param.name.down ()), "GType"));
function.add_parameter (new CCodeFormalParameter ("%s_dup_func".printf (type_param.name.down ()), "GBoxedCopyFunc"));
function.add_parameter (new CCodeFormalParameter ("%s_destroy_func".printf (type_param.name.down ()), "GDestroyNotify"));
}
cinit.append (cdecl);
}
- /* dup and destroy func properties for generic types */
+ /* type, dup func, and destroy func properties for generic types */
foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
string func_name;
CCodeMemberAccess cmember;
CCodeAssignment cassign;
+ func_name = "%s_type".printf (type_param.name.down ());
+ cmember = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
+ cassign = new CCodeAssignment (cmember, new CCodeIdentifier (func_name));
+ function.block.add_statement (new CCodeExpressionStatement (cassign));
+
func_name = "%s_dup_func".printf (type_param.name.down ());
cmember = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name);
cassign = new CCodeAssignment (cmember, new CCodeIdentifier (func_name));