summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam S Fulton <wsf@fultondesigns.co.uk>2022-09-23 18:24:06 +0100
committerWilliam S Fulton <wsf@fultondesigns.co.uk>2022-09-29 19:30:20 +0100
commitacbe8ed49ce7ea9cb6bc9310557b433d646174bb (patch)
tree95196ce1afd15ad780df7cc9ba8d1a40cea6363c
parent3bf1da4298a31bf5bd18f1ec1cd07e8725b2d54a (diff)
downloadswig-acbe8ed49ce7ea9cb6bc9310557b433d646174bb.tar.gz
Runtime tables deterministic ordering (1)
Many parts of the runtime tables are alphabetically sorted before for the generated code. This patch sorts the elements within the swig_cast_info lists. Order now is first the elements without a converter then the elements with a converter. For example: new: static swig_cast_info _swigc__p_Foo[] = { {&_swigt__p_Foo, 0, 0, 0}, {&_swigt__p_Bar, _p_BarTo_p_Foo, 0, 0}, {&_swigt__p_Spam, _p_SpamTo_p_Foo, 0, 0}, {0, 0, 0, 0}}; old: static swig_cast_info _swigc__p_Foo[] = { {&_swigt__p_Bar, _p_BarTo_p_Foo, 0, 0}, {&_swigt__p_Foo, 0, 0, 0}, {&_swigt__p_Spam, _p_SpamTo_p_Foo, 0, 0}, {0, 0, 0, 0}}; Previously the order was roughly in the order that the types were parsed, but not necessarily due to the use of internal hash tables which do not have an ordering guarantee.
-rw-r--r--Source/Swig/typesys.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/Source/Swig/typesys.c b/Source/Swig/typesys.c
index 464b89f28..860eafbcf 100644
--- a/Source/Swig/typesys.c
+++ b/Source/Swig/typesys.c
@@ -2170,8 +2170,10 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
Hash *lthash;
Iterator ltiter;
Hash *nthash;
+ String *cast_temp_conv;
cast_temp = NewStringEmpty();
+ cast_temp_conv = NewStringEmpty();
Printv(types, "static swig_type_info _swigt_", ki.item, " = {", NIL);
Append(table_list, ki.item);
@@ -2227,13 +2229,14 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
Printf(types, "\"%s\", \"%s\", 0, 0, (void*)%s, 0};\n", ki.item, nt, cd);
el = SwigType_equivalent_mangle(ki.item, 0, 0);
+ SortList(el, SwigType_compare_mangled);
for (ei = First(el); ei.item; ei = Next(ei)) {
String *ckey;
String *conv;
ckey = NewStringf("%s+%s", ei.item, ki.item);
conv = Getattr(conversions, ckey);
if (conv) {
- Printf(cast_temp, " {&_swigt_%s, %s, 0, 0},", ei.item, conv);
+ Printf(cast_temp_conv, " {&_swigt_%s, %s, 0, 0},", ei.item, conv);
} else {
Printf(cast_temp, " {&_swigt_%s, 0, 0, 0},", ei.item);
}
@@ -2250,7 +2253,8 @@ void SwigType_emit_type_table(File *f_forward, File *f_table) {
}
}
Delete(el);
- Printf(cast, "%s{0, 0, 0, 0}};\n", cast_temp);
+ Printf(cast, "%s%s{0, 0, 0, 0}};\n", cast_temp, cast_temp_conv);
+ Delete(cast_temp_conv);
Delete(cast_temp);
Delete(nt);
Delete(rt);