diff --git a/docs/about/changelog.md b/docs/about/changelog.md index 33a1694b1..6fcf1a287 100644 --- a/docs/about/changelog.md +++ b/docs/about/changelog.md @@ -29,6 +29,9 @@ priorities and future plans. - Avoid arbitrary-precision allocation for ordinary native-integer unsigned shifts while retaining the existing wide-integer fallback. +- Avoid redundant active-runtime lookups while binding and restoring implicit + global `$_` `foreach` aliases. + - Restore lexical-sub debugger dispatch and `glob` fallback behavior after an undefined `CORE::GLOBAL::glob` slot on both execution backends. diff --git a/src/main/java/org/perlonjava/runtime/runtimetypes/GlobalVariable.java b/src/main/java/org/perlonjava/runtime/runtimetypes/GlobalVariable.java index f082df6f6..684dfa5cd 100644 --- a/src/main/java/org/perlonjava/runtime/runtimetypes/GlobalVariable.java +++ b/src/main/java/org/perlonjava/runtime/runtimetypes/GlobalVariable.java @@ -1330,8 +1330,11 @@ public static void restoreTemporaryGlobalVariable( } public static void aliasForeachGlobalVariable(String key, RuntimeScalar var) { - clearForeachGlobalAlias(key); - RuntimeScalar previous = globalVariables.get(key); + GlobalRuntimeState state = globalState(); + Map aliases = state.foreachScalarAliases(); + clearForeachGlobalAlias(aliases, key); + Map scalars = state.scalarValues(); + RuntimeScalar previous = scalars.get(key); if (var instanceof RuntimeScalarReadOnly || var.type == RuntimeScalarType.READONLY_SCALAR) { if (var instanceof RuntimeScalarReadOnly readOnly) { readOnly.installForeachRestore(key, previous); @@ -1343,14 +1346,18 @@ public static void aliasForeachGlobalVariable(String key, RuntimeScalar var) { var = new ReadOnlyAlias(var, key, previous); } retainForeachAlias(var); - foreachGlobalAliases().put(key, var); + aliases.put(key, var); markPackageGlobalRoot(var); - globalVariables.put(key, var); + scalars.put(key, var); invalidatePackageRootSnapshot(); } public static void clearForeachGlobalAlias(String key) { - RuntimeScalar previous = foreachGlobalAliases().remove(key); + clearForeachGlobalAlias(globalState().foreachScalarAliases(), key); + } + + private static void clearForeachGlobalAlias(Map aliases, String key) { + RuntimeScalar previous = aliases.remove(key); if (previous != null) { releaseForeachAlias(previous); } @@ -1358,8 +1365,9 @@ public static void clearForeachGlobalAlias(String key) { /** Restore the global topic scalar after an implicit foreach alias. */ public static void restoreForeachGlobalVariable(String key, RuntimeScalar value) { - clearForeachGlobalAlias(key); - globalVariables.put(key, value); + GlobalRuntimeState state = globalState(); + clearForeachGlobalAlias(state.foreachScalarAliases(), key); + state.scalarValues().put(key, value); invalidatePackageRootSnapshot(); }