Skip to content

Commit

Permalink
[truffle] Implement nqp::ord
Browse files Browse the repository at this point in the history
  • Loading branch information
pmurias committed Aug 3, 2018
1 parent 853b0c9 commit 68f6b54
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/vm/jvm/Truffle.nqp
Expand Up @@ -273,6 +273,19 @@ class QAST::OperationsTruffle {
add_simple_op('findnotcclass', $INT, [$INT, $STR, $INT, $INT]);
add_simple_op('iscclass', $INT, [$INT, $STR, $INT]);
add_simple_op('ordbaseat', $INT, [$STR, $INT]);

add_simple_op('ordbaseat', $INT, [$STR, $INT]);

This comment has been minimized.

Copy link
@MasterDuke17

MasterDuke17 Aug 3, 2018

Contributor

Looks like a duplicate ‘ordbaseat’ here.


add_simple_op('ordfirst', $INT, [$STR]);
add_simple_op('ordat', $INT, [$STR, $INT]);

add_op('ord', sub ($comp, $node, :$want) {
my @operands := $node.list;
$comp.as_truffle(+@operands == 1
?? QAST::Op.new( :op('ordfirst'), |@operands )
!! QAST::Op.new( :op('ordat'), |@operands ), :$want);
});

add_simple_op('replace', $STR, [$STR, $INT, $INT, $STR]);
add_simple_op('codes', $INT, [$STR]);
add_simple_op('join', $STR, [$STR, $OBJ]);
Expand Down
@@ -0,0 +1,31 @@
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.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "ordat")
public final class NQPOrdatNode extends NQPIntNode {
@Child private NQPNode strNode;
@Child private NQPNode offsetNode;

@Deserializer
public NQPOrdatNode(NQPNode strNode, NQPNode offsetNode) {
this.strNode = strNode;
this.offsetNode = offsetNode;
}

@Override
public long executeInt(VirtualFrame frame) {
String str = strNode.executeStr(frame);
long offset = offsetNode.executeInt(frame);

if (offset < 0 || offset >= str.length()) {
return -1;
}
else {
return str.codePointAt((int)offset);
}
}
}
@@ -0,0 +1,27 @@
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.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPIntNode;
import org.perl6.nqp.dsl.Deserializer;

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

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

@Override
public long executeInt(VirtualFrame frame) {
String str = argNode.executeStr(frame);
if (str.isEmpty()) {
return -1;
}
else {
return str.codePointAt(0);
}
}
}

0 comments on commit 68f6b54

Please sign in to comment.