+ type->ref++;
+}
+
+void type_unref(struct type *type)
+{
+ if (!--type->ref)
+ type->type_free(type);
+}
+
+void declaration_ref(struct declaration *declaration)
+{
+ declaration->ref++;
+}
+
+void declaration_unref(struct declaration *declaration)
+{
+ if (!--declaration->ref)
+ declaration->type->declaration_free(declaration);
+}
+
+struct type_scope *
+ new_type_scope(struct type_scope *parent_scope)
+{
+ struct type_scope *scope = g_new(struct type_scope, 1);
+
+ scope->types = g_hash_table_new_full(g_direct_hash,
+ g_direct_equal, NULL,
+ (GDestroyNotify) type_unref);
+ scope->parent_scope = parent_scope;
+ return scope;
+}
+
+void free_type_scope(struct type_scope *scope)
+{
+ g_hash_table_destroy(scope->types);
+ g_free(scope);
+}
+
+struct declaration_scope *
+ new_declaration_scope(struct declaration_scope *parent_scope)
+{
+ struct declaration_scope *scope = g_new(struct declaration_scope, 1);
+
+ scope->declarations = g_hash_table_new_full(g_direct_hash,
+ g_direct_equal, NULL,
+ (GDestroyNotify) declaration_unref);
+ scope->parent_scope = parent_scope;
+ return scope;