ReplBridge
Game-loader side of the REPL. Builds the MaskingClassLoader, crosses into the masking world with a single reflective bootstrap of ...repl.impl.MaskingBridgeImpl — reached type-safely thereafter through the shared MaskingBridge interface — and caches the result so every compile / execute after the first is a warm call. The same bridge also fronts the remap-cache builder (buildRemapArtifacts), so ALL masking-only calls share this one hop.
Why reflection: MaskingBridgeImpl and its backends (ReplHost, RemapCacheBuilder) link the Kotlin scripting / remapper APIs, which live only on the masking loader's urls (see MaskingClassLoader for why they cannot sit on the game's module path). The game loader therefore cannot link them by name, and this one bootstrap hop is the whole cost of that isolation.
Only types the masking loader delegates to the parent may cross the boundary: java.*, Object, and the mod's own classes outside repl.impl — which is also why MaskingBridge itself must stay in ...repl; see MaskingClassLoader.
Properties
CommonClass.init trigger — the baseline the other three timestamps are relative to.onEnable, which PluginJarCollector reads live.~= initStartNanos on a training launch).~= initStartNanos on a mojmap runtime, where no remap is needed).Functions
className (via its CodeSource on the game loader) to the compile classpath, if it resolves to a real file not already present.deps.txt on the game loader and add its backing jar to cp, recovering the MC API-dep jars (e.g.srg_to_official.tsrg from MCPConfig joinedTsrg (obf → srg) + Mojang clientTxt, and reverse-remap the Mixed-SRG runtime jar into a mojmap symbol jar.repl.impl classes, so ReplHost resolves child-first.prefix (e.g.IPlatformHelper.cacheDir.