diff options
Diffstat (limited to 'girepository/girnode.c')
-rw-r--r-- | girepository/girnode.c | 92 |
1 files changed, 51 insertions, 41 deletions
diff --git a/girepository/girnode.c b/girepository/girnode.c index d0a18a31..455e9d6c 100644 --- a/girepository/girnode.c +++ b/girepository/girnode.c @@ -1326,7 +1326,8 @@ _g_ir_node_build_members (GList **members, GIrNode *parent, GIrTypelibBuild *build, guint32 *offset, - guint32 *offset2) + guint32 *offset2, + guint16 *count2) { GList *l = *members; @@ -1338,7 +1339,7 @@ _g_ir_node_build_members (GList **members, if (member->type == type) { (*count)++; - _g_ir_node_build_typelib (member, parent, build, offset, offset2); + _g_ir_node_build_typelib (member, parent, build, offset, offset2, count2); *members = g_list_delete_link (*members, l); } l = next; @@ -1379,7 +1380,8 @@ _g_ir_node_build_typelib (GIrNode *node, GIrNode *parent, GIrTypelibBuild *build, guint32 *offset, - guint32 *offset2) + guint32 *offset2, + guint16 *count2) { gboolean appended_stack; GHashTable *strings = build->strings; @@ -1480,7 +1482,7 @@ _g_ir_node_build_typelib (GIrNode *node, *offset2 += sizeof (ArrayTypeBlob); _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1, - node, build, &pos, offset2); + node, build, &pos, offset2, NULL); } break; @@ -1514,7 +1516,7 @@ _g_ir_node_build_typelib (GIrNode *node, *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob); _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1, - node, build, &pos, offset2); + node, build, &pos, offset2, NULL); } break; @@ -1533,9 +1535,9 @@ _g_ir_node_build_typelib (GIrNode *node, *offset2 += sizeof (ParamTypeBlob) + sizeof (SimpleTypeBlob)*2; _g_ir_node_build_typelib ((GIrNode *)type->parameter_type1, - node, build, &pos, offset2); + node, build, &pos, offset2, NULL); _g_ir_node_build_typelib ((GIrNode *)type->parameter_type2, - node, build, &pos, offset2); + node, build, &pos, offset2, NULL); } break; @@ -1585,7 +1587,14 @@ _g_ir_node_build_typelib (GIrNode *node, blob->type.offset = GI_INFO_TYPE_CALLBACK; *offset += sizeof (FieldBlob); _g_ir_node_build_typelib ((GIrNode *)field->callback, - node, build, offset, offset2); + node, build, offset, offset2, NULL); + /* Fields with callbacks are bigger than normal, update count2 + * as an extra hint which represents the number of fields which are + * callbacks. This allows us to gain constant time performance in the + * repository for skipping over the fields section. + */ + if (count2) + (*count2)++; } else { @@ -1593,7 +1602,7 @@ _g_ir_node_build_typelib (GIrNode *node, /* We handle the size member specially below, so subtract it */ *offset += sizeof (FieldBlob) - sizeof (SimpleTypeBlob); _g_ir_node_build_typelib ((GIrNode *)field->type, - node, build, offset, offset2); + node, build, offset, offset2, NULL); } } break; @@ -1616,7 +1625,7 @@ _g_ir_node_build_typelib (GIrNode *node, blob->reserved = 0; _g_ir_node_build_typelib ((GIrNode *)prop->type, - node, build, offset, offset2); + node, build, offset, offset2, NULL); } break; @@ -1658,7 +1667,7 @@ _g_ir_node_build_typelib (GIrNode *node, g_debug ("building function '%s'", function->symbol); _g_ir_node_build_typelib ((GIrNode *)function->result->type, - node, build, &signature, offset2); + node, build, &signature, offset2, NULL); blob2->may_return_null = function->result->nullable; blob2->caller_owns_return_value = function->result->transfer; @@ -1675,7 +1684,7 @@ _g_ir_node_build_typelib (GIrNode *node, { GIrNode *param = (GIrNode *)l->data; - _g_ir_node_build_typelib (param, node, build, &signature, offset2); + _g_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); } } @@ -1702,7 +1711,7 @@ _g_ir_node_build_typelib (GIrNode *node, blob->signature = signature; _g_ir_node_build_typelib ((GIrNode *)function->result->type, - node, build, &signature, offset2); + node, build, &signature, offset2, NULL); blob2->may_return_null = function->result->nullable; blob2->caller_owns_return_value = function->result->transfer; @@ -1717,7 +1726,7 @@ _g_ir_node_build_typelib (GIrNode *node, { GIrNode *param = (GIrNode *)l->data; - _g_ir_node_build_typelib (param, node, build, &signature, offset2); + _g_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); } } break; @@ -1760,7 +1769,7 @@ _g_ir_node_build_typelib (GIrNode *node, ((GIrNode *) signal->result)->offset = signature; _g_ir_node_build_typelib ((GIrNode *)signal->result->type, - node, build, &signature, offset2); + node, build, &signature, offset2, NULL); blob2->may_return_null = signal->result->nullable; blob2->caller_owns_return_value = signal->result->transfer; @@ -1775,7 +1784,7 @@ _g_ir_node_build_typelib (GIrNode *node, { GIrNode *param = (GIrNode *)l->data; - _g_ir_node_build_typelib (param, node, build, &signature, offset2); + _g_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); } } break; @@ -1819,7 +1828,7 @@ _g_ir_node_build_typelib (GIrNode *node, blob->signature = signature; _g_ir_node_build_typelib ((GIrNode *)vfunc->result->type, - node, build, &signature, offset2); + node, build, &signature, offset2, NULL); blob2->may_return_null = vfunc->result->nullable; blob2->caller_owns_return_value = vfunc->result->transfer; @@ -1835,7 +1844,7 @@ _g_ir_node_build_typelib (GIrNode *node, { GIrNode *param = (GIrNode *)l->data; - _g_ir_node_build_typelib (param, node, build, &signature, offset2); + _g_ir_node_build_typelib (param, node, build, &signature, offset2, NULL); } } break; @@ -1865,7 +1874,7 @@ _g_ir_node_build_typelib (GIrNode *node, blob->closure = param->closure; blob->destroy = param->destroy; - _g_ir_node_build_typelib ((GIrNode *)param->type, node, build, offset, offset2); + _g_ir_node_build_typelib ((GIrNode *)param->type, node, build, offset, offset2, NULL); } break; @@ -1905,10 +1914,10 @@ _g_ir_node_build_typelib (GIrNode *node, members = g_list_copy (struct_->members); _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_check_unhandled_members (&members, node->type); @@ -1940,10 +1949,10 @@ _g_ir_node_build_typelib (GIrNode *node, members = g_list_copy (boxed->members); _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_check_unhandled_members (&members, node->type); @@ -1988,7 +1997,7 @@ _g_ir_node_build_typelib (GIrNode *node, *offset += 28; blob->discriminated = TRUE; _g_ir_node_build_typelib ((GIrNode *)union_->discriminator_type, - build, offset, offset2); + build, offset, offset2, NULL); } else { @@ -2000,10 +2009,10 @@ _g_ir_node_build_typelib (GIrNode *node, members = g_list_copy (union_->members); _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_functions, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_check_unhandled_members (&members, node->type); @@ -2015,7 +2024,7 @@ _g_ir_node_build_typelib (GIrNode *node, { GIrNode *member = (GIrNode *)l->data; - _g_ir_node_build_typelib (member, node, build, offset, offset2); + _g_ir_node_build_typelib (member, node, build, offset, offset2, NULL); } } } @@ -2063,7 +2072,7 @@ _g_ir_node_build_typelib (GIrNode *node, GIrNode *value = (GIrNode *)l->data; blob->n_values++; - _g_ir_node_build_typelib (value, node, build, offset, offset2); + _g_ir_node_build_typelib (value, node, build, offset, offset2, NULL); } for (l = enum_->methods; l; l = l->next) @@ -2071,7 +2080,7 @@ _g_ir_node_build_typelib (GIrNode *node, GIrNode *method = (GIrNode *)l->data; blob->n_methods++; - _g_ir_node_build_typelib (method, node, build, offset, offset2); + _g_ir_node_build_typelib (method, node, build, offset, offset2, NULL); } } break; @@ -2114,6 +2123,7 @@ _g_ir_node_build_typelib (GIrNode *node, blob->n_signals = 0; blob->n_vfuncs = 0; blob->n_constants = 0; + blob->n_field_callbacks = 0; *offset += sizeof(ObjectBlob); for (l = object->interfaces; l; l = l->next) @@ -2127,27 +2137,27 @@ _g_ir_node_build_typelib (GIrNode *node, *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_FIELD, &blob->n_fields, - node, build, offset, offset2); + node, build, offset, offset2, &blob->n_field_callbacks); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_check_unhandled_members (&members, node->type); @@ -2190,23 +2200,23 @@ _g_ir_node_build_typelib (GIrNode *node, *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_PROPERTY, &blob->n_properties, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_FUNCTION, &blob->n_methods, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_SIGNAL, &blob->n_signals, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_VFUNC, &blob->n_vfuncs, - node, build, offset, offset2); + node, build, offset, offset2, NULL); *offset = ALIGN_VALUE (*offset, 4); _g_ir_node_build_members (&members, G_IR_NODE_CONSTANT, &blob->n_constants, - node, build, offset, offset2); + node, build, offset, offset2, NULL); _g_ir_node_check_unhandled_members (&members, node->type); @@ -2298,7 +2308,7 @@ _g_ir_node_build_typelib (GIrNode *node, } *offset2 += ALIGN_VALUE (blob->size, 4); - _g_ir_node_build_typelib ((GIrNode *)constant->type, node, build, &pos, offset2); + _g_ir_node_build_typelib ((GIrNode *)constant->type, node, build, &pos, offset2, NULL); } break; default: |