+Aggregate *Aggregate::Copy(CYPool &pool, const char *rename) const {
+ if (rename == NULL)
+ rename = pool.strdup(name);
+ else if (rename[0] == '\0')
+ rename = NULL;
+ Aggregate *copy(new(pool) Aggregate(overlap, rename));
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+
+Function *Function::Copy(CYPool &pool, const char *rename) const {
+ Function *copy(new(pool) Function(variadic));
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+
+#ifdef CY_OBJECTIVEC
+Block *Block::Copy(CYPool &pool, const char *rename) const {
+ Block *copy(new(pool) Block());
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+#endif
+
+void Copy(CYPool &pool, ffi_type &lhs, ffi_type &rhs) {