Касаемо запрета на указатели, да, куча не порушится, но и сишную программу так, по-моему, нельзя портировать.
Цитата:
при записи данных в "вариантное" поле f4 у объекта типа objty (согласно выдержке выше) поля f2 и f3 должны считаться далее невалидными
Так можно, но нужно тогда отлеживать все ссылки глобально, чтобы можно было убедиться, что в этом месте нет каких-то копий ссылки на эту же запись, через которую ничего не подозревающие бедолаги получат доступ к старым полям.
За прошедшее время надумал такие варианты:
А. Данные разных типов на самом деле не пересекаются, т.е. объединение не экономит память. Соответственно, при присваивании нового типа можно даже не трогать все поля от старого типа, но лучше их обнулить, иначе будет утечка памяти по ссылкам с умерших полей. Вроде маразм, но для портирования программ из Си подходит. Не подходит только для случая, когда нужно целенаправленно подменить тип на другой и добиться этим какой-то цели. В таких случаях будем выбрасывать исключение и сделаем специальную операцию "переинтерпретации смысла", чтобы можно было в явном виде сказать, что мы записали один тип, а читаем другой. Тогда переводим программу, запускаем её, смотрим, где падает, и там, где это не ошибка, вставляем "переинтерпретацию смысла".
Б. Данные пересекаются, но чтение и запись должны защищаться монитором. Это, ясно дело, чревато клинчами и вообще замедление. Перед чтением поля налагаем блокировку, проверяем, что тип соответствует ожидаемому, а потом только читаем. То же для записи. Самое плохое, что если запись участвует в каком-то объединении, то нужно _всегда_ работать с ней только через блокировку, даже для применений, не связанных с объединением. Поле "тип" просто так поменять нельзя, можно только вместе с данными. Сборщик мусора не должен вызываться во время блокировки.
В. Прятать реальное содержимое за ещё одним указателем на запись конкретного типа. При смене типа старое содержимое указателя бросаем, а новое выделяем на куче и переставляем указатель на него. Тогда копии данных иного типа не будут повреждены, но запись утратит целостность, т.е. её можно будет скопировать, потом сменить тип, и после этого копия перестанет быть равна оригиналу. И плюс нагрузка на сборщик мусора увеличивается.
Все три варианта, конечно, плохие.