Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix native return value decontainerization.
  • Loading branch information
jnthn committed Feb 28, 2015
1 parent 7b24f43 commit b57292d
Showing 1 changed file with 17 additions and 9 deletions.
26 changes: 17 additions & 9 deletions src/vm/jvm/runtime/org/perl6/rakudo/RakOps.java
Expand Up @@ -9,6 +9,7 @@
import org.perl6.nqp.sixmodel.reprs.CallCaptureInstance;
import org.perl6.nqp.sixmodel.reprs.ContextRefInstance;
import org.perl6.nqp.sixmodel.reprs.LexoticInstance;
import org.perl6.nqp.sixmodel.reprs.NativeRefInstance;
import org.perl6.nqp.sixmodel.reprs.VMArrayInstance;

/**
Expand Down Expand Up @@ -458,15 +459,22 @@ public static SixModelObject p6store(SixModelObject cont, SixModelObject value,

public static SixModelObject p6decontrv(SixModelObject routine, SixModelObject cont, ThreadContext tc) {
GlobalExt gcx = key.getGC(tc);
if (cont != null && isRWScalar(tc, gcx, cont)) {
routine.get_attribute_native(tc, gcx.Routine, "$!rw", HINT_ROUTINE_RW);
if (tc.native_i == 0) {
/* Recontainerize to RO. */
SixModelObject roCont = gcx.Scalar.st.REPR.allocate(tc, gcx.Scalar.st);
roCont.bind_attribute_boxed(tc, gcx.Scalar, "$!value",
RakudoContainerSpec.HINT_value,
cont.st.ContainerSpec.fetch(tc, cont));
return roCont;
if (cont != null) {
if (isRWScalar(tc, gcx, cont)) {
routine.get_attribute_native(tc, gcx.Routine, "$!rw", HINT_ROUTINE_RW);
if (tc.native_i == 0) {
/* Recontainerize to RO. */
SixModelObject roCont = gcx.Scalar.st.REPR.allocate(tc, gcx.Scalar.st);
roCont.bind_attribute_boxed(tc, gcx.Scalar, "$!value",
RakudoContainerSpec.HINT_value,
cont.st.ContainerSpec.fetch(tc, cont));
return roCont;
}
}
else if (cont instanceof NativeRefInstance) {
routine.get_attribute_native(tc, gcx.Routine, "$!rw", HINT_ROUTINE_RW);
if (tc.native_i == 0)
return cont.st.ContainerSpec.fetch(tc, cont);
}
}
return cont;
Expand Down

0 comments on commit b57292d

Please sign in to comment.