diff --git a/src/main/java/net/starlark/java/eval/Module.java b/src/main/java/net/starlark/java/eval/Module.java index e1640ab145b0c3..248cad55b3debd 100644 --- a/src/main/java/net/starlark/java/eval/Module.java +++ b/src/main/java/net/starlark/java/eval/Module.java @@ -104,10 +104,9 @@ public static Module create() { */ @Nullable public static Module ofInnermostEnclosingStarlarkFunction(StarlarkThread thread) { - for (Debug.Frame fr : thread.getDebugCallStack().reverse()) { - if (fr.getFunction() instanceof StarlarkFunction) { - return ((StarlarkFunction) fr.getFunction()).getModule(); - } + StarlarkFunction fn = thread.getInnermostEnclosingStarlarkFunction(); + if (fn != null) { + return fn.getModule(); } return null; } diff --git a/src/main/java/net/starlark/java/eval/StarlarkThread.java b/src/main/java/net/starlark/java/eval/StarlarkThread.java index b6816fdca6ba20..ea4d0ebcaa60c4 100644 --- a/src/main/java/net/starlark/java/eval/StarlarkThread.java +++ b/src/main/java/net/starlark/java/eval/StarlarkThread.java @@ -440,6 +440,17 @@ ImmutableList getDebugCallStack() { return ImmutableList.copyOf(callstack); } + @Nullable + StarlarkFunction getInnermostEnclosingStarlarkFunction() { + for (int i = callstack.size() - 1; i >= 0; i--) { + Debug.Frame fr = callstack.get(i); + if (fr.getFunction() instanceof StarlarkFunction) { + return (StarlarkFunction) fr.getFunction(); + } + } + return null; + } + /** Returns the size of the callstack. This is needed for the debugger. */ int getCallStackSize() { return callstack.size();