[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#989939: unblock: vala/0.48.18-1



Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: ricotz@ubuntu.com

Please unblock package vala

Vala 0.48.18
============
 * Various improvements and bug fixes:
  - codegen:
    + GArray, GByteArray and GPtrArray are reference counted
    + Replace wrongly hard coded usage of G_OBJECT_GET_CLASS
    + Mark entry point method implementation "_vala_main" as static
    + Improve check for GLib.Source derived classes
  - vala: Parameter following params-array parameter is not allowed

 * Bindings:
  - Update GLib bindings to 2.66 - Sync GLib symbol additions with 0.50.9
  - glib-2.0: Add missing has_typedef attributes on SourceFuncs delegates
  - pango: Mark language parameter of AttrIterator.get_font() as out

 * Various improvements and bug fixes:
  - codegen:
    + Apply gconstpointer to gpointer cast to GenericType only
    + Fix access to captured generics in async method of interfaces (2)
    + Use if-clause for is_in_destructor() condition to be more clear
    + Add missing "_return" label and "_inner_error*_" declaration in dtors
    + Don't use G_GNUC_INTERNAL on implicit type specific fields
  - vala:
    + length-type of arrays must not be nullable
    + Report a warning for unhandled errors in destructors
  - parser:
    + Minor semantic checks to improve error messages
    + Allow empty member-initializer and accept trailing comma
    + Include INTERR token in source_reference of parsed types

[ Reason ]
Vala 0.48.x series is a Long-Term support version and receives important bug
fixes and binding fixes.

https://gitlab.gnome.org/GNOME/vala/-/issues/537
https://gitlab.gnome.org/GNOME/vala/-/issues/1176
https://gitlab.gnome.org/GNOME/vala/-/issues/1178

[ Impact ]
Vala 0.48.x gained updated bindings for glib 2.66 which were backported from
0.50.9.
Currently vala 0.48.17-1 provides bindings for glib 2.64 only.

[ Tests ]
The vala 0.48.x series is constantly used by current package set of Debian
testing.
The upstream test suite is extended with every release.
http://ci.vala-project.org:8010/builders/vala-0.48/builds/49

[ Risks ]
Vala is a compiler and affects every reverse-dependency.

[ Checklist ]
  [X] all changes are documented in the d/changelog
  [X] I reviewed all changes and I approve them
  [X] There are no packaging changes other than the changelog itself
  [X] attach debdiff against the package in testing

[ Other info ]
https://gitlab.gnome.org/GNOME/vala/-/compare/7a59191b7fc5d4c7b77f42ab0e7806011a5c71dd...5587fe63a9489cdcb2fdd91a820c34e54ddbe3e0

unblock vala/0.48.18-1
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 7d06fde1f..e24394863 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1113,8 +1113,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 			if (f.is_private_symbol ()) {
 				flock.modifiers = CCodeModifiers.STATIC;
-			} else if (context.hide_internal && f.is_internal_symbol ()) {
-				flock.modifiers = CCodeModifiers.INTERNAL;
 			} else {
 				flock.modifiers = CCodeModifiers.EXTERN;
 			}
@@ -1132,8 +1130,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 					cdecl.add_declarator (new CCodeVariableDeclarator (get_variable_array_length_cname (f, dim)));
 					if (f.is_private_symbol ()) {
 						cdecl.modifiers = CCodeModifiers.STATIC;
-					} else if (context.hide_internal && f.is_internal_symbol ()) {
-						cdecl.modifiers = CCodeModifiers.INTERNAL;
 					} else {
 						cdecl.modifiers = CCodeModifiers.EXTERN;
 					}
@@ -1149,8 +1145,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 				cdecl.add_declarator (new CCodeVariableDeclarator (get_ccode_delegate_target_name (f)));
 				if (f.is_private_symbol ()) {
 					cdecl.modifiers = CCodeModifiers.STATIC;
-				} else if (context.hide_internal && f.is_internal_symbol ()) {
-					cdecl.modifiers = CCodeModifiers.INTERNAL;
 				} else {
 					cdecl.modifiers = CCodeModifiers.EXTERN;
 				}
@@ -1161,8 +1155,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 					cdecl.add_declarator (new CCodeVariableDeclarator (get_ccode_delegate_target_destroy_notify_name (f)));
 					if (f.is_private_symbol ()) {
 						cdecl.modifiers = CCodeModifiers.STATIC;
-					} else if (context.hide_internal && f.is_internal_symbol ()) {
-						cdecl.modifiers = CCodeModifiers.INTERNAL;
 					} else {
 						cdecl.modifiers = CCodeModifiers.EXTERN;
 					}
@@ -2166,11 +2158,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 				unowned DataType? this_type = get_this_type ();
 				if (this_type != null && (!in_creation_method_with_chainup || current_method.body != b)) {
-					var ref_call = new CCodeFunctionCall (get_dup_func_expression (this_type, b.source_reference));
-					ref_call.add_argument (get_this_cexpression ());
-
-					// never increase reference count for self in finalizers to avoid infinite recursion on following unref
-					var instance = (is_in_destructor () ? (CCodeExpression) new CCodeIdentifier ("self") : (CCodeExpression) ref_call);
+					CCodeExpression instance;
+					if (is_in_destructor ()) {
+						// never increase reference count for self in finalizers to avoid infinite recursion on following unref
+						instance = new CCodeIdentifier ("self");
+					} else {
+						var ref_call = new CCodeFunctionCall (get_dup_func_expression (this_type, b.source_reference));
+						ref_call.add_argument (get_this_cexpression ());
+						instance = ref_call;
+					}
 
 					ccode.add_assignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "self"), instance);
 				}
