(datatype vmcont (:nil) (:k (vmcont) (lenv) int (vector (object))) )
Take a look at the current VM implementation, in Irken.
So a 'VM continuation' consists of the pointer to the next frame, the lexical environment, the PC, and a vector of saved registers.
The 'INVOKE' cps insn is turned into two VM insns, 'CALL' and 'POP'.
Even without any serious tweaking, the tak20 benchmark seems to run about the same speed as in python. But I plan to make specialized versions of CALL and POP for different numbers of saved registers. This will eliminate loops in the insns and thus get rid of allocation for the insn closures.
It's very rewarding to finally bring all this work together. Putting together a functioning VM is the very tip of an iceberg I've spent 2+ years building.
I'm even thinking about documenting the Irken language. Yeah, I know, crazy thoughts.
Next step: start building the python-like language. This would involve rewriting the byte-code compiler in Irken. OR, I could continue the nearly trivial task of supporting Irken as a byte-coded language, and start rewriting everything in Irken. As we all know, only the most fashionable and respectable languages are written in themselves. It's tempting!