Мой вопрос: возможно ли (в любом случае) анализировать и модифицировать стек вызовов (как содержимое фреймов, так и содержимое стека) во время выполнения?
Я ищу любую возможность - низкоуровневый, небезопасный или внутренний API, возможность писать расширение C и т.д. Единственное ограничение: оно должно использоваться в стандартной среде исполнения без режима отладки или профилирования. Это тот момент, когда я занимаюсь исследованиями "возможно ли это вообще?", А не "это хорошая идея?".
Я хотел бы собрать все локальные данные из фрейма, сохранить его где-нибудь, а затем удалить этот фрейм из стека с возможностью его восстановления позже. Эффективно, что дает нам продолжение в JVM, и они позволят быстро создавать асинхронные рамки (например, gevents from python) и конструкторы генератора (например, из python).
Это может выглядеть как повторяющийся вопрос, но я нашел ответы на вопросы "use Thread.currentThread().getStackTrace()
" или "это должно быть сделано с помощью инструментов отладки". Был похожий вопрос на мой, но на него ответили только в контексте того, что хотел сделать парень (работа над асинхронными вычислениями), в то время как мне нужно более общее (java- стек предназначенный) ответ. Этот вопрос тоже похож, но, как и прежде, он ориентирован на параллелизацию, и ответы тоже сосредоточены на этом.
Повторяю: это шаг исследования в процессе разработки нового предложения по языковым функциям. Я не хочу рисковать чем-то в JVM - я ищу возможность, тогда я проанализирую возможные риски и буду искать их. Я знаю, что манипулирование стеком вручную является уродливым, но также создает экземпляры с омминг-контр-устройством - и это основа для объекенизации. Грязные хаки могут быть грязными, но они могут помочь привнести что-то классное.
PS. Я знаю, что Quasar и Lightwolf существуют, но, как и выше, это concurrency -фокусированные рамки.
ИЗМЕНИТЬ
Небольшое пояснение: я ищу что-то, что будет совместимо с будущими версиями JVM и библиотек. Предпочтительно мы говорим о чем-то, что считается стабильным публичным API, но если решение лежит во внутреннем, но почти стандартном или становится стандартным после внутреннего (например, sun.misc.Unsafe) - это тоже будет сделано. Если это возможно с помощью C-расширения, используя только C JVM API - это нормально. Если это возможно при манипулировании байт-кодами - это тоже нормально (я думаю, что МОЖЕТ быть возможным с ASM).