Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Allow flattening native-typed arrays into argument lists on JVM
  • Loading branch information
sorear committed Jun 7, 2013
1 parent 3382c85 commit 527419e
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 7 deletions.
26 changes: 24 additions & 2 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/CallSiteDescriptor.java
Expand Up @@ -4,6 +4,7 @@
import java.util.HashMap;

import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.StorageSpec;
import org.perl6.nqp.sixmodel.reprs.VMHashInstance;

/**
Expand Down Expand Up @@ -105,10 +106,31 @@ public CallSiteDescriptor explodeFlattening(CallFrame cf, Object[] oldArgs) {
switch (af) {
case ARG_OBJ | ARG_FLAT:
SixModelObject flatArray = (SixModelObject)oldArgs[oldArgsIdx++];
int prim = flatArray.st.REPR.get_value_storage_spec(cf.tc, flatArray.st).boxed_primitive;
long elems = flatArray.elems(cf.tc);
for (long i = 0; i < elems; i++) {
newArgs.add(flatArray.at_pos_boxed(cf.tc, i));
newFlags.add(ARG_OBJ);
if (prim == StorageSpec.BP_NONE) {
newArgs.add(flatArray.at_pos_boxed(cf.tc, i));
newFlags.add(ARG_OBJ);
} else {
flatArray.at_pos_native(cf.tc, i);
switch (prim) {
case StorageSpec.BP_INT:
newArgs.add(cf.tc.native_i);
newFlags.add(ARG_INT);
break;
case StorageSpec.BP_NUM:
newArgs.add(cf.tc.native_n);
newFlags.add(ARG_NUM);
break;
case StorageSpec.BP_STR:
newArgs.add(cf.tc.native_s);
newFlags.add(ARG_STR);
break;
default:
throw ExceptionHandling.dieInternal(cf.tc, "Unknown boxed primitive");
}
}
}
break;
case ARG_OBJ | ARG_FLAT | ARG_NAMED:
Expand Down
2 changes: 2 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/sixmodel/StorageSpec.java
Expand Up @@ -36,4 +36,6 @@ public class StorageSpec {

/* The types that this one can box/unbox to. */
public short can_box;

public static final StorageSpec BOXED = new StorageSpec();
}
14 changes: 9 additions & 5 deletions src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/VMArray.java
Expand Up @@ -25,7 +25,7 @@ public SixModelObject allocate(ThreadContext tc, STable st) {
obj = new VMArrayInstance();
}
else {
switch ((short)st.REPRData) {
switch (((StorageSpec)st.REPRData).boxed_primitive) {
case StorageSpec.BP_INT:
obj = new VMArrayInstance_i();
break;
Expand All @@ -52,7 +52,7 @@ public void compose(ThreadContext tc, STable st, SixModelObject repr_info) {
case StorageSpec.BP_INT:
case StorageSpec.BP_NUM:
case StorageSpec.BP_STR:
st.REPRData = ss.boxed_primitive;
st.REPRData = ss;
break;
default:
if (ss.inlineable != StorageSpec.REFERENCE)
Expand All @@ -67,7 +67,7 @@ public SixModelObject deserialize_stub(ThreadContext tc, STable st) {
obj = new VMArrayInstance();
}
else {
switch ((short)st.REPRData) {
switch (((StorageSpec)st.REPRData).boxed_primitive) {
case StorageSpec.BP_INT:
obj = new VMArrayInstance_i();
break;
Expand All @@ -94,7 +94,7 @@ public void deserialize_finish(ThreadContext tc, STable st,
}
else {
for (long i = 0; i < elems; i++) {
switch ((short)obj.st.REPRData) {
switch (((StorageSpec)obj.st.REPRData).boxed_primitive) {
case StorageSpec.BP_INT:
tc.native_i = reader.readLong();
break;
Expand Down Expand Up @@ -122,7 +122,7 @@ public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObje
else {
for (long i = 0; i < elems; i++) {
obj.at_pos_native(tc, i);
switch ((short)obj.st.REPRData) {
switch (((StorageSpec)obj.st.REPRData).boxed_primitive) {
case StorageSpec.BP_INT:
writer.writeInt(tc.native_i);
break;
Expand All @@ -138,4 +138,8 @@ public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObje
}
}
}

public StorageSpec get_value_storage_spec(ThreadContext tc, STable st) {
return st.REPRData == null ? StorageSpec.BOXED : (StorageSpec)st.REPRData;
}
}

0 comments on commit 527419e

Please sign in to comment.