Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 348a4ff

Browse files
ibuclawdlang-bot
authored andcommitted
object: Wrap fake member function calls into delegates
1 parent 12d3078 commit 348a4ff

File tree

1 file changed

+30
-2
lines changed

1 file changed

+30
-2
lines changed

src/object.d

+30-2
Original file line numberDiff line numberDiff line change
@@ -1884,7 +1884,10 @@ class TypeInfo_Struct : TypeInfo
18841884
if (!p1 || !p2)
18851885
return false;
18861886
else if (xopEquals)
1887-
return (*xopEquals)(p1, p2);
1887+
{
1888+
const dg = _memberFunc(p2, xopEquals);
1889+
return dg.xopEquals(p1);
1890+
}
18881891
else if (p1 == p2)
18891892
return true;
18901893
else
@@ -1904,7 +1907,10 @@ class TypeInfo_Struct : TypeInfo
19041907
if (!p2)
19051908
return true;
19061909
else if (xopCmp)
1907-
return (*xopCmp)(p2, p1);
1910+
{
1911+
const dg = _memberFunc(p1, xopCmp);
1912+
return dg.xopCmp(p2);
1913+
}
19081914
else
19091915
// BUG: relies on the GC not moving objects
19101916
return memcmp(p1, p2, initializer().length);
@@ -2008,6 +2014,28 @@ class TypeInfo_Struct : TypeInfo
20082014
TypeInfo m_arg2;
20092015
}
20102016
immutable(void)* m_RTInfo; // data for precise GC
2017+
2018+
// The xopEquals and xopCmp members are function pointers to member
2019+
// functions, which is not guaranteed to share the same ABI, as it is not
2020+
// known whether the `this` parameter is the first or second argument.
2021+
// This wrapper is to convert it to a delegate which will always pass the
2022+
// `this` parameter in the correct way.
2023+
private struct _memberFunc
2024+
{
2025+
union
2026+
{
2027+
struct // delegate
2028+
{
2029+
const void* ptr;
2030+
const void* funcptr;
2031+
}
2032+
@safe pure nothrow
2033+
{
2034+
bool delegate(in void*) xopEquals;
2035+
int delegate(in void*) xopCmp;
2036+
}
2037+
}
2038+
}
20112039
}
20122040

20132041
@system unittest

0 commit comments

Comments
 (0)