Skip to content

Commit

Permalink
[truffle] Implement nqp::iscont and _<i n s>
Browse files Browse the repository at this point in the history
  • Loading branch information
MasterDuke17 committed Aug 30, 2018
1 parent ed653e1 commit c893f05
Show file tree
Hide file tree
Showing 6 changed files with 119 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/vm/jvm/Truffle.nqp
Expand Up @@ -393,6 +393,10 @@ class QAST::OperationsTruffle {
add_simple_op('getlex' ~ $suffix, $type, [$OBJ, $INT]);
}

for ['_i', $INT, '', $OBJ, '_s', $STR, '_n', $NUM] -> $suffix, $type {
add_simple_op('iscont' ~ $suffix, $type, [$OBJ]);
}

for <postinc postdec> -> $op {
add_op($op, sub ($comp, $node, :$want) {
my $old_value := $comp.as_truffle($node[0], :want($INT));
Expand Down
@@ -0,0 +1,24 @@
package org.perl6.nqp.truffle.nodes.expression;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.StorageSpec;
import org.perl6.nqp.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.truffle.runtime.ContainerOps;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "iscont_i")
public final class NQPIscontIntNode extends NQPIntNode {
@Child private NQPNode argNode;

@Deserializer
public NQPIscontIntNode(NQPNode argNode) {
this.argNode = argNode;
}

@Override
public long executeInt(VirtualFrame frame) {
return ContainerOps.getContainerPrimitive((SixModelObject)argNode.execute(frame)) == StorageSpec.BP_INT ? 1 : 0;
}
}
@@ -0,0 +1,23 @@
package org.perl6.nqp.truffle.nodes.expression;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "iscont")
public final class NQPIscontNode extends NQPIntNode {
@Child private NQPNode argNode;

@Deserializer
public NQPIscontNode(NQPNode argNode) {
this.argNode = argNode;
}

@Override
public long executeInt(VirtualFrame frame) {
SixModelObject obj = (SixModelObject)argNode.execute(frame);
return obj == null || obj.st.ContainerSpec == null ? 0 : 1;
}
}
@@ -0,0 +1,24 @@
package org.perl6.nqp.truffle.nodes.expression;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.StorageSpec;
import org.perl6.nqp.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.truffle.runtime.ContainerOps;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "iscont_n")
public final class NQPIscontNumNode extends NQPIntNode {
@Child private NQPNode argNode;

@Deserializer
public NQPIscontNumNode(NQPNode argNode) {
this.argNode = argNode;
}

@Override
public long executeInt(VirtualFrame frame) {
return ContainerOps.getContainerPrimitive((SixModelObject)argNode.execute(frame)) == StorageSpec.BP_NUM ? 1 : 0;
}
}
@@ -0,0 +1,24 @@
package org.perl6.nqp.truffle.nodes.expression;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.StorageSpec;
import org.perl6.nqp.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.truffle.runtime.ContainerOps;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "iscont_s")
public final class NQPIscontStrNode extends NQPIntNode {
@Child private NQPNode argNode;

@Deserializer
public NQPIscontStrNode(NQPNode argNode) {
this.argNode = argNode;
}

@Override
public long executeInt(VirtualFrame frame) {
return ContainerOps.getContainerPrimitive((SixModelObject)argNode.execute(frame)) == StorageSpec.BP_STR ? 1 : 0;
}
}
20 changes: 20 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/truffle/runtime/ContainerOps.java
@@ -0,0 +1,20 @@
package org.perl6.nqp.truffle.runtime;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import org.perl6.nqp.sixmodel.ContainerSpec;
import org.perl6.nqp.sixmodel.NativeRefContainerSpec;
import org.perl6.nqp.sixmodel.StorageSpec;
import org.perl6.nqp.sixmodel.SixModelObject;
import org.perl6.nqp.sixmodel.TypeObject;
import org.perl6.nqp.sixmodel.reprs.NativeRefREPRData;

public class ContainerOps {
@TruffleBoundary
public static short getContainerPrimitive(SixModelObject obj) {
if (obj != null && !(obj instanceof TypeObject)) {
ContainerSpec cs = obj.st.ContainerSpec;
if (cs instanceof NativeRefContainerSpec)
return ((NativeRefREPRData)(obj.st.REPRData)).primitive_type;
}
return StorageSpec.BP_NONE;
}
}

0 comments on commit c893f05

Please sign in to comment.