glib/girepository/girnode-private.h
Philip Withnall 0909b2e3ac girnode: Improve int types in GIIrNodeUnion
`GIIrNodeUnion` is built dynamically at runtime (rather than being
mmapped from disk), so its types can accurately reflect their runtime
semantics, rather than an on-disk format.

As part of this, switch from `atoi()` to `g_ascii_string_to_unsigned()`
for parsing the relevant fields from a GIR XML file. This means we now
get error handling for invalid integers.

Signed-off-by: Philip Withnall <pwithnall@gnome.org>

Helps: #3155

Signed-off-by: Philip Withnall <pwithnall@gnome.org>
2024-01-26 09:29:30 +00:00

427 lines
10 KiB
C

/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
* GObject introspection: Parsed GIR
*
* Copyright (C) 2005 Matthias Clasen
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#pragma once
#include <glib.h>
#include "girmodule-private.h"
G_BEGIN_DECLS
typedef struct _GIIrNode GIIrNode;
typedef struct _GIIrNodeFunction GIIrNodeFunction;
typedef struct _GIIrNodeParam GIIrNodeParam;
typedef struct _GIIrNodeType GIIrNodeType;
typedef struct _GIIrNodeInterface GIIrNodeInterface;
typedef struct _GIIrNodeSignal GIIrNodeSignal;
typedef struct _GIIrNodeProperty GIIrNodeProperty;
typedef struct _GIIrNodeVFunc GIIrNodeVFunc;
typedef struct _GIIrNodeField GIIrNodeField;
typedef struct _GIIrNodeValue GIIrNodeValue;
typedef struct _GIIrNodeEnum GIIrNodeEnum;
typedef struct _GIIrNodeBoxed GIIrNodeBoxed;
typedef struct _GIIrNodeStruct GIIrNodeStruct;
typedef struct _GIIrNodeConstant GIIrNodeConstant;
typedef struct _GIIrNodeXRef GIIrNodeXRef;
typedef struct _GIIrNodeUnion GIIrNodeUnion;
typedef enum
{
GI_IR_NODE_INVALID = 0,
GI_IR_NODE_FUNCTION = 1,
GI_IR_NODE_CALLBACK = 2,
GI_IR_NODE_STRUCT = 3,
GI_IR_NODE_BOXED = 4,
GI_IR_NODE_ENUM = 5,
GI_IR_NODE_FLAGS = 6,
GI_IR_NODE_OBJECT = 7,
GI_IR_NODE_INTERFACE = 8,
GI_IR_NODE_CONSTANT = 9,
GI_IR_NODE_INVALID_0 = 10, /* DELETED - used to be ERROR_DOMAIN */
GI_IR_NODE_UNION = 11,
GI_IR_NODE_PARAM = 12,
GI_IR_NODE_TYPE = 13,
GI_IR_NODE_PROPERTY = 14,
GI_IR_NODE_SIGNAL = 15,
GI_IR_NODE_VALUE = 16,
GI_IR_NODE_VFUNC = 17,
GI_IR_NODE_FIELD = 18,
GI_IR_NODE_XREF = 19
} GIIrNodeTypeId;
/**
* GIIrOffsetsState:
* @GI_IR_OFFSETS_UNKNOWN: offsets have not been calculated yet
* @GI_IR_OFFSETS_COMPUTED: offsets have been successfully calculated
* @GI_IR_OFFSETS_FAILED: calculating the offsets failed
* @GI_IR_OFFSETS_IN_PROGRESS: offsets are currently being calculated (used to
* detect type recursion)
*
* State tracking for calculating size and alignment of
* [type@GIRepository.IrNode]s.
*
* Since: 2.80
*/
typedef enum
{
GI_IR_OFFSETS_UNKNOWN,
GI_IR_OFFSETS_COMPUTED,
GI_IR_OFFSETS_FAILED,
GI_IR_OFFSETS_IN_PROGRESS,
} GIIrOffsetsState;
struct _GIIrNode
{
GIIrNodeTypeId type;
char *name; /* (owned) */
GIIrModule *module; /* (unowned) */
uint32_t offset; /* Assigned as we build the typelib */
GHashTable *attributes; /* (element-type utf8 utf8) (owned) */
};
struct _GIIrNodeXRef
{
GIIrNode node;
char *namespace; /* (owned) */
};
struct _GIIrNodeFunction
{
GIIrNode node;
uint8_t deprecated : 1;
uint8_t is_varargs : 1; /* Not in typelib yet */
uint8_t is_method : 1;
uint8_t is_setter : 1;
uint8_t is_getter : 1;
uint8_t is_constructor : 1;
uint8_t wraps_vfunc : 1;
uint8_t throws : 1;
uint8_t instance_transfer_full : 1;
char *symbol; /* (owned) */
char *property; /* (owned) */
GIIrNodeParam *result; /* (owned) */
GList *parameters; /* (element-type GIIrNode) (owned) */
};
struct _GIIrNodeType
{
GIIrNode node;
uint8_t is_pointer : 1;
uint8_t is_basic : 1;
uint8_t is_array : 1;
uint8_t is_glist : 1;
uint8_t is_gslist : 1;
uint8_t is_ghashtable : 1;
uint8_t is_interface : 1;
uint8_t is_error : 1;
int tag;
char *unparsed; /* (owned) */
uint8_t zero_terminated : 1;
uint8_t has_length : 1;
unsigned int length;
uint8_t has_size : 1;
size_t size;
GIArrayType array_type;
GIIrNodeType *parameter_type1; /* (owned) */
GIIrNodeType *parameter_type2; /* (owned) */
char *giinterface; /* (owned) */
char **errors; /* (array zero-terminated=1) (owned) */
};
struct _GIIrNodeParam
{
GIIrNode node;
uint8_t in : 1;
uint8_t out : 1;
uint8_t caller_allocates : 1;
uint8_t optional : 1;
uint8_t retval : 1;
uint8_t nullable : 1;
uint8_t skip : 1;
uint8_t transfer : 1;
uint8_t shallow_transfer : 1;
GIScopeType scope : 3;
int8_t closure;
int8_t destroy;
GIIrNodeType *type; /* (owned) */
};
struct _GIIrNodeProperty
{
GIIrNode node;
uint8_t deprecated : 1;
char *name; /* (owned) */
uint8_t readable : 1;
uint8_t writable : 1;
uint8_t construct : 1;
uint8_t construct_only : 1;
uint8_t transfer : 1;
uint8_t shallow_transfer : 1;
char *setter; /* (owned) */
char *getter; /* (owned) */
GIIrNodeType *type; /* (owned) */
};
struct _GIIrNodeSignal
{
GIIrNode node;
uint8_t deprecated : 1;
uint8_t run_first : 1;
uint8_t run_last : 1;
uint8_t run_cleanup : 1;
uint8_t no_recurse : 1;
uint8_t detailed : 1;
uint8_t action : 1;
uint8_t no_hooks : 1;
uint8_t instance_transfer_full : 1;
uint8_t has_class_closure : 1;
uint8_t true_stops_emit : 1;
unsigned int class_closure;
GList *parameters; /* (element-type GIIrNode) (owned) */
GIIrNodeParam *result; /* (owned) */
};
struct _GIIrNodeVFunc
{
GIIrNode node;
uint8_t is_varargs : 1; /* Not in typelib yet */
uint8_t must_chain_up : 1;
uint8_t must_be_implemented : 1;
uint8_t must_not_be_implemented : 1;
uint8_t is_class_closure : 1;
uint8_t throws : 1;
uint8_t instance_transfer_full : 1;
char *invoker; /* (owned) */
GList *parameters; /* (element-type GIIrNode) (owned) */
GIIrNodeParam *result; /* (owned) */
size_t offset;
};
struct _GIIrNodeField
{
GIIrNode node;
uint8_t readable : 1;
uint8_t writable : 1;
unsigned int bits;
size_t offset;
GIIrOffsetsState offset_state;
GIIrNodeFunction *callback; /* (owned) */
GIIrNodeType *type; /* (owned) */
};
struct _GIIrNodeInterface
{
GIIrNode node;
uint8_t abstract : 1;
uint8_t deprecated : 1;
uint8_t fundamental : 1;
uint8_t final_ : 1;
char *gtype_name; /* (owned) */
char *gtype_init; /* (owned) */
char *ref_func; /* (owned) */
char *unref_func; /* (owned) */
char *set_value_func; /* (owned) */
char *get_value_func; /* (owned) */
char *parent; /* (owned) */
char *glib_type_struct; /* (owned) */
GList *interfaces; /* (element-type GIIrNode) (owned) */
GList *prerequisites; /* (element-type utf8) (owned) */
size_t alignment;
size_t size;
GIIrOffsetsState offsets_state;
GList *members; /* (element-type GIIrNode) (owned) */
};
struct _GIIrNodeValue
{
GIIrNode node;
uint8_t deprecated : 1;
int64_t value;
};
struct _GIIrNodeConstant
{
GIIrNode node;
uint8_t deprecated : 1;
GIIrNodeType *type; /* (owned) */
char *value; /* (owned) */
};
struct _GIIrNodeEnum
{
GIIrNode node;
uint8_t deprecated : 1;
GITypeTag storage_type;
char *gtype_name; /* (owned) */
char *gtype_init; /* (owned) */
char *error_domain; /* (owned) */
GList *values; /* (element-type GIIrNode) (owned) */
GList *methods; /* (element-type GIIrNode) (owned) */
};
struct _GIIrNodeBoxed
{
GIIrNode node;
uint8_t deprecated : 1;
char *gtype_name; /* (owned) */
char *gtype_init; /* (owned) */
size_t alignment;
size_t size;
GIIrOffsetsState offsets_state;
GList *members; /* (element-type GIIrNode) (owned) */
};
struct _GIIrNodeStruct
{
GIIrNode node;
uint8_t deprecated : 1;
uint8_t disguised : 1;
uint8_t opaque : 1;
uint8_t pointer : 1;
uint8_t is_gtype_struct : 1;
uint8_t foreign : 1;
char *gtype_name; /* (owned) */
char *gtype_init; /* (owned) */
char *copy_func; /* (owned) */
char *free_func; /* (owned) */
size_t alignment;
size_t size;
GIIrOffsetsState offsets_state;
GList *members; /* (element-type GIIrNode) (owned) */
};
struct _GIIrNodeUnion
{
GIIrNode node;
uint8_t deprecated : 1;
GList *members; /* (element-type GIIrNode) (owned) */
GList *discriminators; /* (element-type GIIrNode) (owned) */
char *gtype_name; /* (owned) */
char *gtype_init; /* (owned) */
char *copy_func; /* (owned) */
char *free_func; /* (owned) */
size_t alignment;
size_t size;
GIIrOffsetsState offsets_state;
size_t discriminator_offset;
GIIrNodeType *discriminator_type; /* (owned) */
};
GIIrNode *gi_ir_node_new (GIIrNodeTypeId type,
GIIrModule *module);
void gi_ir_node_free (GIIrNode *node);
uint32_t gi_ir_node_get_size (GIIrNode *node);
uint32_t gi_ir_node_get_full_size (GIIrNode *node);
void gi_ir_node_build_typelib (GIIrNode *node,
GIIrNode *parent,
GIIrTypelibBuild *build,
uint32_t *offset,
uint32_t *offset2,
uint16_t *count2);
int gi_ir_node_cmp (GIIrNode *node,
GIIrNode *other);
gboolean gi_ir_node_can_have_member (GIIrNode *node);
void gi_ir_node_add_member (GIIrNode *node,
GIIrNodeFunction *member);
uint32_t gi_ir_write_string (const char *str,
GHashTable *strings,
uint8_t *data,
uint32_t *offset);
const char * gi_ir_node_param_direction_string (GIIrNodeParam * node);
const char * gi_ir_node_type_to_string (GIIrNodeTypeId type);
GIIrNode *gi_ir_find_node (GIIrTypelibBuild *build,
GIIrModule *module,
const char *name);
/* In giroffsets.c */
void gi_ir_node_compute_offsets (GIIrTypelibBuild *build,
GIIrNode *node);
G_END_DECLS