Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Initial socket support for JVM
  • Loading branch information
Tadeusz Sośnierz committed Aug 11, 2013
1 parent 6dea545 commit 6933faa
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 0 deletions.
4 changes: 4 additions & 0 deletions src/vm/jvm/QAST/Compiler.nqp
Expand Up @@ -1910,6 +1910,10 @@ QAST::OperationsJAST.map_classlib_core_op('link', $TYPE_OPS, 'link', [$RT_STR, $
QAST::OperationsJAST.map_classlib_core_op('shell', $TYPE_OPS, 'shell', [$RT_STR], $RT_INT);
QAST::OperationsJAST.map_classlib_core_op('symlink', $TYPE_OPS, 'symlink', [$RT_STR, $RT_STR], $RT_INT);

QAST::OperationsJAST.map_classlib_core_op('socket', $TYPE_OPS, 'socket', [], $RT_OBJ, :tc);
QAST::OperationsJAST.map_classlib_core_op('connect', $TYPE_OPS, 'connect', [$RT_OBJ, $RT_STR, $RT_INT], $RT_OBJ, :tc);
QAST::OperationsJAST.map_classlib_core_op('closesocket', $TYPE_OPS, 'closesocket', [$RT_OBJ], $RT_OBJ, :tc);

QAST::OperationsJAST.map_classlib_core_op('opendir', $TYPE_OPS, 'opendir', [$RT_STR], $RT_OBJ, :tc);
QAST::OperationsJAST.map_classlib_core_op('nextfiledir', $TYPE_OPS, 'nextfiledir', [$RT_OBJ], $RT_STR, :tc);
QAST::OperationsJAST.map_classlib_core_op('closedir', $TYPE_OPS, 'closedir', [$RT_OBJ], $RT_INT, :tc);
Expand Down
33 changes: 33 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/io/NotQuiteSocket.java
@@ -0,0 +1,33 @@
package org.perl6.nqp.io;

import java.net.Socket;
import java.net.InetSocketAddress;
import java.io.IOException;

import org.perl6.nqp.runtime.ExceptionHandling;
import org.perl6.nqp.runtime.ThreadContext;

public class NotQuiteSocket implements IIOClosable {
private Socket sock;

public NotQuiteSocket(ThreadContext tc) {
sock = new Socket();
}

public void close(ThreadContext tc) {
try {
sock.close();
} catch (IOException e) {
throw ExceptionHandling.dieInternal(tc, e);
}
}

public void connect(ThreadContext tc, String hostname, long port){
InetSocketAddress addr = new InetSocketAddress(hostname, (int)port);
try {
sock.connect(addr);
} catch (IOException e) {
throw ExceptionHandling.dieInternal(tc, e);
}
}
}
22 changes: 22 additions & 0 deletions src/vm/jvm/runtime/org/perl6/nqp/runtime/Ops.java
Expand Up @@ -38,6 +38,7 @@
import org.perl6.nqp.io.AsyncFileHandle;
import org.perl6.nqp.io.FileHandle;
import org.perl6.nqp.io.IIOAsyncReadable;
import org.perl6.nqp.io.NotQuiteSocket;
import org.perl6.nqp.io.IIOClosable;
import org.perl6.nqp.io.IIOEncodable;
import org.perl6.nqp.io.IIOInteractive;
Expand Down Expand Up @@ -358,6 +359,27 @@ public static SixModelObject getstderr(ThreadContext tc) {
return h;
}

public static SixModelObject socket(ThreadContext tc) {
SixModelObject IOType = tc.curFrame.codeRef.staticInfo.compUnit.hllConfig.ioType;
IOHandleInstance h = (IOHandleInstance)IOType.st.REPR.allocate(tc, IOType.st);
h.handle = new NotQuiteSocket(tc);
return h;
}

public static SixModelObject connect(SixModelObject obj, String host, long port, ThreadContext tc) {
IOHandleInstance h = (IOHandleInstance)obj;
NotQuiteSocket sock = (NotQuiteSocket)h.handle;
sock.connect(tc, host, port);
return obj;
}

public static SixModelObject closesocket(SixModelObject obj, ThreadContext tc) {
IOHandleInstance h = (IOHandleInstance)obj;
NotQuiteSocket sock = (NotQuiteSocket)h.handle;
sock.close(tc);
return obj;
}

public static SixModelObject setencoding(SixModelObject obj, String encoding, ThreadContext tc) {
if (obj instanceof IOHandleInstance) {
IOHandleInstance h = (IOHandleInstance)obj;
Expand Down

0 comments on commit 6933faa

Please sign in to comment.