Skip to content

Commit

Permalink
[truffle] Implement nqp::hash and nqp::bindkey, nqp::atkey and nqp::e…
Browse files Browse the repository at this point in the history
…lems for hashes
  • Loading branch information
pmurias committed Jul 6, 2018
1 parent 457108f commit 113ffca
Show file tree
Hide file tree
Showing 6 changed files with 139 additions and 0 deletions.
16 changes: 16 additions & 0 deletions src/vm/jvm/Truffle.nqp
Expand Up @@ -155,8 +155,24 @@ class QAST::OperationsTruffle {

TAST.new($OBJ, @tree);
});

add_simple_op('atkey' ~ $suffix, $type, [$OBJ, $STR]);
add_simple_op('bindkey' ~ $suffix, $type, [$OBJ, $STR, $type], :side_effects);
}

add_op('hash', sub ($comp, $node, :$want) {
my @tree := ['hash'];
for $node.list -> $key, $val {
my $key_tast := $comp.as_truffle($key, :want($STR));
my $val_tast := $comp.as_truffle($val, :want($OBJ));
@tree.push($key_tast.tree);
@tree.push($val_tast.tree);
}
TAST.new($OBJ, @tree);
});

add_simple_op('elems', $INT, [$OBJ]);

add_simple_op('tclc', $STR, [$STR]);

for ['_i', $INT, '_n', $NUM] -> $suffix, $type {
Expand Down
@@ -0,0 +1,25 @@
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.NQPObjNode;
import org.perl6.nqp.dsl.Deserializer;
import org.perl6.nqp.truffle.runtime.NQPHash;


@NodeInfo(shortName = "atkey")
public final class NQPAtkeyNode extends NQPObjNode {
@Child private NQPNode hashNode;
@Child private NQPNode keyNode;

@Deserializer
public NQPAtkeyNode(NQPNode hashNode, NQPNode keyNode) {
this.hashNode = hashNode;
this.keyNode = keyNode;
}

@Override
public Object execute(VirtualFrame frame) {
return ((NQPHash)hashNode.execute(frame)).atkey(keyNode.executeStr(frame));
}
}
@@ -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.NQPObjNode;
import org.perl6.nqp.truffle.runtime.NQPHash;
import org.perl6.nqp.dsl.Deserializer;

@NodeInfo(shortName = "bindkey")
public final class NQPBindkeyNode extends NQPObjNode {
@Child private NQPNode hashNode;
@Child private NQPNode keyNode;
@Child private NQPNode valueNode;

@Deserializer
public NQPBindkeyNode(NQPNode hashNode, NQPNode keyNode, NQPNode valueNode) {
this.hashNode = hashNode;
this.keyNode = keyNode;
this.valueNode = valueNode;
}

@Override
public Object execute(VirtualFrame frame) {
NQPHash hash = (NQPHash) hashNode.execute(frame);
return hash.bindkey(keyNode.executeStr(frame), valueNode.execute(frame));
}
}
@@ -0,0 +1,22 @@
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;
import org.perl6.nqp.truffle.runtime.NQPHash;

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

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

@Override
public long executeInt(VirtualFrame frame) {
return ((NQPHash)argNode.execute(frame)).elems();
}
}
@@ -0,0 +1,26 @@
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.NQPObjNode;
import org.perl6.nqp.dsl.Deserializer;
import org.perl6.nqp.truffle.runtime.NQPHash;

@NodeInfo(shortName = "hash")
public final class NQPHashNode extends NQPObjNode {
@Children private final NQPNode[] keyValueNodes;

@Deserializer
public NQPHashNode(NQPNode[] keyValueNodes) {
this.keyValueNodes = keyValueNodes;
}

@Override
public Object execute(VirtualFrame frame) {
NQPHash hash = new NQPHash();
for (int i = 0; i < keyValueNodes.length; i += 2) {
hash.bindkey(keyValueNodes[i].executeStr(frame), keyValueNodes[i+1].execute(frame));
}
return hash;
}
}
23 changes: 23 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/truffle/runtime/NQPHash.java
@@ -0,0 +1,23 @@
package org.perl6.nqp.truffle.runtime;

import java.util.HashMap;

public final class NQPHash {
HashMap<String, Object> contents;

public NQPHash() {
this.contents = new HashMap<String, Object>();
}

public Object atkey(String key) {
return contents.get(key);
}

public Object bindkey(String key, Object value) {
return contents.put(key, value);
}

public int elems() {
return contents.size();
}
}

0 comments on commit 113ffca

Please sign in to comment.