Skip to content

Commit

Permalink
[truffle] Abstract away call arguments, so that we may pass extra stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
pmurias committed Jul 4, 2018
1 parent e7f48ec commit 1dd7722
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 3 deletions.
Expand Up @@ -50,6 +50,7 @@
import org.perl6.nqp.truffle.nodes.NQPNode;

import org.perl6.nqp.truffle.runtime.NQPCodeRef;
import org.perl6.nqp.truffle.runtime.NQPArguments;

@NodeInfo(shortName = "invoke")
public final class NQPInvokeNode extends NQPNode {
Expand Down Expand Up @@ -77,9 +78,9 @@ public Object execute(VirtualFrame frame) {
*/
CompilerAsserts.compilationConstant(argumentNodes.length);

Object[] argumentValues = new Object[argumentNodes.length];
Object[] argumentValues = NQPArguments.createInitial(argumentNodes.length);
for (int i = 0; i < argumentNodes.length; i++) {
argumentValues[i] = argumentNodes[i].execute(frame);
NQPArguments.setUserArgument(argumentValues, i, argumentNodes[i].execute(frame));
}
return dispatchNode.executeDispatch(function, argumentValues);
}
Expand Down
Expand Up @@ -47,6 +47,8 @@
import com.oracle.truffle.api.frame.FrameSlot;
import com.oracle.truffle.api.frame.FrameSlotKind;
import com.oracle.truffle.api.frame.VirtualFrame;

import org.perl6.nqp.truffle.runtime.NQPArguments;
import org.perl6.nqp.truffle.nodes.NQPNode;

public class NQPGetPositionalNode extends NQPNode {
Expand All @@ -61,7 +63,7 @@ public NQPGetPositionalNode(FrameSlot slot, int index) {
@Override
public Object execute(VirtualFrame frame) {
Object[] args = frame.getArguments();
Object value = args[index];
Object value = NQPArguments.getUserArgument(args, index);
frame.setObject(slot, value);
return value;
}
Expand Down
15 changes: 15 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/truffle/runtime/NQPArguments.java
@@ -0,0 +1,15 @@
package org.perl6.nqp.truffle.runtime;
public final class NQPArguments {
public static final int RUNTIME_ARGUMENT_COUNT = 0;
public static Object getUserArgument(Object[] arguments, int index) {
return arguments[index + RUNTIME_ARGUMENT_COUNT];
}
public static void setUserArgument(Object[] arguments, int index, Object value) {
arguments[index + RUNTIME_ARGUMENT_COUNT] = value;
}

public static Object[] createInitial(int userArgumentCount) {
Object[] result = new Object[RUNTIME_ARGUMENT_COUNT + userArgumentCount];
return result;
}
}

0 comments on commit 1dd7722

Please sign in to comment.