From 2361ceacd45e388537f00d44c734eeb65650e95c Mon Sep 17 00:00:00 2001 From: bdemsky Date: Tue, 13 Mar 2007 02:47:18 +0000 Subject: [PATCH] Outgoing socket I/O WebSpide --- Robust/src/ClassLibrary/Socket.java | 2 +- Robust/src/ClassLibrary/String.java | 11 ++++++ Robust/src/ClassLibrary/StringBuffer.java | 6 +++ Robust/src/IR/Flat/BuildCode.java | 45 +++++++++++++++------- Robust/src/IR/Flat/BuildFlat.java | 16 +++++--- Robust/src/IR/Flat/FlatFlagActionNode.java | 4 ++ Robust/src/IR/Flat/FlatLiteralNode.java | 2 +- Robust/src/IR/Flat/TempFlagPair.java | 5 ++- Robust/src/IR/Tree/BuildIR.java | 2 +- Robust/src/IR/Tree/SemanticCheck.java | 2 +- Robust/src/Main/Main.java | 9 ++++- Robust/src/Parse/java14.cup | 4 +- Robust/src/Runtime/runtime.c | 13 ++++++- Robust/src/Runtime/runtime.h | 6 ++- Robust/src/Runtime/socket.c | 28 ++++++++------ 15 files changed, 113 insertions(+), 42 deletions(-) diff --git a/Robust/src/ClassLibrary/Socket.java b/Robust/src/ClassLibrary/Socket.java index ddfc8a9b..72b76f64 100644 --- a/Robust/src/ClassLibrary/Socket.java +++ b/Robust/src/ClassLibrary/Socket.java @@ -20,7 +20,7 @@ public class Socket { public static native int nativeBind(byte[] address, int port); - public static native int nativeConnect(int fd, byte[] address, int port); + public native int nativeConnect(int fd, byte[] address, int port); int setFD(int filed) { fd=filed; diff --git a/Robust/src/ClassLibrary/String.java b/Robust/src/ClassLibrary/String.java index 95d85b22..13798ff0 100644 --- a/Robust/src/ClassLibrary/String.java +++ b/Robust/src/ClassLibrary/String.java @@ -54,6 +54,17 @@ public class String { return this.subString(beginIndex, this.count); } + public int lastindexOf(int ch) { + return this.lastindexOf(ch, count - 1); + } + + public int lastindexOf(int ch, int fromIndex) { + for(int i=fromIndex;i>0;i--) + if (this.charAt(i)==ch) + return i; + return -1; + } + public int indexOf(int ch) { return this.indexOf(ch, 0); } diff --git a/Robust/src/ClassLibrary/StringBuffer.java b/Robust/src/ClassLibrary/StringBuffer.java index b06fd706..02bb8a36 100644 --- a/Robust/src/ClassLibrary/StringBuffer.java +++ b/Robust/src/ClassLibrary/StringBuffer.java @@ -12,6 +12,12 @@ public class StringBuffer { value[i]=str.value[i+str.offset]; } + public StringBuffer() { + value=new char[16];//16 is DEFAULTSIZE + count=0; + offset=0; + } + public int length() { return count; } diff --git a/Robust/src/IR/Flat/BuildCode.java b/Robust/src/IR/Flat/BuildCode.java index c471cb2f..cd726b7e 100644 --- a/Robust/src/IR/Flat/BuildCode.java +++ b/Robust/src/IR/Flat/BuildCode.java @@ -1407,22 +1407,31 @@ public class BuildCode { TempDescriptor temp=tfp.getTemp(); Hashtable flagtable=(Hashtable)flagorder.get(temp.getType().getClassDesc()); FlagDescriptor flag=tfp.getFlag(); - int flagid=1<<((Integer)flagtable.get(flag)).intValue(); - boolean flagstatus=ffan.getFlagChange(tfp); - if (flagstatus) { - int mask=0; + if (flag==null) { + //Newly allocate objects that don't set any flags case if (flagortable.containsKey(temp)) { - mask=((Integer)flagortable.get(temp)).intValue(); + throw new Error(); } - mask|=flagid; + int mask=0; flagortable.put(temp,new Integer(mask)); } else { - int mask=0xFFFFFFFF; - if (flagandtable.containsKey(temp)) { - mask=((Integer)flagandtable.get(temp)).intValue(); + int flagid=1<<((Integer)flagtable.get(flag)).intValue(); + boolean flagstatus=ffan.getFlagChange(tfp); + if (flagstatus) { + int mask=0; + if (flagortable.containsKey(temp)) { + mask=((Integer)flagortable.get(temp)).intValue(); + } + mask|=flagid; + flagortable.put(temp,new Integer(mask)); + } else { + int mask=0xFFFFFFFF; + if (flagandtable.containsKey(temp)) { + mask=((Integer)flagandtable.get(temp)).intValue(); + } + mask&=(0xFFFFFFFF^flagid); + flagandtable.put(temp,new Integer(mask)); } - mask&=(0xFFFFFFFF^flagid); - flagandtable.put(temp,new Integer(mask)); } } Iterator orit=flagortable.keySet().iterator(); @@ -1432,14 +1441,22 @@ public class BuildCode { int andmask=0xFFFFFFF; if (flagandtable.containsKey(temp)) andmask=((Integer)flagandtable.get(temp)).intValue(); - output.println("flagorand("+generateTemp(fm, temp)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");"); + if (ffan.getTaskType()==FlatFlagActionNode.NEWOBJECT) { + output.println("flagorandinit("+generateTemp(fm, temp)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");"); + } else { + output.println("flagorand("+generateTemp(fm, temp)+", 0x"+Integer.toHexString(ormask)+", 0x"+Integer.toHexString(andmask)+");"); + } } Iterator andit=flagandtable.keySet().iterator(); while(andit.hasNext()) { TempDescriptor temp=(TempDescriptor)andit.next(); int andmask=((Integer)flagandtable.get(temp)).intValue(); - if (!flagortable.containsKey(temp)) - output.println("flagorand("+generateTemp(fm, temp)+", 0, 0x"+Integer.toHexString(andmask)+");"); + if (!flagortable.containsKey(temp)) { + if (ffan.getTaskType()==FlatFlagActionNode.NEWOBJECT) + output.println("flagorandinit("+generateTemp(fm, temp)+", 0, 0x"+Integer.toHexString(andmask)+");"); + else + output.println("flagorand("+generateTemp(fm, temp)+", 0, 0x"+Integer.toHexString(andmask)+");"); + } } } } diff --git a/Robust/src/IR/Flat/BuildFlat.java b/Robust/src/IR/Flat/BuildFlat.java index bce8e4ca..f487915e 100644 --- a/Robust/src/IR/Flat/BuildFlat.java +++ b/Robust/src/IR/Flat/BuildFlat.java @@ -144,15 +144,19 @@ public class BuildFlat { FlatNew fn=new FlatNew(td, out_temp); TempDescriptor[] temps=new TempDescriptor[con.numArgs()]; FlatNode last=fn; - - if (con.getFlagEffects()!=null) { + if (td.getClassDesc().hasFlags()) { + // if (con.getFlagEffects()!=null) { FlatFlagActionNode ffan=new FlatFlagActionNode(FlatFlagActionNode.NEWOBJECT); FlagEffects fes=con.getFlagEffects(); TempDescriptor flagtemp=out_temp; - for(int j=0;j___length___)+sizeof(int))); + sin.sin_addr.s_addr=htonl(*(int *)(((char *)&VAR(___address___)->___length___)+sizeof(int))); do { rc = connect(___fd___, (struct sockaddr *) &sin, sizeof(sin)); } while (rc<0 && errno==EINTR); /* repeat if interrupted */ if (rc<0) goto error; + +#ifdef TASK + //Make non-blocking + fcntl(___fd___, F_SETFD, 1); + fcntl(___fd___, F_SETFL, fcntl(___fd___, F_GETFL)|O_NONBLOCK); + RuntimeHashadd(fdtoobject, ___fd___, (int) VAR(___this___)); + addreadfd(___fd___); +#endif + return 0; error: @@ -39,8 +48,8 @@ int CALL12(___Socket______nativeBind_____AR_B_I, int ___port___, struct ArrayOb struct sockaddr_in sin; bzero(&sin, sizeof(sin)); sin.sin_family= AF_INET; - sin.sin_port=htons(___port___); - sin.sin_addr.s_addr=htonl(*(((char *) &VAR(___address___)->___length___)+sizeof(int))); + sin.sin_port=0; + sin.sin_addr.s_addr=INADDR_ANY; fd=socket(AF_INET, SOCK_STREAM, 0); if (fd<0) { @@ -59,12 +68,6 @@ int CALL12(___Socket______nativeBind_____AR_B_I, int ___port___, struct ArrayOb #endif } -#ifdef TASK - //Make non-blocking - fcntl(fd, F_SETFD, 1); - fcntl(fd, F_SETFL, fcntl(fd, F_GETFL)|O_NONBLOCK); -#endif - rc = bind(fd, (struct sockaddr *) &sin, sizeof(sin)); if (rc<0) goto error; @@ -124,8 +127,9 @@ struct ArrayObject * CALL01(___InetAddress______getHostByName_____AR_B, struct _ bytearray=allocate_newarray(BYTEARRAYTYPE,h->h_length); #endif ((void **)&((&arraybytearray->___length___)[1]))[i]=bytearray; - for(j=0;jh_length;j++) { - ((char *)&((&bytearray->___length___)[1]))[j]=h->h_addr_list[i][j]; + { + int ha=ntohl(*(int *)h->h_addr_list[i]); + (&bytearray->___length___)[1]=ha; } } -- 2.34.1