finalize_fragment = instance_finalize_fragment;
} else if (m.is_class_member ()) {
TypeSymbol parent = (TypeSymbol)m.parent_symbol;
- l = new CCodeIdentifier ("%s_GET_CLASS_PRIVATE(%s)".printf(parent.get_upper_case_cname (), parent.get_type_id ()));
- l = new CCodeMemberAccess.pointer (l, get_symbol_lock_name (m.name));
+
+ var get_class_private_call = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf(parent.get_upper_case_cname ())));
+ get_class_private_call.add_argument (new CCodeIdentifier ("klass"));
+ l = new CCodeMemberAccess.pointer (get_class_private_call, get_symbol_lock_name (m.name));
} else {
l = new CCodeIdentifier (get_symbol_lock_name ("%s_%s".printf(m.parent_symbol.get_lower_case_cname (), m.name)));
}
l = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (l, "priv"), get_symbol_lock_name (stmt.resource.symbol_reference.name));
} else if (member.is_class_member ()) {
- l = new CCodeIdentifier ("%s_GET_CLASS_PRIVATE(%s)".printf(parent.get_upper_case_cname (), parent.get_type_id ()));
- l = new CCodeMemberAccess.pointer (l, get_symbol_lock_name (stmt.resource.symbol_reference.name));
+ CCodeExpression klass;
+
+ if (current_method != null && current_method.binding == MemberBinding.INSTANCE ||
+ current_property_accessor != null && current_property_accessor.prop.binding == MemberBinding.INSTANCE ||
+ (in_constructor && !in_static_or_class_context)) {
+ var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+ k.add_argument (new CCodeIdentifier ("self"));
+ klass = k;
+ } else {
+ klass = new CCodeIdentifier ("klass");
+ }
+
+ var get_class_private_call = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf(parent.get_upper_case_cname ())));
+ get_class_private_call.add_argument (klass);
+ l = new CCodeMemberAccess.pointer (get_class_private_call, get_symbol_lock_name (stmt.resource.symbol_reference.name));
} else {
string lock_name = "%s_%s".printf(parent.get_lower_case_cname (), stmt.resource.symbol_reference.name);
l = new CCodeIdentifier (get_symbol_lock_name (lock_name));
if (is_gtypeinstance) {
if (cl.has_class_private_fields || has_class_locks) {
decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_priv_struct.name), new CCodeVariableDeclarator ("%sClassPrivate".printf (cl.get_cname ()))));
- var cdecl = new CCodeDeclaration ("GQuark");
- cdecl.add_declarator (new CCodeVariableDeclarator ("_vala_%s_class_private_quark".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
- cdecl.modifiers = CCodeModifiers.STATIC;
- decl_space.add_type_declaration (cdecl);
+ if (!context.require_glib_version (2, 24)) {
+ var cdecl = new CCodeDeclaration ("GQuark");
+ cdecl.add_declarator (new CCodeVariableDeclarator ("_vala_%s_class_private_quark".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
+ cdecl.modifiers = CCodeModifiers.STATIC;
+ decl_space.add_type_declaration (cdecl);
+ }
}
/* only add the *Private struct if it is not empty, i.e. we actually have private data */
if (cl.has_class_private_fields || has_class_locks) {
decl_space.add_type_member_declaration (type_priv_struct);
- var macro = "((%sClassPrivate *) g_type_get_qdata (type, _vala_%s_class_private_quark))".printf (cl.get_cname(), cl.get_lower_case_cname ());
- decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_CLASS_PRIVATE(type)".printf (cl.get_upper_case_cname (null)), macro));
+ string macro;
+ if (context.require_glib_version (2, 24)) {
+ macro = "(G_TYPE_CLASS_GET_PRIVATE (klass, %s, %sClassPrivate))".printf (cl.get_type_id (), cl.get_cname ());
+ } else {
+ macro = "((%sClassPrivate *) g_type_get_qdata (G_TYPE_FROM_CLASS (klass), _vala_%s_class_private_quark))".printf (cl.get_cname(), cl.get_lower_case_cname ());
+ }
+ decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_CLASS_PRIVATE(klass)".printf (cl.get_upper_case_cname (null)), macro));
}
decl_space.add_type_member_declaration (prop_enum);
} else {
}
- if (cl.class_constructor != null || cl.has_class_private_fields) {
+ if (cl.class_constructor != null || (!context.require_glib_version (2, 24) && cl.has_class_private_fields)) {
add_base_init_function (cl);
}
add_class_init_function (cl);
- if (cl.class_destructor != null || cl.has_class_private_fields) {
+ if (cl.class_destructor != null || (!context.require_glib_version (2, 24) && cl.has_class_private_fields)) {
add_base_finalize_function (cl);
}
var init_block = new CCodeBlock ();
base_init.block = init_block;
- if (cl.has_class_private_fields) {
+ if (!context.require_glib_version (2, 24) && cl.has_class_private_fields) {
var block = new CCodeBlock ();
var cdecl = new CCodeDeclaration ("%sClassPrivate *".printf (cl.get_cname ()));
cdecl.add_declarator (new CCodeVariableDeclarator ("priv"));
var iftrue = new CCodeBlock ();
ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname (null))));
- ccall.add_argument (new CCodeIdentifier ("parent_type"));
+ ccall2 = new CCodeFunctionCall (new CCodeIdentifier ("g_type_class_peek"));
+ ccall2.add_argument (new CCodeIdentifier ("parent_type"));
+ ccall.add_argument (ccall2);
iftrue.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("parent_priv"), ccall)));
block.add_statement (new CCodeIfStatement (new CCodeIdentifier ("parent_type"), iftrue));
block.add_statement (cdecl);
ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname (null))));
- ccall2 = new CCodeFunctionCall (new CCodeIdentifier ("G_TYPE_FROM_CLASS"));
- ccall2.add_argument (new CCodeIdentifier ("klass"));
- ccall.add_argument (ccall2);
+ ccall.add_argument (new CCodeConstant ("klass"));
block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("priv"), ccall)));
ccall = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_free"));
if (field.access == SymbolAccessibility.PRIVATE) {
ccall = new CCodeFunctionCall (new CCodeIdentifier ("%s_GET_CLASS_PRIVATE".printf (cl.get_upper_case_cname ())));
- var ccall2 = new CCodeFunctionCall (new CCodeIdentifier ("G_TYPE_FROM_CLASS"));
- ccall2.add_argument (new CCodeIdentifier ("klass"));
- ccall.add_argument (ccall2);
+ ccall.add_argument (new CCodeIdentifier ("klass"));
left = new CCodeMemberAccess (ccall, field.get_cname (), true);
} else {
left = new CCodeMemberAccess (new CCodeIdentifier ("klass"), field.get_cname (), true);
type_init.add_statement (get_type_interface_init_declaration ());
- if (cl != null && cl.has_class_private_fields) {
+ if (cl != null && cl.has_class_private_fields && !context.require_glib_version (2, 24)) {
CCodeFunctionCall quark_reg_call;
if (plugin) {
type_init.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier (type_id_name), reg_call)));
}
+ if (cl != null && cl.has_class_private_fields && context.require_glib_version (2, 24)) {
+ CCodeFunctionCall add_class_private_call;
+
+ add_class_private_call = new CCodeFunctionCall (new CCodeIdentifier ("g_type_add_class_private"));
+ add_class_private_call.add_argument (new CCodeIdentifier (type_id_name));
+ add_class_private_call.add_argument (new CCodeIdentifier ("sizeof (%sClassPrivate)".printf (get_type_declaration ().get_cname ())));
+ type_init.add_statement (new CCodeExpressionStatement (add_class_private_call));
+ }
+
type_init.add_statement (get_type_interface_init_statements (plugin));
if (!plugin) {