From f4c5a958932d2e618882c8a7972820b909770db1 Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 6 Mar 2023 04:58:28 -0800 Subject: [PATCH] Do not use ImmutableList.copyOf whilst finding the innermost starlark function of a StarlarkThread. RELNOTES: None. PiperOrigin-RevId: 514374572 Change-Id: I719489ebb78fd8c9a230d09a962e1208dd01eda9 --- src/main/java/net/starlark/java/eval/Module.java | 7 +++---- .../java/net/starlark/java/eval/StarlarkThread.java | 11 +++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) 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();