[vala] GValue: Move explicit cast support to separate function
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] GValue: Move explicit cast support to separate function
- Date: Thu, 7 Jan 2010 20:21:22 +0000 (UTC)
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]