2011-8-1 20:18:46
来源:互联网 发布:centos 6.5怎么样 编辑:程序博客网 时间:2024/04/30 03:28
2011-8-1 20:18:46
static gboolean
check_type_name_I (const gchar *type_name)
{
static const gchar extra_chars[] = "-_+";
const gchar *p = type_name;
gboolean name_valid;
if (!type_name[0] || !type_name[1] || !type_name[2])
{
g_warning ("type name `%s' is too short", type_name);
return FALSE;
}
/* check the first letter */
name_valid = (p[0] >= 'A' && p[0] <= 'Z') || (p[0] >= 'a' && p[0] <= 'z') || p[0] == '_';
for (p = type_name + 1; *p; p++)
name_valid &= ((p[0] >= 'A' && p[0] <= 'Z') ||
(p[0] >= 'a' && p[0] <= 'z') ||
(p[0] >= '0' && p[0] <= '9') ||
strchr (extra_chars, p[0]));
if (!name_valid)
{
g_warning ("type name `%s' contains invalid characters", type_name);
return FALSE;
}
if (g_type_from_name (type_name))
{
g_warning ("cannot register existing type `%s'", type_name);
return FALSE;
}
return TRUE;
}
定义了类型名的规则
不少于3个字母,第一个不能为数字
查找类型节点
static inline TypeNode*
lookup_type_node_I (register GType utype)
{
if (utype > G_TYPE_FUNDAMENTAL_MAX)
return (TypeNode*) (utype & ~TYPE_ID_MASK);
else
return static_fundamental_type_nodes[utype >> G_TYPE_FUNDAMENTAL_SHIFT];
}
如果类型在255以内,就可以放在数组中
类型节点找到了,就开始找类型基本信息
struct _TypeNode
{
GTypePlugin *plugin;
guint n_children : 12;
guint n_supers : 8;
guint _prot_n_ifaces_prerequisites : 9;
guint is_classed : 1;
guint is_instantiatable : 1;
guint mutatable_check_cache : 1; /* combines some common path checks */
GType *children;
TypeData * volatile data;
GQuark qname;
GData *global_gdata;
union {
IFaceEntry *iface_entries; /* for !iface types */
GType *prerequisistes;
} _prot;
GType supers[1]; /* flexible array */
};
也就是一个TypeNode 结构体
static inline GTypeFundamentalInfo*
type_node_fundamental_info_I (TypeNode *node)
{
GType ftype = NODE_FUNDAMENTAL_TYPE (node);
if (ftype != NODE_TYPE (node))
node = lookup_type_node_I (ftype);
return node ? G_STRUCT_MEMBER_P (node, -SIZEOF_FUNDAMENTAL_INFO) : NULL;
}
找祖先,如果祖先不是自己,就从祖先节点上找基本信息
如果是自己就在自己上找基本信息
static gboolean
check_derivation_I (GType parent_type,
const gchar *type_name)
{
TypeNode *pnode;
GTypeFundamentalInfo* finfo;
pnode = lookup_type_node_I (parent_type);
if (!pnode)
{
g_warning ("cannot derive type `%s' from invalid parent type `%s'",
type_name,
type_descriptive_name_I (parent_type));
return FALSE;
}
finfo = type_node_fundamental_info_I (pnode);
/* ensure flat derivability */
if (!(finfo->type_flags & G_TYPE_FLAG_DERIVABLE))
{
g_warning ("cannot derive `%s' from non-derivable parent type `%s'",
type_name,
NODE_NAME (pnode));
return FALSE;
}
/* ensure deep derivability */
if (parent_type != NODE_FUNDAMENTAL_TYPE (pnode) &&
!(finfo->type_flags & G_TYPE_FLAG_DEEP_DERIVABLE))
{
g_warning ("cannot derive `%s' from non-fundamental parent type `%s'",
type_name,
NODE_NAME (pnode));
return FALSE;
}
return TRUE;
}
查找类型基本信息,看其是否允许继承,如果是深度继承,看其是否允许深度继承
- 2011-8-1 20:18:46
- 2011-8-13 1:18:23
- 2012年8月1日16:46:18
- 2011-8-1 20:01:05
- 2011-8-1 20:42:02
- 2011-8-1 20:55:10
- 2011-9-18 13:46:09
- 2011-1-18
- 2011-8-8 20:06:20
- 2011/1/20
- 2011-8-8 18:48:31
- 2011-6-18 0:55:20
- 2011-9-18 14:31:20
- 2011-9-18 20:05:03
- 2011-9-18 20:28:57
- 2011 1-8
- 2011-8-8 13:07:20
- 2011-8-8 20:16:16
- hibernatesynchronizer3使用方法
- update用low_priority让update不锁定表
- object-c中类的私有方法
- "Hibernate"对数据库操作的实例代码
- Android 资源国际化问题(1): 来自开源的启示
- 2011-8-1 20:18:46
- 用批处理实现从SVN拉取并编译代码
- 【汇总】彩色图像分割 Menu[Updating...]
- Linux初始RAM磁盘介绍
- 网上资源之WEB前端
- linux el6下pptpd的配置
- 关于项目经理
- MySQL数据库性能优化的关键参数
- 关于信息的表示和存储