Skip to content

Commit

Permalink
[jvm] Also do a type check when assigning Nil
Browse files Browse the repository at this point in the history
Fixes GH#1225, pmurias++
  • Loading branch information
usev6 committed Nov 3, 2017
1 parent 3241217 commit 8b24bf5
Showing 1 changed file with 17 additions and 15 deletions.
32 changes: 17 additions & 15 deletions src/vm/jvm/runtime/org/perl6/rakudo/RakudoContainerSpec.java
Expand Up @@ -54,21 +54,23 @@ private void checkStore(ThreadContext tc, SixModelObject cont, SixModelObject va
"Cannot assign to a readonly variable or a value");
}

if (value.st.WHAT != gcx.Nil) {
SixModelObject of = desc.get_attribute_boxed(tc,
gcx.ContainerDescriptor, "$!of", RakOps.HINT_CD_OF);
long ok = Ops.istype(value, of, tc);
if (ok == 0) {
desc.get_attribute_native(tc, gcx.ContainerDescriptor, "$!name", RakOps.HINT_CD_NAME);
String name = tc.native_s;
SixModelObject thrower = RakOps.getThrower(tc, "X::TypeCheck::Assignment");
if (thrower == null)
throw ExceptionHandling.dieInternal(tc,
"Type check failed in assignment to '" + name + "'");
else
Ops.invokeDirect(tc, thrower,
storeThrower, new Object[] { name, value, of });
}
if (value.st.WHAT == gcx.Nil) {
value = desc.get_attribute_boxed(tc,
gcx.ContainerDescriptor, "$!default", RakOps.HINT_CD_DEFAULT);
}
SixModelObject of = desc.get_attribute_boxed(tc,
gcx.ContainerDescriptor, "$!of", RakOps.HINT_CD_OF);
long ok = Ops.istype(value, of, tc);
if (ok == 0) {
desc.get_attribute_native(tc, gcx.ContainerDescriptor, "$!name", RakOps.HINT_CD_NAME);
String name = tc.native_s;
SixModelObject thrower = RakOps.getThrower(tc, "X::TypeCheck::Assignment");
if (thrower == null)
throw ExceptionHandling.dieInternal(tc,
"Type check failed in assignment to '" + name + "'");
else
Ops.invokeDirect(tc, thrower,
storeThrower, new Object[] { name, value, of });
}
}
public void store(ThreadContext tc, SixModelObject cont, SixModelObject value) {
Expand Down

0 comments on commit 8b24bf5

Please sign in to comment.