From 3a31188cc19b11e94207e58516726d62c0ae397f Mon Sep 17 00:00:00 2001 From: translatenix <119817707+translatenix@users.noreply.github.com> Date: Wed, 17 Apr 2024 14:25:18 -0700 Subject: [PATCH] Improve method.isConst() check in InvokeSuperMethodNode Check const-ness every time a method is resolved instead of every time it is called. --- .../ast/expression/member/InvokeSuperMethodNode.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeSuperMethodNode.java b/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeSuperMethodNode.java index 278ee312..8e52617d 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeSuperMethodNode.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeSuperMethodNode.java @@ -54,10 +54,6 @@ public abstract class InvokeSuperMethodNode extends ExpressionNode { @Cached("findSupermethod(frame)") ClassMethod supermethod, @Cached("create(supermethod.getCallTarget(sourceSection))") DirectCallNode callNode) { - if (needsConst && !supermethod.isConst()) { - CompilerDirectives.transferToInterpreter(); - throw exceptionBuilder().evalError("methodMustBeConst", methodName.toString()).build(); - } var args = new Object[2 + argumentNodes.length]; args[0] = VmUtils.getReceiverOrNull(frame); args[1] = supermethod.getOwner(); @@ -77,7 +73,13 @@ public abstract class InvokeSuperMethodNode extends ExpressionNode { // note the use of getMethod() rather than getDeclaredMethod() var supermethod = superclass.getMethod(methodName); - if (supermethod != null) return supermethod; + if (supermethod != null) { + if (needsConst && !supermethod.isConst()) { + CompilerDirectives.transferToInterpreter(); + throw exceptionBuilder().evalError("methodMustBeConst", methodName.toString()).build(); + } + return supermethod; + } CompilerDirectives.transferToInterpreter(); var parent = owner.getParent();