(This is from BugZilla bug 702788, which is a long-standing bug for GObject-introspection on Windows/x64, where crashes were caused as pointers were rendered invalid as the long type [4 bytes] was not big enough to hold the pointers on x64 Windows [8 bytes]. This essentially supersedes MR !17 (closed), as mentioned by @mathieudu).
On Windows (Visual Studio at least), unsigned longs are always 4 bytes, on both 32-bit and x64 Windows, so we cannot use unsigned longs to deal with pointers on 64-bit builds, as pointers are 8 bytes on 64-bit Windows, which may well render the pointer (which we acquired from libffi) invalid.
This will fix crashes in PyGObject which are manifested when launching the cairo-demo example sript (intermittent) and when clicking on "Interactive Dialog" button in the Dialog demo in the PyGObject GTK+ Code demos before entering anything in Entry 1 and Entry 2, when running on x64 Visual Studio builds of the GTK+/PyGObject stack.
Also use size_t instead of unsigned long in gthash.c when we check that memory & 0x3 is 0, to silence compiler warnings from enabling /Wp64, which is used to detect portability problems on Visual Studio when doing x86->x64 code builds.
This patch is both applicable to the master and stable branches.
With blessings, thank you!