@@ -2912,9 +2908,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 
 				string method_name = "get_%s_dup_func".printf (type_parameter.name.ascii_down ());
 				var cast_self = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (iface)));
-				cast_self.add_argument (new CCodeIdentifier ("self"));
+				cast_self.add_argument (get_this_cexpression ());
 				var function_call = new CCodeFunctionCall (new CCodeMemberAccess.pointer (cast_self, method_name));
-				function_call.add_argument (new CCodeIdentifier ("self"));
+				function_call.add_argument (get_this_cexpression ());
 				return function_call;
 			}
 
@@ -3759,11 +3755,8 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 		var ccomma = new CCodeCommaExpression ();
 
 		if (context.profile == Profile.GOBJECT
-		    && type.type_symbol != null && !is_reference_counting (type.type_symbol) &&
-		    (type.type_symbol.is_subtype_of (gstringbuilder_type)
-		     || type.type_symbol.is_subtype_of (garray_type)
-		     || type.type_symbol.is_subtype_of (gbytearray_type)
-		     || type.type_symbol.is_subtype_of (gptrarray_type))) {
+		    && type.type_symbol != null && !is_reference_counting (type.type_symbol)
+		    && type.type_symbol.is_subtype_of (gstringbuilder_type)) {
 			ccall.add_argument (new CCodeConstant ("TRUE"));
 		} else if (context.profile == Profile.GOBJECT
 		    && type.type_symbol == gthreadpool_type) {
@@ -4191,7 +4184,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 			CCodeExpression klass;
 
 			if (get_this_type () != null) {
-				var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+				var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function ((Class) parent)));
 				k.add_argument (new CCodeIdentifier ("self"));
 				klass = k;
 			} else {
@@ -4708,15 +4701,17 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
 			}
 
 			CCodeExpression cifnull;
-			if (type.type_symbol != null) {
-				cifnull = new CCodeConstant ("NULL");
-			} else {
+			if (type is GenericType) {
 				// the value might be non-null even when the dup function is null,
 				// so we may not just use NULL for type parameters
 
 				// cast from gconstpointer to gpointer as methods in
 				// generic classes may not return gconstpointer
 				cifnull = new CCodeCastExpression (cexpr, get_ccode_name (pointer_type));
+			} else if (type.type_symbol != null) {
+				cifnull = new CCodeConstant ("NULL");
+			} else {
+				cifnull = cexpr;
 			}
 
 			if (is_ref_function_void (type)) {
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index 7b22c9f23..e18e4cb79 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -715,13 +715,13 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
 					klass = new CCodeIdentifier ("klass");
 				} else {
 					// Accessing the field from within an instance method
-					var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+					var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
 					k.add_argument (new CCodeIdentifier ("self"));
 					klass = k;
 				}
 			} else {
 				// Accessing the field of an instance
-				var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+				var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
 				k.add_argument (get_cvalue_ (instance));
 				klass = k;
 			}
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index 42a7fcaa0..3b4d03b24 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -202,7 +202,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 						type_param_index++;
 					}
 				}
-			} else if (current_class.base_class == gsource_type) {
+			} else if (current_class.is_subtype_of (gsource_type)) {
 				// g_source_new
 
 				string class_prefix = get_ccode_lower_case_name (current_class);
@@ -289,13 +289,13 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 					klass = new CCodeIdentifier ("klass");
 				} else {
 					// Accessing the method from within an instance method
-					var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+					var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
 					k.add_argument (get_this_cexpression ());
 					klass = k;
 				}
 			} else {
 				// Accessing the method of an instance
-				var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+				var k = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_type_get_function (cl)));
 				k.add_argument (get_cvalue (ma.inner));
 				klass = k;
 			}
@@ -979,7 +979,7 @@ public class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
 			}
 		}
 
