Ensure owner and receiver are reset after executing alias (#373)

This fixes an issue where the frame's owner/receiver are not reset
if a type test on a typealias fails.
This commit is contained in:
Daniel Chao
2024-03-28 07:58:22 -07:00
committed by GitHub
parent 759d4806c0
commit 28448b5512
3 changed files with 23 additions and 7 deletions

View File

@@ -1627,9 +1627,12 @@ public abstract class TypeNode extends PklNode {
VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));
VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));
aliasedTypeNode.execute(frame, value);
VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
try {
aliasedTypeNode.execute(frame, value);
} finally {
VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
}
}
/** See docstring on {@link TypeAliasTypeNode#execute}. */
@@ -1640,10 +1643,12 @@ public abstract class TypeNode extends PklNode {
VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));
VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));
aliasedTypeNode.executeAndSet(frame, value);
VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
try {
aliasedTypeNode.executeAndSet(frame, value);
} finally {
VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
}
}
@Override

View File

@@ -35,3 +35,10 @@ typealias Bar = Foo
class Baz extends Bar {}
res7 = (new Baz {}).value
typealias MappingOrListing = Mapping|Listing
res8 = new {
foo = 5
bar = if (foo is MappingOrListing) "bar" else foo
}

View File

@@ -11,3 +11,7 @@ res6 {
name = "Other"
}
res7 = 42
res8 {
foo = 5
bar = 5
}