diff --git a/src/vm/jvm/runtime/org/perl6/nqp/runtime/IOOps.java b/src/vm/jvm/runtime/org/perl6/nqp/runtime/IOOps.java index d8537a7c3e..79ff1d9fef 100644 --- a/src/vm/jvm/runtime/org/perl6/nqp/runtime/IOOps.java +++ b/src/vm/jvm/runtime/org/perl6/nqp/runtime/IOOps.java @@ -14,6 +14,7 @@ import org.perl6.nqp.io.AsyncSocketHandle; import org.perl6.nqp.sixmodel.SixModelObject; import org.perl6.nqp.sixmodel.reprs.AsyncTaskInstance; +import org.perl6.nqp.sixmodel.reprs.ConcBlockingQueueInstance; import org.perl6.nqp.sixmodel.reprs.IOHandleInstance; import org.perl6.nqp.runtime.Ops; @@ -173,33 +174,66 @@ public static SixModelObject watchfile(SixModelObject queue, SixModelObject sche throw new UnsupportedOperationException("watchfile is not yet implemented."); } - public static SixModelObject asyncconnect(SixModelObject queue, SixModelObject schedulee, - String host, long port, SixModelObject asyncType, ThreadContext tc) { + public static SixModelObject asyncsocket(SixModelObject queue, SixModelObject schedulee, + long listening, SixModelObject asyncType, ThreadContext tc) { AsyncTaskInstance task = (AsyncTaskInstance) asyncType.st.REPR.allocate(tc, asyncType.st); task.queue = queue; task.schedulee = schedulee; - AsyncSocketHandle handle = new AsyncSocketHandle(tc); - task.handle = handle; - handle.connect(tc, host, (int) port, task); + HLLConfig hllConfig = tc.curFrame.codeRef.staticInfo.compUnit.hllConfig; + SixModelObject IOType = hllConfig.ioType; + SixModelObject Array = hllConfig.listType; + SixModelObject Str = hllConfig.strBoxType; + + ThreadContext curTC = tc.gc.getCurrentThreadContext(); + IOHandleInstance ioHandle = (IOHandleInstance) IOType.st.REPR.allocate(curTC, IOType.st); + + try { + if (listening == 1L) { + ioHandle.handle = new AsyncServerSocketHandle(tc); + } else { + ioHandle.handle = new AsyncSocketHandle(tc); + } + task.handle = ioHandle; + + SixModelObject result = Array.st.REPR.allocate(curTC, Array.st); + result.push_boxed(curTC, task.schedulee); + result.push_boxed(curTC, ioHandle); + result.push_boxed(curTC, Str); + ((ConcBlockingQueueInstance) task.queue).push_boxed(curTC, result); + } catch (Throwable t) { + SixModelObject result = Array.st.REPR.allocate(curTC, Array.st); + result.push_boxed(curTC, task.schedulee); + result.push_boxed(curTC, IOType); + result.push_boxed(curTC, Ops.box_s(t.toString(), Str, curTC)); + ((ConcBlockingQueueInstance) task.queue).push_boxed(curTC, result); + } return task; } - public static SixModelObject asynclisten(SixModelObject queue, SixModelObject schedulee, - String host, long port, long backlog, SixModelObject asyncType, ThreadContext tc) { + public static SixModelObject asyncconnect(SixModelObject queue, SixModelObject schedulee, + SixModelObject handle, String host, long port, SixModelObject asyncType, ThreadContext tc) { AsyncTaskInstance task = (AsyncTaskInstance) asyncType.st.REPR.allocate(tc, asyncType.st); task.queue = queue; task.schedulee = schedulee; + task.handle = ((IOHandleInstance) handle).handle; + ((AsyncSocketHandle) task.handle).connect(tc, host, (int) port, task); + return task; + } - AsyncServerSocketHandle handle = new AsyncServerSocketHandle(tc); - task.handle = handle; - - handle.bind(tc, host, (int) port, (int) backlog); - handle.accept(tc, task); + public static SixModelObject asynclisten(SixModelObject queue, SixModelObject schedulee, + SixModelObject handle, String host, long port, long backlog, SixModelObject asyncType, + ThreadContext tc) { + AsyncTaskInstance task = (AsyncTaskInstance) asyncType.st.REPR.allocate(tc, asyncType.st); + task.queue = queue; + task.schedulee = schedulee; + task.handle = ((IOHandleInstance) handle).handle; + ((AsyncServerSocketHandle) task.handle).bind(tc, host, (int) port, (int) backlog); + ((AsyncServerSocketHandle) task.handle).accept(tc, task); return task; } diff --git a/src/vm/jvm/stage0/JASTNodes.jar b/src/vm/jvm/stage0/JASTNodes.jar index eb259c433a..82c743f417 100644 Binary files a/src/vm/jvm/stage0/JASTNodes.jar and b/src/vm/jvm/stage0/JASTNodes.jar differ diff --git a/src/vm/jvm/stage0/ModuleLoader.jar b/src/vm/jvm/stage0/ModuleLoader.jar index b6b30d7588..3a36f4a2fe 100644 Binary files a/src/vm/jvm/stage0/ModuleLoader.jar and b/src/vm/jvm/stage0/ModuleLoader.jar differ diff --git a/src/vm/jvm/stage0/NQPCORE.setting.jar b/src/vm/jvm/stage0/NQPCORE.setting.jar index 62001951b7..7981472ffc 100644 Binary files a/src/vm/jvm/stage0/NQPCORE.setting.jar and b/src/vm/jvm/stage0/NQPCORE.setting.jar differ diff --git a/src/vm/jvm/stage0/NQPHLL.jar b/src/vm/jvm/stage0/NQPHLL.jar index 8d35c3b00e..02a583550f 100644 Binary files a/src/vm/jvm/stage0/NQPHLL.jar and b/src/vm/jvm/stage0/NQPHLL.jar differ diff --git a/src/vm/jvm/stage0/NQPP6QRegex.jar b/src/vm/jvm/stage0/NQPP6QRegex.jar index b16126c259..8f58856bba 100644 Binary files a/src/vm/jvm/stage0/NQPP6QRegex.jar and b/src/vm/jvm/stage0/NQPP6QRegex.jar differ diff --git a/src/vm/jvm/stage0/QAST.jar b/src/vm/jvm/stage0/QAST.jar index 7a502d22a1..dd9a31997f 100644 Binary files a/src/vm/jvm/stage0/QAST.jar and b/src/vm/jvm/stage0/QAST.jar differ diff --git a/src/vm/jvm/stage0/QASTNode.jar b/src/vm/jvm/stage0/QASTNode.jar index 09effcd360..7aad85f08c 100644 Binary files a/src/vm/jvm/stage0/QASTNode.jar and b/src/vm/jvm/stage0/QASTNode.jar differ diff --git a/src/vm/jvm/stage0/QRegex.jar b/src/vm/jvm/stage0/QRegex.jar index 138d5bf3b9..c17853bbdf 100644 Binary files a/src/vm/jvm/stage0/QRegex.jar and b/src/vm/jvm/stage0/QRegex.jar differ diff --git a/src/vm/jvm/stage0/nqp.jar b/src/vm/jvm/stage0/nqp.jar index ca2465c73f..13a8e8f52b 100644 Binary files a/src/vm/jvm/stage0/nqp.jar and b/src/vm/jvm/stage0/nqp.jar differ diff --git a/src/vm/jvm/stage0/nqpmo.jar b/src/vm/jvm/stage0/nqpmo.jar index 7bd33d47cb..2032bffe1d 100644 Binary files a/src/vm/jvm/stage0/nqpmo.jar and b/src/vm/jvm/stage0/nqpmo.jar differ