-		if (m is CreationMethod && m.parent_symbol is Class && ((current_class.is_compact && current_class.base_class != null) || current_class.base_class == gsource_type)) {
+		if (m is CreationMethod && m.parent_symbol is Class && ((current_class.is_compact && current_class.base_class != null) || current_class.is_subtype_of (gsource_type))) {
 			var cinitcall = new CCodeFunctionCall (new CCodeIdentifier ("%s_instance_init".printf (get_ccode_lower_case_name (current_class, null))));
 			cinitcall.add_argument (get_this_cexpression ());
 			if (!current_class.is_compact) {
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index f29463ea4..bb0a96684 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -177,6 +177,10 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
 			function.modifiers |= CCodeModifiers.INTERNAL;
 		}
 
+		if (m.entry_point) {
+			function.modifiers |= CCodeModifiers.STATIC;
+		}
+
 		if (m.version.deprecated) {
 			if (context.profile == Profile.GOBJECT) {
 				decl_space.add_include ("glib.h");
@@ -423,6 +427,10 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
 			function.modifiers |= CCodeModifiers.INLINE;
 		}
 
+		if (m.entry_point) {
+			function.modifiers |= CCodeModifiers.STATIC;
+		}
+
 		var cparam_map = new HashMap<int,CCodeParameter> (direct_hash, direct_equal);
 
 		generate_cparameters (m, cfile, cparam_map, function);
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 5c79f1ef4..43e6e153e 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -63,7 +63,7 @@ public class Vala.GTypeModule : GErrorModule {
 
 		bool is_gtypeinstance = !cl.is_compact;
 		bool is_fundamental = is_gtypeinstance && cl.base_class == null;
-		bool is_gsource = cl.base_class == gsource_type;
+		bool is_gsource = cl.is_subtype_of (gsource_type);
 
 		if (is_gtypeinstance) {
 			decl_space.add_include ("glib-object.h");
@@ -628,7 +628,7 @@ public class Vala.GTypeModule : GErrorModule {
 			begin_class_finalize_function (cl);
 			begin_finalize_function (cl);
 		} else {
-			if (cl.is_compact || cl.base_class == null || cl.base_class == gsource_type) {
+			if (cl.is_compact || cl.base_class == null || cl.is_subtype_of (gsource_type)) {
 				begin_instance_init_function (cl);
 				begin_finalize_function (cl);
 			}
@@ -768,7 +768,7 @@ public class Vala.GTypeModule : GErrorModule {
 				cfile.add_function (unref_fun);
 			}
 		} else {
-			if (cl.is_compact || cl.base_class == null || cl.base_class == gsource_type) {
+			if (cl.is_compact || cl.base_class == null || cl.is_subtype_of (gsource_type)) {
 				add_instance_init_function (cl);
 				add_finalize_function (cl);
 			}
@@ -1610,7 +1610,7 @@ public class Vala.GTypeModule : GErrorModule {
 
 		push_function (func);
 
-		bool is_gsource = cl.base_class == gsource_type;
+		bool is_gsource = cl.is_subtype_of (gsource_type);
 
 		if (cl.is_compact) {
 			// Add declaration, since the instance_init function is explicitly called
@@ -1696,6 +1696,16 @@ public class Vala.GTypeModule : GErrorModule {
 
 		if (cl.static_destructor != null) {
 			cl.static_destructor.body.emit (this);
+
+			if (current_method_inner_error) {
+				ccode.add_declaration ("GError*", new CCodeVariableDeclarator.zero ("_inner_error%d_".printf (current_inner_error_id), new CCodeConstant ("NULL")));
+			}
+
+			if (current_method_return) {
+				// support return statements in destructors
+				ccode.add_label ("_return");
+				ccode.add_statement (new CCodeEmptyStatement ());
+			}
 		}
 
 		pop_context ();
@@ -1719,6 +1729,16 @@ public class Vala.GTypeModule : GErrorModule {
 
 		if (cl.class_destructor != null) {
 			cl.class_destructor.body.emit (this);
+
+			if (current_method_inner_error) {
+				ccode.add_declaration ("GError*", new CCodeVariableDeclarator.zero ("_inner_error%d_".printf (current_inner_error_id), new CCodeConstant ("NULL")));
+			}
+
+			if (current_method_return) {
+				// support return statements in destructors
+				ccode.add_label ("_return");
+				ccode.add_statement (new CCodeEmptyStatement ());
+			}
 		}
 
 		pop_context ();
@@ -1736,7 +1756,7 @@ public class Vala.GTypeModule : GErrorModule {
 	private void begin_finalize_function (Class cl) {
 		push_context (instance_finalize_context);
 
-		bool is_gsource = cl.base_class == gsource_type;
+		bool is_gsource = cl.is_subtype_of (gsource_type);
 
 		if (!cl.is_compact || is_gsource) {
 			var fundamental_class = cl;
@@ -1830,7 +1850,7 @@ public class Vala.GTypeModule : GErrorModule {
 			pop_context ();
 
 			cfile.add_function (instance_finalize_context.ccode);
-		} else if (cl.base_class == gsource_type) {
+		} else if (cl.is_subtype_of (gsource_type)) {
 			cfile.add_function (instance_finalize_context.ccode);
 		}
 	}
diff --git a/vala/valaarraycreationexpression.vala b/vala/valaarraycreationexpression.vala
index 5e0f46172..c16808c61 100644
--- a/vala/valaarraycreationexpression.vala
+++ b/vala/valaarraycreationexpression.vala
@@ -258,7 +258,7 @@ public class Vala.ArrayCreationExpression : Expression {
 			length_type = context.analyzer.int_type.copy ();
 		} else {
 			length_type.check (context);
-			if (!(length_type is IntegerType)) {
+			if (!(length_type is IntegerType) || length_type.nullable) {
 				error = true;
 				Report.error (length_type.source_reference, "Expected integer type as length type of array");
 			}
diff --git a/vala/valaarraytype.vala b/vala/valaarraytype.vala
index 7fff66b04..50f40721b 100644
--- a/vala/valaarraytype.vala
+++ b/vala/valaarraytype.vala
@@ -317,7 +317,7 @@ public class Vala.ArrayType : ReferenceType {
 			length_type = context.analyzer.int_type.copy ();
 		} else {
 			length_type.check (context);
-			if (!(length_type is IntegerType)) {
+			if (!(length_type is IntegerType) || length_type.nullable) {
 				error = true;
 				Report.error (length_type.source_reference, "Expected integer type as length type of array");
 				return false;
diff --git a/vala/valaclass.vala b/vala/valaclass.vala
index 3fffdb352..f6ee91e59 100644
--- a/vala/valaclass.vala
+++ b/vala/valaclass.vala
@@ -702,7 +702,7 @@ public class Vala.Class : ObjectTypeSymbol {
 				}
 			}
 
-			if (!external && !external_package && base_class != null && base_class != context.analyzer.gsource_type) {
+			if (!external && !external_package && base_class != null && !base_class.is_subtype_of (context.analyzer.gsource_type)) {
 				foreach (Field f in get_fields ()) {
 					if (f.binding == MemberBinding.INSTANCE) {
 						error = true;
diff --git a/vala/valadestructor.vala b/vala/valadestructor.vala
index 61797ea22..a04849673 100644
--- a/vala/valadestructor.vala
+++ b/vala/valadestructor.vala
@@ -77,6 +77,16 @@ public class Vala.Destructor : Subroutine {
 			body.check (context);
 		}
 
+		if (body != null && !body.error) {
+			var body_errors = new ArrayList<DataType> ();
+			body.get_error_types (body_errors);
+			foreach (DataType body_error_type in body_errors) {
+				if (!((ErrorType) body_error_type).dynamic_error) {
+					Report.warning (body_error_type.source_reference, "unhandled error `%s'".printf (body_error_type.to_string()));
+				}
+			}
+		}
+
 		context.analyzer.current_symbol = parent_symbol;
 
 		return !error;
diff --git a/vala/valamethod.vala b/vala/valamethod.vala
index 0bed502b9..9c34c7ad0 100644
--- a/vala/valamethod.vala
+++ b/vala/valamethod.vala
@@ -841,6 +841,7 @@ public class Vala.Method : Subroutine, Callable {
 		}
 
 		var optional_param = false;
+		var params_array_param = false;
 		foreach (Parameter param in parameters) {
 			if (!param.check (context)) {
 				error = true;
@@ -865,6 +866,11 @@ public class Vala.Method : Subroutine, Callable {
 				optional_param = true;
 			}
 
+			if (params_array_param) {
+				Report.error (param.source_reference, "parameter follows params-array parameter");
+			} else if (param.params_array) {
+				params_array_param = true;
+			}
 			// Add local variable to provide access to params arrays which will be constructed out of the given va-args
 			if (param.params_array && body != null) {
 				if (params_array_var != null) {
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index e64591c73..1424d3e2c 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -538,6 +538,7 @@ public class Vala.Parser : CodeVisitor {
 
 			if (!(type is PointerType)) {
 				type.nullable = accept (TokenType.INTERR);
+				type.source_reference = get_src (begin);
 			}
 		}
 
@@ -1038,9 +1039,13 @@ public class Vala.Parser : CodeVisitor {
 	List<MemberInitializer> parse_object_initializer () throws ParseError {
 		var list = new ArrayList<MemberInitializer> ();
 		if (accept (TokenType.OPEN_BRACE)) {
-			do {
+			while (current () != TokenType.CLOSE_BRACE) {
 				list.add (parse_member_initializer ());
-			} while (accept (TokenType.COMMA));
+
+				if (!accept (TokenType.COMMA)) {
+					break;
+				}
+			}
 			expect (TokenType.CLOSE_BRACE);
 		}
 		return list;
@@ -2384,12 +2389,18 @@ public class Vala.Parser : CodeVisitor {
 		case TokenType.CONSTRUCT:
 			if (context.profile == Profile.GOBJECT) {
 				rollback (begin);
+				if (!(parent is TypeSymbol)) {
+					throw new ParseError.SYNTAX ("unexpected `construct' declaration");
+				}
 				parse_constructor_declaration (parent, attrs);
 				return;
 			}
 			break;
 		case TokenType.TILDE:
 			rollback (begin);
+			if (!(parent is TypeSymbol)) {
+				throw new ParseError.SYNTAX ("unexpected `destructor' declaration");
+			}
 			parse_destructor_declaration (parent, attrs);
 			return;
 		case TokenType.OPEN_BRACE:
@@ -2468,6 +2479,9 @@ public class Vala.Parser : CodeVisitor {
 				break;
 			case TokenType.OPEN_PARENS:
 				rollback (begin);
+				if (!(parent is TypeSymbol)) {
+					throw new ParseError.SYNTAX ("unexpected `constructor' declaration");
+				}
 				parse_creation_method_declaration (parent, attrs);
 				return;
 			default:
@@ -2480,6 +2494,9 @@ public class Vala.Parser : CodeVisitor {
 						parse_delegate_declaration (parent, attrs);
 						return;
 					case TokenType.SIGNAL:
+						if (!(parent is ObjectTypeSymbol)) {
+							throw new ParseError.SYNTAX ("unexpected `signal' declaration");
+						}
 						parse_signal_declaration (parent, attrs);
 						return;
 					default:
@@ -2500,6 +2517,9 @@ public class Vala.Parser : CodeVisitor {
 				case TokenType.OPEN_BRACE:
 				case TokenType.THROWS:
 					rollback (begin);
+					if (!(parent is TypeSymbol)) {
+						throw new ParseError.SYNTAX ("unexpected `property' declaration");
+					}
 					parse_property_declaration (parent, attrs);
 					return;
 				default:
diff --git a/vapi/gio-2.0.vapi b/vapi/gio-2.0.vapi
index 0c60a0a0c..2a30d4ff0 100644
--- a/vapi/gio-2.0.vapi
+++ b/vapi/gio-2.0.vapi
@@ -3020,6 +3020,9 @@ namespace GLib {
 		protected TlsConnection ();
 		public bool emit_accept_certificate (GLib.TlsCertificate peer_cert, GLib.TlsCertificateFlags errors);
 		public unowned GLib.TlsCertificate? get_certificate ();
+		[CCode (vfunc_name = "get_binding_data")]
+		[Version (since = "2.66")]
+		public virtual bool get_channel_binding_data (GLib.TlsChannelBindingType type, out unowned GLib.ByteArray data) throws GLib.TlsChannelBindingError;
 		[Version (since = "2.30")]
 		public unowned GLib.TlsDatabase? get_database ();
 		[Version (since = "2.30")]
@@ -3515,6 +3518,9 @@ namespace GLib {
 		public async bool close_async (int io_priority = GLib.Priority.DEFAULT, GLib.Cancellable? cancellable = null) throws GLib.Error;
 		public bool emit_accept_certificate (GLib.TlsCertificate peer_cert, GLib.TlsCertificateFlags errors);
 		public unowned GLib.TlsCertificate? get_certificate ();
+		[CCode (vfunc_name = "get_binding_data")]
+		[Version (since = "2.66")]
+		public virtual bool get_channel_binding_data (GLib.TlsChannelBindingType type, out unowned GLib.ByteArray data) throws GLib.TlsChannelBindingError;
 		public unowned GLib.TlsDatabase? get_database ();
 		public unowned GLib.TlsInteraction? get_interaction ();
 		[Version (since = "2.60")]
@@ -4148,7 +4154,8 @@ namespace GLib {
 		FREEBSD_CMSGCRED,
 		OPENBSD_SOCKPEERCRED,
 		SOLARIS_UCRED,
-		NETBSD_UNPCBID
+		NETBSD_UNPCBID,
+		APPLE_XUCRED
 	}
 	[CCode (cheader_filename = "gio/gio.h", cprefix = "G_DBUS_CALL_FLAGS_", type_id = "g_dbus_call_flags_get_type ()")]
 	[Flags]
@@ -4627,6 +4634,12 @@ namespace GLib {
 	public enum TlsCertificateRequestFlags {
 		NONE
 	}
+	[CCode (cheader_filename = "gio/gio.h", cprefix = "G_TLS_CHANNEL_BINDING_TLS_", type_id = "g_tls_channel_binding_type_get_type ()")]
+	[Version (since = "2.66")]
+	public enum TlsChannelBindingType {
+		UNIQUE,
+		SERVER_END_POINT
+	}
 	[CCode (cheader_filename = "gio/gio.h", cprefix = "G_TLS_DATABASE_LOOKUP_", type_id = "g_tls_database_lookup_flags_get_type ()")]
 	[Version (since = "2.30")]
 	public enum TlsDatabaseLookupFlags {
@@ -4828,6 +4841,15 @@ namespace GLib {
 		[CCode (cheader_filename = "gio/gio.h")]
 		public static GLib.Quark quark ();
 	}
+	[CCode (cheader_filename = "gio/gio.h", cprefix = "G_TLS_CHANNEL_BINDING_ERROR_")]
+	[Version (since = "2.66")]
+	public errordomain TlsChannelBindingError {
+		NOT_IMPLEMENTED,
+		INVALID_STATE,
+		NOT_AVAILABLE,
+		NOT_SUPPORTED,
+		GENERAL_ERROR
+	}
 	[CCode (cheader_filename = "gio/gio.h", cprefix = "G_TLS_ERROR_")]
 	[Version (since = "2.28")]
 	public errordomain TlsError {
diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi
index f389d2916..125d57805 100644
--- a/vapi/glib-2.0.vapi
+++ b/vapi/glib-2.0.vapi
@@ -2085,13 +2085,13 @@ namespace GLib {
 	[CCode (has_target = false)]
 	public delegate void SourceDummyMarshal ();
 
-	[CCode (has_target = false)]
+	[CCode (has_target = false, has_typedef = false)]
 	public delegate bool SourcePrepareFunc (Source source, out int timeout_);
-	[CCode (has_target = false)]
+	[CCode (has_target = false, has_typedef = false)]
 	public delegate bool SourceCheckFunc (Source source);
-	[CCode (has_target = false)]
+	[CCode (has_target = false, has_typedef = false)]
 	public delegate bool SourceDispatchFunc (Source source, SourceFunc? _callback);
-	[CCode (has_target = false)]
+	[CCode (has_target = false, has_typedef = false)]
 	public delegate void SourceFinalizeFunc (Source source);
 
 	[CCode (has_type_id = false)]
@@ -3863,6 +3863,8 @@ namespace GLib {
 		public static bool get_contents (string filename, out string contents, out size_t length = null) throws FileError;
 		[Version (since = "2.8")]
 		public static bool set_contents (string filename, string contents, ssize_t length = -1) throws FileError;
+		[Version (since = "2.66")]
+		public static bool set_contents_full (string filename, string contents, ssize_t length = -1, FileSetContentsFlags flags = 0, int mode = 0666) throws FileError;
 		[CCode (cname = "g_file_get_contents")]
 		public static bool get_data (string filename, [CCode (type = "gchar**", array_length_type = "size_t")] out uint8[] contents) throws FileError;
 		[CCode (cname = "g_file_set_contents")]
@@ -3904,6 +3906,16 @@ namespace GLib {
 		public static bool close_checked (int fd) throws FileError;
 	}
 
+	[Flags]
+	[Version (since = "2.66")]
+	[CCode (cprefix = "G_FILE_SET_CONTENTS_", has_type_id = false)]
+	public enum FileSetContentsFlags {
+		NONE,
+		CONSISTENT,
+		DURABLE,
+		ONLY_EXISTING
+	}
+
 	[CCode (cname = "GStatBuf", cheader_filename = "glib/gstdio.h", has_type_id = false)]
 	public struct Stat {
 		public time_t st_atime;
@@ -3967,26 +3979,146 @@ namespace GLib {
 
 	/* URI Functions */
 
-	namespace Uri {
+	[Compact]
+	[CCode (ref_function = "g_uri_ref", unref_function = "g_uri_unref", type_id = "G_TYPE_URI")]
+	public class Uri {
+		[Version (since = "2.16")]
 		public const string RESERVED_CHARS_ALLOWED_IN_PATH;
+		[Version (since = "2.16")]
 		public const string RESERVED_CHARS_ALLOWED_IN_PATH_ELEMENT;
+		[Version (since = "2.16")]
 		public const string RESERVED_CHARS_ALLOWED_IN_USERINFO;
+		[Version (since = "2.16")]
 		public const string RESERVED_CHARS_GENERIC_DELIMITERS;
+		[Version (since = "2.16")]
 		public const string RESERVED_CHARS_SUBCOMPONENT_DELIMITERS;
 
+		[Version (since = "2.66")]
+		public static bool split (string uri_string, UriFlags flags, out string? scheme, out string? userinfo, out string? host, out int port, out string? path, out string? query, out string? fragment) throws UriError;
+		[Version (since = "2.66")]
+		public static bool split_with_user (string uri_string, UriFlags flags, out string? scheme, out string? user, out string? password, out string? auth_params, out string? host, out int port, out string? path, out string? query, out string? fragment) throws UriError;
+		[Version (since = "2.66")]
+		public static bool split_network (string uri_string, UriFlags flags, out string? scheme, out string? host, out int port) throws UriError;
+		[Version (since = "2.66")]
+		public static bool is_valid (string uri_string, UriFlags flags) throws UriError;
+		[Version (since = "2.66")]
+		public static string join (UriFlags flags, string scheme, string? userinfo, string? host, int port, string path, string? query, string? fragment);
+		[Version (since = "2.66")]
+		public static string join_with_user (UriFlags flags, string scheme, string? user, string? password, string? auth_params, string? host, int port, string path, string? query, string? fragment);
+
+		[Version (since = "2.66")]
+		public static Uri parse (string uri_string, UriFlags flags) throws UriError;
+		[Version (since = "2.66")]
+		public static Uri parse_relative (Uri? base_uri, string uri_string, UriFlags flags) throws UriError;
+		[Version (since = "2.66")]
+		public static string resolve_relative (string base_uri_string, string uri_string, UriFlags flags) throws UriError;
+		[Version (since = "2.66")]
+		public static Uri build (UriFlags flags, string scheme, string? userinfo, string? host, int port, string path, string? query, string? fragment);
+		[Version (since = "2.66")]
+		public static Uri build_with_user (UriFlags flags, string scheme, string? user, string? password, string? auth_params, string? host, int port, string path, string? query, string? fragment);
+
+		[Version (since = "2.66")]
+		public unowned string get_scheme ();
+		[Version (since = "2.66")]
+		public unowned string? get_userinfo ();
+		[Version (since = "2.66")]
+		public unowned string? get_user ();
+		[Version (since = "2.66")]
+		public unowned string? get_password ();
+		[Version (since = "2.66")]
+		public unowned string? get_auth_params ();
+		[Version (since = "2.66")]
+		public unowned string? get_host ();
+		[Version (since = "2.66")]
+		public int get_port ();
+		[Version (since = "2.66")]
+		public unowned string get_path ();
+		[Version (since = "2.66")]
+		public unowned string? get_query ();
+		[Version (since = "2.66")]
+		public unowned string? get_fragment ();
+		[Version (since = "2.66")]
+		public UriFlags get_flags ();
+
+		[Version (since = "2.66")]
+		public static HashTable<string,string> parse_params (string uri, size_t length = -1, string separators = "&;", UriParamsFlags flags = 0) throws UriError;
 		[Version (since = "2.16")]
 		public static string? parse_scheme (string uri);
+		[Version (since = "2.66")]
+		public static unowned string? peek_scheme (string uri);
 		[Version (since = "2.16")]
 		public static string escape_string (string unescaped, string? reserved_chars_allowed = null, bool allow_utf8 = true);
 		[Version (since = "2.16")]
 		public static string? unescape_string (string escaped_string, string? illegal_characters = null);
 		[Version (since = "2.16")]
 		public static string? unescape_segment (string? escaped_string, string? escaped_string_end, string? illegal_characters = null);
+		[Version (since = "2.66")]
+		public static Bytes? unescape_bytes (string escaped_string, size_t length = -1, string? illegal_characters = null) throws UriError;
+		[Version (since = "2.66")]
+		public static string? escape_bytes ([CCode (array_length_type = "gsize")] uint8[] unescaped, string? reserved_chars_allowed = null);
 		[Version (since = "2.6")]
 		[CCode (array_length = false, array_null_terminated = true)]
 		public static string[] list_extract_uris (string uri_list);
 	}
 
+	[Version (since = "2.66")]
+	public errordomain UriError {
+		FAILED,
+		BAD_SCHEME,
+		BAD_USER,
+		BAD_PASSWORD,
+		BAD_AUTH_PARAMS,
+		BAD_HOST,
+		BAD_PORT,
+		BAD_PATH,
+		BAD_QUERY,
+		BAD_FRAGMENT;
+		public static GLib.Quark quark ();
+	}
+
+	[Flags]
+	[Version (since = "2.66")]
+	[CCode (cprefix = "G_URI_FLAGS_", has_type_id = false)]
+	public enum UriFlags {
+		NONE,
+		PARSE_RELAXED,
+		HAS_PASSWORD,
+		HAS_AUTH_PARAMS,
+		ENCODED,
+		NON_DNS,
+		ENCODED_QUERY,
+		ENCODED_PATH,
+		ENCODED_FRAGMENT
+	}
+
+	[Flags]
+	[Version (since = "2.66")]
+	[CCode (cprefix = "G_URI_HIDE_", has_type_id = false)]
+	public enum UriHideFlags {
+		NONE,
+		USERINFO,
+		PASSWORD,
+		AUTH_PARAMS,
+		QUERY,
+		FRAGMENT
+	}
+
+	[Version (since = "2.66")]
+	public struct UriParamsIter {
+		public UriParamsIter (string @params, int length = -1, string separators = "&;", UriParamsFlags flags = 0);
+		public bool next (out string attribute = null, out string @value = null) throws Error;
+	}
+
+	[Flags]
+	[Version (since = "2.66")]
+	[CCode (cprefix = "G_URI_PARAMS_", has_type_id = false)]
+	public enum UriParamsFlags {
+		NONE,
+		CASE_INSENSITIVE,
+		WWW_FORM,
+		PARSE_RELAXED
+	}
+
 	/* Shell-related Utilities */
 
 	public errordomain ShellError {
@@ -4511,24 +4643,48 @@ namespace GLib {
 		public string get_mime_type (string uri) throws BookmarkFileError;
 		public bool get_is_private (string uri) throws BookmarkFileError;
 		public bool get_icon (string uri, out string href, out string mime_type) throws BookmarkFileError;
+		[Version (deprecated_since = "2.66", replacement = "get_added_date_time")]
 		public time_t get_added (string uri) throws BookmarkFileError;
+		[Version (since = "2.66")]
+		public unowned DateTime get_added_date_time (string uri) throws BookmarkFileError;
+		[Version (deprecated_since = "2.66", replacement = "get_modified_date_time")]
 		public time_t get_modified (string uri) throws BookmarkFileError;
+		[Version (since = "2.66")]
+		public unowned DateTime get_modified_date_time (string uri) throws BookmarkFileError;
+		[Version (deprecated_since = "2.66", replacement = "get_visited_date_time")]
 		public time_t get_visited (string uri) throws BookmarkFileError;
+		[Version (since = "2.66")]
+		public unowned DateTime get_visited_date_time (string uri) throws BookmarkFileError;
 		[CCode (array_length_type = "gsize")]
 		public string[] get_groups (string uri) throws BookmarkFileError;
 		[CCode (array_length_type = "gsize")]
 		public string[] get_applications (string uri) throws BookmarkFileError;
+		[Version (deprecated_since = "2.66", replacement = "get_application_info")]
 		public bool get_app_info (string uri, string name, out string exec, out uint count, out time_t stamp) throws BookmarkFileError;
+		[Version (since = "2.66")]
+		public bool get_application_info (string uri, string name, out string exec, out uint count, out unowned DateTime? stamp) throws BookmarkFileError;
 		public void set_title (string uri, string title);
 		public void set_description (string uri, string description);
 		public void set_mime_type (string uri, string mime_type);
 		public void set_is_private (string uri, bool is_private);
 		public void set_icon (string uri, string href, string mime_type);
+		[Version (deprecated_since = "2.66", replacement = "set_added_date_time")]
 		public void set_added (string uri, time_t added);
+		[Version (since = "2.66")]
+		public void set_added_date_time (string uri, DateTime added);
 		public void set_groups (string uri, string[] groups);
+		[Version (deprecated_since = "2.66", replacement = "set_modified_date_time")]
 		public void set_modified (string uri, time_t modified);
+		[Version (since = "2.66")]
+		public void set_modified_date_time (string uri, DateTime modified);
+		[Version (deprecated_since = "2.66", replacement = "set_visited_date_time")]
 		public void set_visited (string uri, time_t visited);
+		[Version (since = "2.66")]
+		public void set_visited_date_time (string uri, DateTime visited);
+		[Version (deprecated_since = "2.66", replacement = "set_application_info")]
 		public bool set_app_info (string uri, string name, string exec, int count, time_t stamp) throws BookmarkFileError;
+		[Version (since = "2.66")]
+		public bool set_application_info (string uri, string name, string exec, int count, DateTime? stamp) throws BookmarkFileError;
 		public void add_group (string uri, string group);
 		public void add_application (string uri, string name, string exec);
 		public bool remove_group (string uri, string group) throws BookmarkFileError;
@@ -5731,6 +5887,7 @@ namespace GLib {
 		public const uint @2_60;
 		public const uint @2_62;
 		public const uint @2_64;
+		public const uint @2_66;
 
 		[CCode (cname = "glib_binary_age")]
 		public const uint binary_age;
@@ -6322,7 +6479,13 @@ namespace GLib {
 		ELYMAIC,                /* Elym */
 		NANDINAGARI,            /* Nand */
 		NYIAKENG_PUACHUE_HMONG, /* Rohg */
-		WANCHO;                 /* Wcho */
+		WANCHO,                 /* Wcho */
+
+		/* Unicode 13.0 additions */
+		CHORASMIAN,             /* Chrs */
+		DIVES_AKURU,            /* Diak */
+		KHITAN_SMALL_SCRIPT,    /* Kits */
+		YEZIDI;                 /* Yezi */
 
 		[CCode (cname = "g_unicode_script_to_iso15924")]
 		public uint32 to_iso15924 ();
diff --git a/vapi/gobject-2.0.vapi b/vapi/gobject-2.0.vapi
index e3b2dca5e..c7e3716c1 100644
--- a/vapi/gobject-2.0.vapi
+++ b/vapi/gobject-2.0.vapi
@@ -252,6 +252,8 @@ namespace GLib {
 		public unowned GLib.ParamSpec get_redirect_target ();
 		[CCode (cname = "g_param_spec_internal")]
 		public ParamSpec.@internal (GLib.Type param_type, string name, string nick, string blurb, GLib.ParamFlags flags);
+		[Version (since = "2.66")]
+		public static bool is_valid_name (string name);
 		public unowned GLib.ParamSpec @ref ();
 		public unowned GLib.ParamSpec ref_sink ();
 		public void set_qdata (GLib.Quark quark, void* data);
@@ -567,6 +569,8 @@ namespace GLib {
 		public static void emit_by_name (void* instance, string detailed_signal, ...);
 		public static unowned GLib.SignalInvocationHint? get_invocation_hint (void* instance);
 		public static bool has_handler_pending (void* instance, uint signal_id, GLib.Quark detail, bool may_be_blocked);
+		[Version (since = "2.66")]
+		public static bool is_valid_name (string name);
 		[CCode (array_length_type = "guint")]
 		public static uint[] list_ids (GLib.Type itype);
 		public static uint lookup (string name, GLib.Type itype);
@@ -770,6 +774,8 @@ namespace GLib {
 		public void set_instance (void* instance);
 		public void set_int (int v_int);
 		public void set_int64 (int64 v_int64);
+		[Version (since = "2.66")]
+		public void set_interned_string (string? v_string);
 		public void set_long (long v_long);
 		public void set_object (GLib.Object? v_object);
 		public void set_param (GLib.ParamSpec? param);
diff --git a/vapi/metadata/Gio-2.0.metadata b/vapi/metadata/Gio-2.0.metadata
index 26eec0e38..510cfd2b5 100644
--- a/vapi/metadata/Gio-2.0.metadata
+++ b/vapi/metadata/Gio-2.0.metadata
@@ -224,6 +224,9 @@ Socket
   .condition_wait throws="GLib.IOError"
   .connection_factory_create_connection parent="GLib.SocketConnection" name="factory_create_connection" symbol_type="function"
   .create_source skip=false type="GLib.SocketSource"
+  .receive.buffer out=false
+  .receive_from.buffer out=false
+  .receive_with_blocking.buffer out=false
 SocketControlMessage
   .serialize.data type="uint8[]"
 SocketListener
@@ -375,6 +378,8 @@ Application
 Converter
   .convert.inbuf nullable=false
 DBusSubtreeVTable.enumerate skip=false
+DtlsConnection
+  .get_channel_binding_data#method virtual vfunc_name="get_binding_data" throws="GLib.TlsChannelBindingError"
 File
   .measure_disk_usage* skip=false
   .measure_disk_usage*.* default=()
@@ -394,5 +399,7 @@ TlsBackend
   .get_client_connection_type abstract
   .get_file_database_type abstract
   .get_server_connection_type abstract
+TlsConnection
+  .get_channel_binding_data#method virtual vfunc_name="get_binding_data" throws="GLib.TlsChannelBindingError"
 IOStream
   .splice_async finish_instance=false
diff --git a/vapi/metadata/Pango-1.0.metadata b/vapi/metadata/Pango-1.0.metadata
index 03745c299..3489f74c4 100644
--- a/vapi/metadata/Pango-1.0.metadata
+++ b/vapi/metadata/Pango-1.0.metadata
@@ -77,6 +77,7 @@ Attribute
   .destroy destroys_instance
 AttrIterator
   .destroy destroys_instance
+  .get_font.language out
 Coverage
   .unref destroys_instance=false
 Item
diff --git a/vapi/pango.vapi b/vapi/pango.vapi
index f96714851..0290766da 100644
--- a/vapi/pango.vapi
+++ b/vapi/pango.vapi
@@ -66,7 +66,7 @@ namespace Pango {
 		public unowned Pango.Attribute? @get (Pango.AttrType type);
 		[Version (since = "1.2")]
 		public GLib.SList<Pango.Attribute> get_attrs ();
-		public void get_font (Pango.FontDescription desc, Pango.Language? language, owned GLib.SList<Pango.Attribute>? extra_attrs);
+		public void get_font (Pango.FontDescription desc, out unowned Pango.Language? language, owned GLib.SList<Pango.Attribute>? extra_attrs);
 		public bool next ();
 		public void range (out int start, out int end);
 	}

Reply to: