LCOV - code coverage report
Current view: top level - glib/girepository - gifieldinfo.c (source / functions) Hit Total Coverage
Test: unnamed Lines: 16 245 6.5 %
Date: 2024-05-07 05:15:23 Functions: 2 7 28.6 %
Branches: 2 43 4.7 %

           Branch data     Line data    Source code
       1                 :            : /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
       2                 :            :  * GObject introspection: Field implementation
       3                 :            :  *
       4                 :            :  * Copyright (C) 2005 Matthias Clasen
       5                 :            :  * Copyright (C) 2008,2009 Red Hat, Inc.
       6                 :            :  *
       7                 :            :  * SPDX-License-Identifier: LGPL-2.1-or-later
       8                 :            :  *
       9                 :            :  * This library is free software; you can redistribute it and/or
      10                 :            :  * modify it under the terms of the GNU Lesser General Public
      11                 :            :  * License as published by the Free Software Foundation; either
      12                 :            :  * version 2 of the License, or (at your option) any later version.
      13                 :            :  *
      14                 :            :  * This library is distributed in the hope that it will be useful,
      15                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      16                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      17                 :            :  * Lesser General Public License for more details.
      18                 :            :  *
      19                 :            :  * You should have received a copy of the GNU Lesser General Public
      20                 :            :  * License along with this library; if not, write to the
      21                 :            :  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      22                 :            :  * Boston, MA 02111-1307, USA.
      23                 :            :  */
      24                 :            : 
      25                 :            : #include "config.h"
      26                 :            : 
      27                 :            : #include <glib.h>
      28                 :            : 
      29                 :            : #include <girepository/girepository.h>
      30                 :            : #include "gibaseinfo-private.h"
      31                 :            : #include "girepository-private.h"
      32                 :            : #include "gitypelib-internal.h"
      33                 :            : #include "config.h"
      34                 :            : #include "gifieldinfo.h"
      35                 :            : 
      36                 :            : /**
      37                 :            :  * GIFieldInfo:
      38                 :            :  *
      39                 :            :  * A `GIFieldInfo` struct represents a field of a struct, union, or object.
      40                 :            :  *
      41                 :            :  * The `GIFieldInfo` is fetched by calling
      42                 :            :  * [method@GIRepository.StructInfo.get_field],
      43                 :            :  * [method@GIRepository.UnionInfo.get_field] or
      44                 :            :  * [method@GIRepository.ObjectInfo.get_field].
      45                 :            :  *
      46                 :            :  * A field has a size, type and a struct offset associated and a set of flags,
      47                 :            :  * which are currently `GI_FIELD_IS_READABLE` or `GI_FIELD_IS_WRITABLE`.
      48                 :            :  *
      49                 :            :  * See also: [type@GIRepository.StructInfo], [type@GIRepository.UnionInfo],
      50                 :            :  * [type@GIRepository.ObjectInfo]
      51                 :            :  *
      52                 :            :  * Since: 2.80
      53                 :            :  */
      54                 :            : 
      55                 :            : /**
      56                 :            :  * gi_field_info_get_flags:
      57                 :            :  * @info: a #GIFieldInfo
      58                 :            :  *
      59                 :            :  * Obtain the flags for this `GIFieldInfo`. See
      60                 :            :  * [flags@GIRepository.FieldInfoFlags] for possible flag values.
      61                 :            :  *
      62                 :            :  * Returns: the flags
      63                 :            :  * Since: 2.80
      64                 :            :  */
      65                 :            : GIFieldInfoFlags
      66                 :          0 : gi_field_info_get_flags (GIFieldInfo *info)
      67                 :            : {
      68                 :            :   GIFieldInfoFlags flags;
      69                 :          0 :   GIRealInfo *rinfo = (GIRealInfo *)info;
      70                 :            :   FieldBlob *blob;
      71                 :            : 
      72                 :          0 :   g_return_val_if_fail (info != NULL, 0);
      73                 :          0 :   g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0);
      74                 :            : 
      75                 :          0 :   blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
      76                 :            : 
      77                 :          0 :   flags = 0;
      78                 :            : 
      79         [ #  # ]:          0 :   if (blob->readable)
      80                 :          0 :     flags = flags | GI_FIELD_IS_READABLE;
      81                 :            : 
      82         [ #  # ]:          0 :   if (blob->writable)
      83                 :          0 :     flags = flags | GI_FIELD_IS_WRITABLE;
      84                 :            : 
      85                 :          0 :   return flags;
      86                 :            : }
      87                 :            : 
      88                 :            : /**
      89                 :            :  * gi_field_info_get_size:
      90                 :            :  * @info: a #GIFieldInfo
      91                 :            :  *
      92                 :            :  * Obtain the size of the field member, in bits. This is how
      93                 :            :  * much space you need to allocate to store the field.
      94                 :            :  *
      95                 :            :  * Returns: the field size, in bits
      96                 :            :  * Since: 2.80
      97                 :            :  */
      98                 :            : size_t
      99                 :          0 : gi_field_info_get_size (GIFieldInfo *info)
     100                 :            : {
     101                 :          0 :   GIRealInfo *rinfo = (GIRealInfo *)info;
     102                 :            :   FieldBlob *blob;
     103                 :            : 
     104                 :          0 :   g_return_val_if_fail (info != NULL, 0);
     105                 :          0 :   g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0);
     106                 :            : 
     107                 :          0 :   blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
     108                 :            : 
     109                 :          0 :   return blob->bits;
     110                 :            : }
     111                 :            : 
     112                 :            : /**
     113                 :            :  * gi_field_info_get_offset:
     114                 :            :  * @info: a #GIFieldInfo
     115                 :            :  *
     116                 :            :  * Obtain the offset of the field member, in bytes. This is relative
     117                 :            :  * to the beginning of the struct or union.
     118                 :            :  *
     119                 :            :  * Returns: the field offset, in bytes
     120                 :            :  * Since: 2.80
     121                 :            :  */
     122                 :            : size_t
     123                 :          0 : gi_field_info_get_offset (GIFieldInfo *info)
     124                 :            : {
     125                 :          0 :   GIRealInfo *rinfo = (GIRealInfo *)info;
     126                 :            :   FieldBlob *blob;
     127                 :            : 
     128                 :          0 :   g_return_val_if_fail (info != NULL, 0);
     129                 :          0 :   g_return_val_if_fail (GI_IS_FIELD_INFO (info), 0);
     130                 :            : 
     131                 :          0 :   blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
     132                 :            : 
     133                 :          0 :   return blob->struct_offset;
     134                 :            : }
     135                 :            : 
     136                 :            : /**
     137                 :            :  * gi_field_info_get_type_info:
     138                 :            :  * @info: a #GIFieldInfo
     139                 :            :  *
     140                 :            :  * Obtain the type of a field as a [type@GIRepository.TypeInfo].
     141                 :            :  *
     142                 :            :  * Returns: (transfer full): the [type@GIRepository.TypeInfo]. Free the struct
     143                 :            :  *   by calling [method@GIRepository.BaseInfo.unref] when done.
     144                 :            :  * Since: 2.80
     145                 :            :  */
     146                 :            : GITypeInfo *
     147                 :          2 : gi_field_info_get_type_info (GIFieldInfo *info)
     148                 :            : {
     149                 :          2 :   GIRealInfo *rinfo = (GIRealInfo *)info;
     150                 :          2 :   Header *header = (Header *)rinfo->typelib->data;
     151                 :            :   FieldBlob *blob;
     152                 :            :   GIRealInfo *type_info;
     153                 :            : 
     154                 :          2 :   g_return_val_if_fail (info != NULL, NULL);
     155                 :          2 :   g_return_val_if_fail (GI_IS_FIELD_INFO (info), NULL);
     156                 :            : 
     157                 :          2 :   blob = (FieldBlob *)&rinfo->typelib->data[rinfo->offset];
     158                 :            : 
     159         [ +  + ]:          2 :   if (blob->has_embedded_type)
     160                 :            :     {
     161                 :          1 :       type_info = (GIRealInfo *) gi_base_info_new (GI_INFO_TYPE_TYPE,
     162                 :            :                                                    (GIBaseInfo*)info, rinfo->typelib,
     163                 :          1 :                                                    rinfo->offset + header->field_blob_size);
     164                 :          1 :       type_info->type_is_embedded = TRUE;
     165                 :            :     }
     166                 :            :   else
     167                 :          1 :     return gi_type_info_new ((GIBaseInfo*)info, rinfo->typelib, rinfo->offset + G_STRUCT_OFFSET (FieldBlob, type));
     168                 :            : 
     169                 :          1 :   return (GITypeInfo *) type_info;
     170                 :            : }
     171                 :            : 
     172                 :            : /**
     173                 :            :  * gi_field_info_get_field: (skip)
     174                 :            :  * @field_info: a #GIFieldInfo
     175                 :            :  * @mem: pointer to a block of memory representing a C structure or union
     176                 :            :  * @value: a [type@GIRepository.Argument] into which to store the value retrieved
     177                 :            :  *
     178                 :            :  * Reads a field identified by a `GIFieldInfo` from a C structure or
     179                 :            :  * union.
     180                 :            :  *
     181                 :            :  * This only handles fields of simple C types. It will fail for a field of a
     182                 :            :  * composite type like a nested structure or union even if that is actually
     183                 :            :  * readable.
     184                 :            :  *
     185                 :            :  * Returns: `TRUE` if reading the field succeeded, `FALSE` otherwise
     186                 :            :  * Since: 2.80
     187                 :            :  */
     188                 :            : gboolean
     189                 :          0 : gi_field_info_get_field (GIFieldInfo *field_info,
     190                 :            :                          void        *mem,
     191                 :            :                          GIArgument  *value)
     192                 :            : {
     193                 :            :   size_t offset;
     194                 :            :   GITypeInfo *type_info;
     195                 :          0 :   gboolean result = FALSE;
     196                 :            : 
     197                 :          0 :   g_return_val_if_fail (field_info != NULL, FALSE);
     198                 :          0 :   g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE);
     199                 :            : 
     200         [ #  # ]:          0 :   if ((gi_field_info_get_flags (field_info) & GI_FIELD_IS_READABLE) == 0)
     201                 :          0 :     return FALSE;
     202                 :            : 
     203                 :          0 :   offset = gi_field_info_get_offset (field_info);
     204                 :          0 :   type_info = gi_field_info_get_type_info (field_info);
     205                 :            : 
     206         [ #  # ]:          0 :   if (gi_type_info_is_pointer (type_info))
     207                 :            :     {
     208                 :          0 :       value->v_pointer = G_STRUCT_MEMBER (void *, mem, offset);
     209                 :          0 :       result = TRUE;
     210                 :            :     }
     211                 :            :   else
     212                 :            :     {
     213   [ #  #  #  #  :          0 :       switch (gi_type_info_get_tag (type_info))
          #  #  #  #  #  
             #  #  #  #  
                      # ]
     214                 :            :         {
     215                 :          0 :         case GI_TYPE_TAG_VOID:
     216                 :          0 :           g_warning("Field %s: should not be have void type",
     217                 :            :                     gi_base_info_get_name ((GIBaseInfo *)field_info));
     218                 :          0 :           break;
     219                 :          0 :         case GI_TYPE_TAG_BOOLEAN:
     220                 :          0 :           value->v_boolean = G_STRUCT_MEMBER (gboolean, mem, offset) != FALSE;
     221                 :          0 :           result = TRUE;
     222                 :          0 :           break;
     223                 :          0 :         case GI_TYPE_TAG_INT8:
     224                 :            :         case GI_TYPE_TAG_UINT8:
     225                 :          0 :           value->v_uint8 = G_STRUCT_MEMBER (uint8_t, mem, offset);
     226                 :          0 :           result = TRUE;
     227                 :          0 :           break;
     228                 :          0 :         case GI_TYPE_TAG_INT16:
     229                 :            :         case GI_TYPE_TAG_UINT16:
     230                 :          0 :           value->v_uint16 = G_STRUCT_MEMBER (uint16_t, mem, offset);
     231                 :          0 :           result = TRUE;
     232                 :          0 :           break;
     233                 :          0 :         case GI_TYPE_TAG_INT32:
     234                 :            :         case GI_TYPE_TAG_UINT32:
     235                 :            :         case GI_TYPE_TAG_UNICHAR:
     236                 :          0 :           value->v_uint32 = G_STRUCT_MEMBER (uint32_t, mem, offset);
     237                 :          0 :           result = TRUE;
     238                 :          0 :           break;
     239                 :          0 :         case GI_TYPE_TAG_INT64:
     240                 :            :         case GI_TYPE_TAG_UINT64:
     241                 :          0 :           value->v_uint64 = G_STRUCT_MEMBER (uint64_t, mem, offset);
     242                 :          0 :           result = TRUE;
     243                 :          0 :           break;
     244                 :          0 :         case GI_TYPE_TAG_GTYPE:
     245                 :          0 :           value->v_size = G_STRUCT_MEMBER (size_t, mem, offset);
     246                 :          0 :           result = TRUE;
     247                 :          0 :           break;
     248                 :          0 :         case GI_TYPE_TAG_FLOAT:
     249                 :          0 :           value->v_float = G_STRUCT_MEMBER (float, mem, offset);
     250                 :          0 :           result = TRUE;
     251                 :          0 :           break;
     252                 :          0 :         case GI_TYPE_TAG_DOUBLE:
     253                 :          0 :           value->v_double = G_STRUCT_MEMBER (double, mem, offset);
     254                 :          0 :           result = TRUE;
     255                 :          0 :           break;
     256                 :          0 :         case GI_TYPE_TAG_ARRAY:
     257                 :            :           /* We don't check the array type and that it is fixed-size,
     258                 :            :              we trust gi-compile-repository to do the right thing */
     259                 :          0 :           value->v_pointer = G_STRUCT_MEMBER_P (mem, offset);
     260                 :          0 :           result = TRUE;
     261                 :          0 :           break;
     262                 :          0 :         case GI_TYPE_TAG_UTF8:
     263                 :            :         case GI_TYPE_TAG_FILENAME:
     264                 :            :         case GI_TYPE_TAG_GLIST:
     265                 :            :         case GI_TYPE_TAG_GSLIST:
     266                 :            :         case GI_TYPE_TAG_GHASH:
     267                 :          0 :           g_warning("Field %s: type %s should have is_pointer set",
     268                 :            :                     gi_base_info_get_name ((GIBaseInfo *)field_info),
     269                 :            :                     gi_type_tag_to_string (gi_type_info_get_tag (type_info)));
     270                 :          0 :           break;
     271                 :          0 :         case GI_TYPE_TAG_ERROR:
     272                 :            :           /* Needs to be handled by the language binding directly */
     273                 :          0 :           break;
     274                 :          0 :         case GI_TYPE_TAG_INTERFACE:
     275                 :            :           {
     276                 :          0 :             GIBaseInfo *interface = gi_type_info_get_interface (type_info);
     277                 :          0 :             switch (gi_base_info_get_info_type (interface))
     278                 :            :               {
     279                 :          0 :               case GI_INFO_TYPE_STRUCT:
     280                 :            :               case GI_INFO_TYPE_UNION:
     281                 :            :                 /* Needs to be handled by the language binding directly */
     282                 :          0 :                 break;
     283                 :          0 :               case GI_INFO_TYPE_OBJECT:
     284                 :          0 :                 break;
     285                 :          0 :               case GI_INFO_TYPE_ENUM:
     286                 :            :               case GI_INFO_TYPE_FLAGS:
     287                 :            :                 {
     288                 :            :                   /* FIXME: there's a mismatch here between the value->v_int we use
     289                 :            :                    * here and the int64_t result returned from gi_value_info_get_value().
     290                 :            :                    * But to switch this to int64_t, we'd have to make gi_function_info_invoke()
     291                 :            :                    * translate value->v_int64 to the proper ABI for an enum function
     292                 :            :                    * call parameter, which will usually be int, and then fix up language
     293                 :            :                    * bindings.
     294                 :            :                    */
     295                 :          0 :                   GITypeTag storage_type = gi_enum_info_get_storage_type ((GIEnumInfo *)interface);
     296                 :            :                   switch (storage_type)
     297                 :            :                     {
     298                 :          0 :                     case GI_TYPE_TAG_INT8:
     299                 :            :                     case GI_TYPE_TAG_UINT8:
     300                 :          0 :                       value->v_int = (int)G_STRUCT_MEMBER (uint8_t, mem, offset);
     301                 :          0 :                       result = TRUE;
     302                 :          0 :                       break;
     303                 :          0 :                     case GI_TYPE_TAG_INT16:
     304                 :            :                     case GI_TYPE_TAG_UINT16:
     305                 :          0 :                       value->v_int = (int)G_STRUCT_MEMBER (uint16_t, mem, offset);
     306                 :          0 :                       result = TRUE;
     307                 :          0 :                       break;
     308                 :          0 :                     case GI_TYPE_TAG_INT32:
     309                 :            :                     case GI_TYPE_TAG_UINT32:
     310                 :          0 :                       value->v_int = (int)G_STRUCT_MEMBER (uint32_t, mem, offset);
     311                 :          0 :                       result = TRUE;
     312                 :          0 :                       break;
     313                 :          0 :                     case GI_TYPE_TAG_INT64:
     314                 :            :                     case GI_TYPE_TAG_UINT64:
     315                 :          0 :                       value->v_int = (int)G_STRUCT_MEMBER (uint64_t, mem, offset);
     316                 :          0 :                       result = TRUE;
     317                 :          0 :                       break;
     318                 :          0 :                     default:
     319                 :          0 :                       g_warning("Field %s: Unexpected enum storage type %s",
     320                 :            :                                 gi_base_info_get_name ((GIBaseInfo *)field_info),
     321                 :            :                                 gi_type_tag_to_string (storage_type));
     322                 :          0 :                       break;
     323                 :            :                     }
     324                 :          0 :                   break;
     325                 :            :                 }
     326                 :          0 :               case GI_INFO_TYPE_VFUNC:
     327                 :            :               case GI_INFO_TYPE_CALLBACK:
     328                 :          0 :                 g_warning("Field %s: Interface type %d should have is_pointer set",
     329                 :            :                           gi_base_info_get_name ((GIBaseInfo *)field_info),
     330                 :            :                           gi_base_info_get_info_type (interface));
     331                 :          0 :                 break;
     332                 :          0 :               case GI_INFO_TYPE_INVALID:
     333                 :            :               case GI_INFO_TYPE_INTERFACE:
     334                 :            :               case GI_INFO_TYPE_FUNCTION:
     335                 :            :               case GI_INFO_TYPE_CONSTANT:
     336                 :            :               case GI_INFO_TYPE_VALUE:
     337                 :            :               case GI_INFO_TYPE_SIGNAL:
     338                 :            :               case GI_INFO_TYPE_PROPERTY:
     339                 :            :               case GI_INFO_TYPE_FIELD:
     340                 :            :               case GI_INFO_TYPE_ARG:
     341                 :            :               case GI_INFO_TYPE_TYPE:
     342                 :            :               case GI_INFO_TYPE_UNRESOLVED:
     343                 :          0 :                 g_warning("Field %s: Interface type %d not expected",
     344                 :            :                           gi_base_info_get_name ((GIBaseInfo *)field_info),
     345                 :            :                           gi_base_info_get_info_type (interface));
     346                 :          0 :                 break;
     347                 :          0 :               default:
     348                 :          0 :                 break;
     349                 :            :               }
     350                 :            : 
     351                 :          0 :             gi_base_info_unref ((GIBaseInfo *)interface);
     352                 :          0 :             break;
     353                 :            :           }
     354                 :            :           break;
     355                 :          0 :         default:
     356                 :          0 :           break;
     357                 :            :         }
     358                 :            :     }
     359                 :            : 
     360                 :          0 :   gi_base_info_unref ((GIBaseInfo *)type_info);
     361                 :            : 
     362                 :          0 :   return result;
     363                 :            : }
     364                 :            : 
     365                 :            : /**
     366                 :            :  * gi_field_info_set_field: (skip)
     367                 :            :  * @field_info: a #GIFieldInfo
     368                 :            :  * @mem: pointer to a block of memory representing a C structure or union
     369                 :            :  * @value: a [type@GIRepository.Argument] holding the value to store
     370                 :            :  *
     371                 :            :  * Writes a field identified by a `GIFieldInfo` to a C structure or
     372                 :            :  * union.
     373                 :            :  *
     374                 :            :  * This only handles fields of simple C types. It will fail for a field of a
     375                 :            :  * composite type like a nested structure or union even if that is actually
     376                 :            :  * writable. Note also that that it will refuse to write fields where memory
     377                 :            :  * management would by required. A field with a type such as `char *` must be
     378                 :            :  * set with a setter function.
     379                 :            :  *
     380                 :            :  * Returns: `TRUE` if writing the field succeeded, `FALSE` otherwise
     381                 :            :  * Since: 2.80
     382                 :            :  */
     383                 :            : gboolean
     384                 :          0 : gi_field_info_set_field (GIFieldInfo      *field_info,
     385                 :            :                          void             *mem,
     386                 :            :                          const GIArgument *value)
     387                 :            : {
     388                 :            :   size_t offset;
     389                 :            :   GITypeInfo *type_info;
     390                 :          0 :   gboolean result = FALSE;
     391                 :            : 
     392                 :          0 :   g_return_val_if_fail (field_info != NULL, FALSE);
     393                 :          0 :   g_return_val_if_fail (GI_IS_FIELD_INFO (field_info), FALSE);
     394                 :            : 
     395         [ #  # ]:          0 :   if ((gi_field_info_get_flags (field_info) & GI_FIELD_IS_WRITABLE) == 0)
     396                 :          0 :     return FALSE;
     397                 :            : 
     398                 :          0 :   offset = gi_field_info_get_offset (field_info);
     399                 :          0 :   type_info = gi_field_info_get_type_info (field_info);
     400                 :            : 
     401         [ #  # ]:          0 :   if (!gi_type_info_is_pointer (type_info))
     402                 :            :     {
     403   [ #  #  #  #  :          0 :       switch (gi_type_info_get_tag (type_info))
          #  #  #  #  #  
             #  #  #  # ]
     404                 :            :         {
     405                 :          0 :         case GI_TYPE_TAG_VOID:
     406                 :          0 :           g_warning("Field %s: should not be have void type",
     407                 :            :                     gi_base_info_get_name ((GIBaseInfo *)field_info));
     408                 :          0 :           break;
     409                 :          0 :         case GI_TYPE_TAG_BOOLEAN:
     410                 :          0 :           G_STRUCT_MEMBER (gboolean, mem, offset) = value->v_boolean != FALSE;
     411                 :          0 :           result = TRUE;
     412                 :          0 :           break;
     413                 :          0 :         case GI_TYPE_TAG_INT8:
     414                 :            :         case GI_TYPE_TAG_UINT8:
     415                 :          0 :           G_STRUCT_MEMBER (uint8_t, mem, offset) = value->v_uint8;
     416                 :          0 :           result = TRUE;
     417                 :          0 :           break;
     418                 :          0 :         case GI_TYPE_TAG_INT16:
     419                 :            :         case GI_TYPE_TAG_UINT16:
     420                 :          0 :           G_STRUCT_MEMBER (uint16_t, mem, offset) = value->v_uint16;
     421                 :          0 :           result = TRUE;
     422                 :          0 :           break;
     423                 :          0 :         case GI_TYPE_TAG_INT32:
     424                 :            :         case GI_TYPE_TAG_UINT32:
     425                 :            :         case GI_TYPE_TAG_UNICHAR:
     426                 :          0 :           G_STRUCT_MEMBER (uint32_t, mem, offset) = value->v_uint32;
     427                 :          0 :           result = TRUE;
     428                 :          0 :           break;
     429                 :          0 :         case GI_TYPE_TAG_INT64:
     430                 :            :         case GI_TYPE_TAG_UINT64:
     431                 :          0 :           G_STRUCT_MEMBER (uint64_t, mem, offset) = value->v_uint64;
     432                 :          0 :           result = TRUE;
     433                 :          0 :           break;
     434                 :          0 :         case GI_TYPE_TAG_GTYPE:
     435                 :          0 :           G_STRUCT_MEMBER (size_t, mem, offset) = value->v_size;
     436                 :          0 :           result = TRUE;
     437                 :          0 :           break;
     438                 :          0 :         case GI_TYPE_TAG_FLOAT:
     439                 :          0 :           G_STRUCT_MEMBER (float, mem, offset) = value->v_float;
     440                 :          0 :           result = TRUE;
     441                 :          0 :           break;
     442                 :          0 :         case GI_TYPE_TAG_DOUBLE:
     443                 :          0 :           G_STRUCT_MEMBER (double, mem, offset)= value->v_double;
     444                 :          0 :           result = TRUE;
     445                 :          0 :           break;
     446                 :          0 :         case GI_TYPE_TAG_UTF8:
     447                 :            :         case GI_TYPE_TAG_FILENAME:
     448                 :            :         case GI_TYPE_TAG_ARRAY:
     449                 :            :         case GI_TYPE_TAG_GLIST:
     450                 :            :         case GI_TYPE_TAG_GSLIST:
     451                 :            :         case GI_TYPE_TAG_GHASH:
     452                 :          0 :           g_warning("Field %s: type %s should have is_pointer set",
     453                 :            :                     gi_base_info_get_name ((GIBaseInfo *)field_info),
     454                 :            :                     gi_type_tag_to_string (gi_type_info_get_tag (type_info)));
     455                 :          0 :           break;
     456                 :          0 :         case GI_TYPE_TAG_ERROR:
     457                 :            :           /* Needs to be handled by the language binding directly */
     458                 :          0 :           break;
     459                 :          0 :         case GI_TYPE_TAG_INTERFACE:
     460                 :            :           {
     461                 :          0 :             GIBaseInfo *interface = gi_type_info_get_interface (type_info);
     462                 :          0 :             switch (gi_base_info_get_info_type (interface))
     463                 :            :               {
     464                 :          0 :               case GI_INFO_TYPE_STRUCT:
     465                 :            :               case GI_INFO_TYPE_UNION:
     466                 :            :                 /* Needs to be handled by the language binding directly */
     467                 :          0 :                 break;
     468                 :          0 :               case GI_INFO_TYPE_OBJECT:
     469                 :          0 :                 break;
     470                 :          0 :               case GI_INFO_TYPE_ENUM:
     471                 :            :               case GI_INFO_TYPE_FLAGS:
     472                 :            :                 {
     473                 :            :                   /* See FIXME above
     474                 :            :                    */
     475                 :          0 :                   GITypeTag storage_type = gi_enum_info_get_storage_type ((GIEnumInfo *)interface);
     476                 :            :                   switch (storage_type)
     477                 :            :                     {
     478                 :          0 :                     case GI_TYPE_TAG_INT8:
     479                 :            :                     case GI_TYPE_TAG_UINT8:
     480                 :          0 :                       G_STRUCT_MEMBER (uint8_t, mem, offset) = (uint8_t)value->v_int;
     481                 :          0 :                       result = TRUE;
     482                 :          0 :                       break;
     483                 :          0 :                     case GI_TYPE_TAG_INT16:
     484                 :            :                     case GI_TYPE_TAG_UINT16:
     485                 :          0 :                       G_STRUCT_MEMBER (uint16_t, mem, offset) = (uint16_t)value->v_int;
     486                 :          0 :                       result = TRUE;
     487                 :          0 :                       break;
     488                 :          0 :                     case GI_TYPE_TAG_INT32:
     489                 :            :                     case GI_TYPE_TAG_UINT32:
     490                 :          0 :                       G_STRUCT_MEMBER (uint32_t, mem, offset) = (uint32_t)value->v_int;
     491                 :          0 :                       result = TRUE;
     492                 :          0 :                       break;
     493                 :          0 :                     case GI_TYPE_TAG_INT64:
     494                 :            :                     case GI_TYPE_TAG_UINT64:
     495                 :          0 :                       G_STRUCT_MEMBER (uint64_t, mem, offset) = (uint64_t)value->v_int;
     496                 :          0 :                       result = TRUE;
     497                 :          0 :                       break;
     498                 :          0 :                     default:
     499                 :          0 :                       g_warning("Field %s: Unexpected enum storage type %s",
     500                 :            :                                 gi_base_info_get_name ((GIBaseInfo *)field_info),
     501                 :            :                                 gi_type_tag_to_string (storage_type));
     502                 :          0 :                       break;
     503                 :            :                     }
     504                 :          0 :                   break;
     505                 :            :                 }
     506                 :            :                 break;
     507                 :          0 :               case GI_INFO_TYPE_VFUNC:
     508                 :            :               case GI_INFO_TYPE_CALLBACK:
     509                 :          0 :                 g_warning("Field%s: Interface type %d should have is_pointer set",
     510                 :            :                           gi_base_info_get_name ((GIBaseInfo *)field_info),
     511                 :            :                           gi_base_info_get_info_type (interface));
     512                 :          0 :                 break;
     513                 :          0 :               case GI_INFO_TYPE_INVALID:
     514                 :            :               case GI_INFO_TYPE_INTERFACE:
     515                 :            :               case GI_INFO_TYPE_FUNCTION:
     516                 :            :               case GI_INFO_TYPE_CONSTANT:
     517                 :            :               case GI_INFO_TYPE_VALUE:
     518                 :            :               case GI_INFO_TYPE_SIGNAL:
     519                 :            :               case GI_INFO_TYPE_PROPERTY:
     520                 :            :               case GI_INFO_TYPE_FIELD:
     521                 :            :               case GI_INFO_TYPE_ARG:
     522                 :            :               case GI_INFO_TYPE_TYPE:
     523                 :            :               case GI_INFO_TYPE_UNRESOLVED:
     524                 :          0 :                 g_warning("Field %s: Interface type %d not expected",
     525                 :            :                           gi_base_info_get_name ((GIBaseInfo *)field_info),
     526                 :            :                           gi_base_info_get_info_type (interface));
     527                 :          0 :                 break;
     528                 :          0 :               default:
     529                 :          0 :                 break;
     530                 :            :               }
     531                 :            : 
     532                 :          0 :             gi_base_info_unref ((GIBaseInfo *)interface);
     533                 :          0 :             break;
     534                 :            :           }
     535                 :            :           break;
     536                 :          0 :         default:
     537                 :          0 :           break;
     538                 :            :         }
     539                 :            :     } else {
     540         [ #  # ]:          0 :       switch (gi_type_info_get_tag (type_info))
     541                 :            :         {
     542                 :          0 :         case GI_TYPE_TAG_INTERFACE:
     543                 :            :           {
     544                 :          0 :             GIBaseInfo *interface = gi_type_info_get_interface (type_info);
     545                 :          0 :             switch (gi_base_info_get_info_type (interface))
     546                 :            :               {
     547                 :          0 :                 case GI_INFO_TYPE_OBJECT:
     548                 :            :                 case GI_INFO_TYPE_INTERFACE:
     549                 :          0 :                   G_STRUCT_MEMBER (void *, mem, offset) = (void *)value->v_pointer;
     550                 :          0 :                   result = TRUE;
     551                 :          0 :                   break;
     552                 :          0 :                 default:
     553                 :          0 :                   break;
     554                 :            :               }
     555                 :          0 :               gi_base_info_unref ((GIBaseInfo *)interface);
     556                 :            :           }
     557                 :          0 :           break;
     558                 :          0 :         default:
     559                 :          0 :           break;
     560                 :            :         }
     561                 :            :     }
     562                 :            : 
     563                 :          0 :   gi_base_info_unref ((GIBaseInfo *)type_info);
     564                 :            : 
     565                 :          0 :   return result;
     566                 :            : }
     567                 :            : 
     568                 :            : void
     569                 :          4 : gi_field_info_class_init (gpointer g_class,
     570                 :            :                           gpointer class_data)
     571                 :            : {
     572                 :          4 :   GIBaseInfoClass *info_class = g_class;
     573                 :            : 
     574                 :          4 :   info_class->info_type = GI_INFO_TYPE_FIELD;
     575                 :          4 : }

Generated by: LCOV version 1.14