[vala] GValue: Move explicit cast support to separate function



commit 4b6fdd0041702c5f8e7ccb62127ac707ff2d0acb
Author: Marc-André Lureau <marcandre lureau gmail com>
Date:   Thu Jan 7 21:08:41 2010 +0100

    GValue: Move explicit cast support to separate function

 codegen/valaccodebasemodule.vala |   48 ++++++++++++++++++++++---------------
 1 files changed, 28 insertions(+), 20 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index fe56e1d..fd4dfc5 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -4120,6 +4120,31 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 		expr.ccodenode = new CCodeUnaryExpression (op, (CCodeExpression) expr.inner.ccodenode);
 	}
 
+	public CCodeExpression? try_cast_value_to_type (CCodeExpression ccodeexpr, DataType from, DataType to, Expression? expr = null) {
+		if (from == null || gvalue_type == null || from.data_type != gvalue_type || to.get_type_id () == null) {
+			return null;
+		}
+
+		// explicit conversion from GValue
+		var ccall = new CCodeFunctionCall (get_value_getter_function (to));
+		CCodeExpression gvalue;
+		if (from.nullable) {
+			gvalue = ccodeexpr;
+		} else {
+			gvalue = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ccodeexpr);
+		}
+		ccall.add_argument (gvalue);
+
+		if (expr != null && to is ArrayType) {
+			// null-terminated string array
+			var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
+			len_call.add_argument (ccall);
+			expr.append_array_size (len_call);
+		}
+
+		return ccall;
+	}
+
 	public override void visit_cast_expression (CastExpression expr) {
 		if (expr.is_non_null_cast) {
 			// TODO add NULL runtime check
@@ -4127,26 +4152,9 @@ internal class Vala.CCodeBaseModule : CCodeModule {
 			return;
 		}
 
-		if (expr.inner.value_type != null && gvalue_type != null && expr.inner.value_type.data_type == gvalue_type
-		    && expr.type_reference.get_type_id () != null) {
-			// explicit conversion from GValue
-			var ccall = new CCodeFunctionCall (get_value_getter_function (expr.type_reference));
-			CCodeExpression gvalue;
-			if (expr.inner.value_type.nullable) {
-				// cast from Value?, no need to get address
-				gvalue = (CCodeExpression) expr.inner.ccodenode;
-			} else {
-				// value getter function expects pointer to GValue, get address of non-null Value
-				gvalue = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, (CCodeExpression) expr.inner.ccodenode);
-			}
-			ccall.add_argument (gvalue);
-			expr.ccodenode = ccall;
-			if (expr.type_reference is ArrayType) {
-				// null-terminated string array
-				var len_call = new CCodeFunctionCall (new CCodeIdentifier ("g_strv_length"));
-				len_call.add_argument (ccall);
-				expr.append_array_size (len_call);
-			}
+		var valuecast = try_cast_value_to_type ((CCodeExpression) expr.inner.ccodenode, expr.inner.value_type, expr.type_reference, expr);
+		if (valuecast != null) {
+			expr.ccodenode = valuecast;
 			return;
 		}
 



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