The CallFrame you're building mirrors CPython's PyFrameObject and the JVM's per-invoke frame in its class file's Code attribute — both store a return address and a locals array exactly like this. Recursion depth limits like Python's default 1000-frame RecursionError exist precisely because this call stack is finite.