diff --git a/docs/modules/language-reference/pages/index.adoc b/docs/modules/language-reference/pages/index.adoc index 6ef9c743..8e1e38c7 100644 --- a/docs/modules/language-reference/pages/index.adoc +++ b/docs/modules/language-reference/pages/index.adoc @@ -989,8 +989,8 @@ Because a `local` property is added to the lexical scope, but not (observably) t ==== An _import clause_ defines a local property in the containing module. -This means `import "someModule.pkl"` is equivalent to `local someModule = import("someModule.pkl")`. -Also, `import "someModule.pkl" as otherName` is equivalent to `local otherName = import("someModule.pkl")`. +This means `import "someModule.pkl"` is effectively `const local someModule = import("someModule.pkl")`. +Also, `import "someModule.pkl" as otherName` is effectively `const local otherName = import("someModule.pkl")`. ==== [[fixed-properties]] diff --git a/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodVirtualNode.java b/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodVirtualNode.java index 2160f8c6..c6cff4cd 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodVirtualNode.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/expression/member/InvokeMethodVirtualNode.java @@ -16,7 +16,6 @@ package org.pkl.core.ast.expression.member; import com.oracle.truffle.api.CompilerDirectives; -import com.oracle.truffle.api.CompilerDirectives.CompilationFinal; import com.oracle.truffle.api.RootCallTarget; import com.oracle.truffle.api.dsl.Cached; import com.oracle.truffle.api.dsl.ImportStatic; @@ -44,7 +43,6 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { @Children private final ExpressionNode[] argumentNodes; private final MemberLookupMode lookupMode; private final boolean needsConst; - @CompilationFinal private boolean isConstChecked; protected InvokeMethodVirtualNode( SourceSection sourceSection, @@ -101,10 +99,9 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { protected Object evalFunction( VirtualFrame frame, VmFunction receiver, - VmClass receiverClass, + @SuppressWarnings("unused") VmClass receiverClass, @Cached("create()") IndirectCallNode callNode) { - checkConst(receiverClass); var args = new Object[2 + argumentNodes.length]; args[0] = receiver.getThisValue(); args[1] = receiver; @@ -125,7 +122,6 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { @Cached("resolveMethod(receiverClass)") ClassMethod method, @Cached("create(method.getCallTarget(sourceSection))") DirectCallNode callNode) { - checkConst(method); var args = new Object[2 + argumentNodes.length]; args[0] = receiver; args[1] = method.getOwner(); @@ -145,8 +141,6 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { @Cached("create()") IndirectCallNode callNode) { var method = resolveMethod(receiverClass); - checkConst(method); - var args = new Object[2 + argumentNodes.length]; args[0] = receiver; args[1] = method.getOwner(); @@ -161,7 +155,10 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { protected ClassMethod resolveMethod(VmClass receiverClass) { var method = receiverClass.getMethod(methodName); - if (method != null) return method; + if (method != null) { + checkConst(method); + return method; + } CompilerDirectives.transferToInterpreter(); @@ -174,17 +171,10 @@ public abstract class InvokeMethodVirtualNode extends ExpressionNode { .build(); } - private void checkConst(VmClass receiverClass) { - checkConst(resolveMethod(receiverClass)); - } - private void checkConst(ClassMethod method) { - if (needsConst && !isConstChecked) { - CompilerDirectives.transferToInterpreterAndInvalidate(); - if (!method.isConst()) { - throw exceptionBuilder().evalError("methodMustBeConst", methodName.toString()).build(); - } - isConstChecked = true; + if (needsConst && !method.isConst()) { + CompilerDirectives.transferToInterpreter(); + throw exceptionBuilder().evalError("methodMustBeConst", methodName.toString()).build(); } } } diff --git a/pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ResolveVariableNode.java b/pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ResolveVariableNode.java index c0215cd0..0fd8d896 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ResolveVariableNode.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/expression/primary/ResolveVariableNode.java @@ -194,7 +194,7 @@ public final class ResolveVariableNode extends ExpressionNode { } } - // Assuming this method exists at all, it must be a method accessible through `this`. + // Assuming this property exists at all, it must be a property accessible through `this`. /// // Reading a property off of implicit `this` needs a const check if this node is not in a const // scope. diff --git a/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java b/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java index b64b97ac..8d6aff71 100644 --- a/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java +++ b/pkl-core/src/main/java/org/pkl/core/ast/member/Member.java @@ -15,7 +15,6 @@ */ package org.pkl.core.ast.member; -import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary; import com.oracle.truffle.api.source.SourceSection; import org.pkl.core.ast.VmModifier; import org.pkl.core.runtime.Identifier; @@ -76,42 +75,34 @@ public abstract class Member { /** For use in user-facing messages. Non-null iff getName() is non-null. */ public abstract @Nullable String getCallSignature(); - @TruffleBoundary public final boolean isLocal() { return VmModifier.isLocal(modifiers); } - @TruffleBoundary public final boolean isConst() { return VmModifier.isConst(modifiers); } - @TruffleBoundary public final boolean isFixed() { return VmModifier.isFixed(modifiers); } - @TruffleBoundary public final boolean isHidden() { return VmModifier.isHidden(modifiers); } - @TruffleBoundary public final boolean isExternal() { return VmModifier.isExternal(modifiers); } - @TruffleBoundary public final boolean isClass() { return VmModifier.isClass(modifiers); } - @TruffleBoundary public final boolean isTypeAlias() { return VmModifier.isTypeAlias(modifiers); } - @TruffleBoundary public final boolean isImport() { return VmModifier.isImport(modifiers); } @@ -120,27 +111,22 @@ public abstract class Member { return VmModifier.isGlob(modifiers); } - @TruffleBoundary public final boolean isAbstract() { return VmModifier.isAbstract(modifiers); } - @TruffleBoundary public final boolean isType() { return VmModifier.isType(modifiers); } - @TruffleBoundary public final boolean isLocalOrExternalOrHidden() { return VmModifier.isLocalOrExternalOrHidden(modifiers); } - @TruffleBoundary public final boolean isConstOrFixed() { return VmModifier.isConstOrFixed(modifiers); } - @TruffleBoundary public final boolean isLocalOrExternalOrAbstract() { return VmModifier.isLocalOrExternalOrAbstract(modifiers); }