Modified the algorithm so that the index is either the location of the
element if found or the index at which to insert the element to maintain
sorted order.
Also added some tests to verify the above claim.
The poly data currently has the restriction of being less than a
pointer's size, but there is much more space in the `Thread.user_args`
array which can be utilized, this commit allows you to pass types that are
larger than pointer length as long as the total size of the poly data is
less than that of the `Thread.user_args`.
In September 2022, the Python team addressed a possible DoS issue converting big integers to and from base 10 strings: https://github.com/python/cpython/issues/95778
Converting to/from base 10 is a quadratic operation, so they limited it to 4300 digits: https://discuss.python.org/t/int-str-conversions-broken-in-latest-python-bugfix-releases/18889/83
Github CI still uses an old Python version which parsed our test suite just fine. This patch converts them to hex literals to ensure our test doesn't break when Github does update to a non-vulnerable Python version released after September 2022.
- when checking the variants of a union type we will skip adding
the variants if we have an unspecialized polymorphic, hence our
union_type variants will be empty and have a count of 0
- so when checking if we violate the #no_nil error, if we are in the
unspecialized polymorphic case and there exists at least one variant
in the original variants then we should not raise this error
- test checks that we do not raise the error anymore, and that we still
detect the #no_nil error in the described circumstances