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
@@ -1627,9 +1627,12 @@ public abstract class TypeNode extends PklNode {
VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame())); VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));
VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame())); VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));
aliasedTypeNode.execute(frame, value); try {
VmUtils.setOwner(frame, prevOwner); aliasedTypeNode.execute(frame, value);
VmUtils.setReceiver(frame, prevReceiver); } finally {
VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
}
} }
/** See docstring on {@link TypeAliasTypeNode#execute}. */ /** See docstring on {@link TypeAliasTypeNode#execute}. */
@@ -1640,10 +1643,12 @@ public abstract class TypeNode extends PklNode {
VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame())); VmUtils.setOwner(frame, VmUtils.getOwner(typeAlias.getEnclosingFrame()));
VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame())); VmUtils.setReceiver(frame, VmUtils.getReceiver(typeAlias.getEnclosingFrame()));
aliasedTypeNode.executeAndSet(frame, value); try {
aliasedTypeNode.executeAndSet(frame, value);
VmUtils.setOwner(frame, prevOwner); } finally {
VmUtils.setReceiver(frame, prevReceiver); VmUtils.setOwner(frame, prevOwner);
VmUtils.setReceiver(frame, prevReceiver);
}
} }
@Override @Override
@@ -35,3 +35,10 @@ typealias Bar = Foo
class Baz extends Bar {} class Baz extends Bar {}
res7 = (new Baz {}).value res7 = (new Baz {}).value
typealias MappingOrListing = Mapping|Listing
res8 = new {
foo = 5
bar = if (foo is MappingOrListing) "bar" else foo
}
@@ -11,3 +11,7 @@ res6 {
name = "Other" name = "Other"
} }
res7 = 42 res7 = 42
res8 {
foo = 5
bar = 5
}