Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Extend container API to support natives.
Includes updating the code_pair container spec for the API change.
  • Loading branch information
jnthn committed Feb 26, 2015
1 parent 57c6dce commit 59de265
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/Ops.java
Expand Up @@ -1936,6 +1936,9 @@ public static long captureposprimspec(SixModelObject obj, long idx, ThreadContex
public static final Object[] emptyArgList = new Object[0];
public static final CallSiteDescriptor invocantCallSite = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ }, null);
public static final CallSiteDescriptor storeCallSite = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_OBJ }, null);
public static final CallSiteDescriptor storeCallSite_i = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_INT }, null);
public static final CallSiteDescriptor storeCallSite_n = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_NUM }, null);
public static final CallSiteDescriptor storeCallSite_s = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_STR }, null);
public static final CallSiteDescriptor findmethCallSite = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_STR }, null);
public static final CallSiteDescriptor typeCheckCallSite = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_OBJ }, null);
public static final CallSiteDescriptor howObjCallSite = new CallSiteDescriptor(new byte[] { CallSiteDescriptor.ARG_OBJ, CallSiteDescriptor.ARG_OBJ }, null);
Expand Down
Expand Up @@ -16,11 +16,32 @@ public SixModelObject fetch(ThreadContext tc, SixModelObject cont) {
Ops.invokeDirect(tc, fetchCode, Ops.invocantCallSite, new Object[] { cont });
return Ops.result_o(tc.curFrame);
}
public long fetch_i(ThreadContext tc, SixModelObject cont) {
Ops.invokeDirect(tc, fetchCode, Ops.invocantCallSite, new Object[] { cont });
return Ops.result_i(tc.curFrame);
}
public double fetch_n(ThreadContext tc, SixModelObject cont) {
Ops.invokeDirect(tc, fetchCode, Ops.invocantCallSite, new Object[] { cont });
return Ops.result_n(tc.curFrame);
}
public String fetch_s(ThreadContext tc, SixModelObject cont) {
Ops.invokeDirect(tc, fetchCode, Ops.invocantCallSite, new Object[] { cont });
return Ops.result_s(tc.curFrame);
}

/* Stores a value in a container. Used for assignment. */
public void store(ThreadContext tc, SixModelObject cont, SixModelObject obj) {
Ops.invokeDirect(tc, storeCode, Ops.storeCallSite, new Object[] { cont, obj });
}
public void store_i(ThreadContext tc, SixModelObject cont, long value) {
Ops.invokeDirect(tc, storeCode, Ops.storeCallSite_i, new Object[] { cont, value });
}
public void store_n(ThreadContext tc, SixModelObject cont, double value) {
Ops.invokeDirect(tc, storeCode, Ops.storeCallSite_n, new Object[] { cont, value });
}
public void store_s(ThreadContext tc, SixModelObject cont, String value) {
Ops.invokeDirect(tc, storeCode, Ops.storeCallSite_s, new Object[] { cont, value });
}

/* Stores a value in a container, without any checking of it (this
* assumes an optimizer or something else already did it). Used for
Expand Down
12 changes: 11 additions & 1 deletion src/vm/jvm/runtime/org/perl6/nqp/sixmodel/ContainerSpec.java
Expand Up @@ -8,10 +8,20 @@
public abstract class ContainerSpec {
/* Fetches a value out of a container. Used for decontainerization. */
public abstract SixModelObject fetch(ThreadContext tc, SixModelObject cont);

/* Native value fetches. */
public abstract long fetch_i(ThreadContext tc, SixModelObject cont);
public abstract double fetch_n(ThreadContext tc, SixModelObject cont);
public abstract String fetch_s(ThreadContext tc, SixModelObject cont);

/* Stores a value in a container. Used for assignment. */
public abstract void store(ThreadContext tc, SixModelObject cont, SixModelObject obj);


/* Native container stores. */
public abstract void store_i(ThreadContext tc, SixModelObject cont, long value);
public abstract void store_n(ThreadContext tc, SixModelObject cont, double value);
public abstract void store_s(ThreadContext tc, SixModelObject cont, String value);

/* Stores a value in a container, without any checking of it (this
* assumes an optimizer or something else already did it). Used for
* assignment. */
Expand Down

0 comments on commit 59de265

Please sign in to comment.