Cannot assign property with fixed/const in spread (#428)

When using spread syntax with typed object, properties that are fixed
or const cannot be assigned or amended.
This should be checked in the checkTypedProperty() function.
This commit is contained in:
luuvish
2024-04-17 06:45:33 +09:00
committed by GitHub
parent 6e2ea07986
commit 2f0436ff2f
3 changed files with 52 additions and 13 deletions

View File

@@ -343,19 +343,39 @@ public abstract class GeneratorSpreadNode extends GeneratorMemberNode {
}
protected void checkTypedProperty(VmClass clazz, ObjectMember member) {
if (member.isLocal() || clazz.hasProperty(member.getName())) return;
CompilerDirectives.transferToInterpreter();
var exception =
exceptionBuilder()
.cannotFindProperty(clazz.getPrototype(), member.getName(), false, false)
.build();
if (member.getHeaderSection().isAvailable()) {
exception
.getInsertedStackFrames()
.put(
getRootNode().getCallTarget(),
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
if (member.isLocal()) return;
var memberName = member.getName();
if (!clazz.hasProperty(memberName)) {
CompilerDirectives.transferToInterpreter();
var exception =
exceptionBuilder()
.cannotFindProperty(clazz.getPrototype(), memberName, false, false)
.build();
if (member.getHeaderSection().isAvailable()) {
exception
.getInsertedStackFrames()
.put(
getRootNode().getCallTarget(),
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
}
throw exception;
}
var classProperty = clazz.getProperty(memberName);
if (classProperty != null && classProperty.isConstOrFixed()) {
CompilerDirectives.transferToInterpreter();
var errMsg =
classProperty.isConst() ? "cannotAssignConstProperty" : "cannotAssignFixedProperty";
var exception = exceptionBuilder().evalError(errMsg, memberName).build();
if (member.getHeaderSection().isAvailable()) {
exception
.getInsertedStackFrames()
.put(
getRootNode().getCallTarget(),
VmUtils.createStackFrame(member.getHeaderSection(), member.getQualifiedName()));
}
throw exception;
}
throw exception;
}
}

View File

@@ -0,0 +1,5 @@
amends "../basic/fixedProperty2.pkl"
p = new {
...new Dynamic { name = "Osprey" }
}

View File

@@ -0,0 +1,14 @@
Pkl Error
Cannot assign to fixed property `name`.
x | ...new Dynamic { name = "Osprey" }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at cannotAssignFixedProperty3#p (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)
x | ...new Dynamic { name = "Osprey" }
^^^^
at cannotAssignFixedProperty3#p.name (file:///$snippetsDir/input/errors/cannotAssignFixedProperty3.pkl)
xxx | text = renderer.renderDocument(value)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
at pkl.base#Module.output.text (pkl:base)