Skip to content

Commit

Permalink
[truffle] Implement nqp::sha1
Browse files Browse the repository at this point in the history
  • Loading branch information
pmurias committed Aug 8, 2018
1 parent 26042b7 commit 47cb3ca
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 0 deletions.
2 changes: 2 additions & 0 deletions src/vm/jvm/Truffle.nqp
Expand Up @@ -350,6 +350,8 @@ class QAST::OperationsTruffle {
add_simple_op('rmdir', $INT, [$STR]);
add_simple_op('symlink', $INT, [$STR, $STR]);
add_simple_op('unlink', $INT, [$STR]);

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

add_simple_op('time_i', $INT, []);
add_simple_op('time_n', $NUM, []);
Expand Down
@@ -0,0 +1,48 @@
package org.perl6.nqp.truffle.nodes.expression;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.NodeInfo;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import org.perl6.nqp.truffle.nodes.NQPNode;
import org.perl6.nqp.truffle.nodes.NQPStrNode;
import org.perl6.nqp.dsl.Deserializer;


@NodeInfo(shortName = "sha1")
public final class NQPSha1Node extends NQPStrNode {
@Child private NQPNode argNode;

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

@Override
public String executeStr(VirtualFrame frame) {
return sha1(argNode.executeStr(frame));
}


@TruffleBoundary
public String sha1(String str) {
try {
MessageDigest md = MessageDigest.getInstance("SHA1");

byte[] inBytes = str.getBytes("UTF-8");
byte[] outBytes = md.digest(inBytes);

StringBuilder sb = new StringBuilder();
for (byte b : outBytes) {
sb.append(String.format("%02X", b));
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Should not happen");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Should not happen");
}
}
}

0 comments on commit 47cb3ca

Please sign in to comment.