TruffleRuby's design centers on making the common case fast (no svars needed) while still supporting the frame-local, thread-local semantics Ruby requires. There are several layers of optimization.
Every method frame reserves slot 1 for a SpecialVariableStorage object (see TranslatorEnvironment.java). Block frames do not get their own slot — they share the enclosing method's storage by walking up the declaration frame chain (the depth is cached per FrameDescriptor, so the JIT unrolls this).
SpecialVariableStorage itself is tiny — it holds just two fields:
lastMatch($~) — aThreadAndFrameLocalStorage