Outgoing socket I/O
authorbdemsky <bdemsky>
Tue, 13 Mar 2007 02:47:18 +0000 (02:47 +0000)
committerbdemsky <bdemsky>
Tue, 13 Mar 2007 02:47:18 +0000 (02:47 +0000)
WebSpide

15 files changed:
Robust/src/ClassLibrary/Socket.java
Robust/src/ClassLibrary/String.java
Robust/src/ClassLibrary/StringBuffer.java
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/Flat/BuildFlat.java
Robust/src/IR/Flat/FlatFlagActionNode.java
Robust/src/IR/Flat/FlatLiteralNode.java
Robust/src/IR/Flat/TempFlagPair.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Main/Main.java
Robust/src/Parse/java14.cup
Robust/src/Runtime/runtime.c
Robust/src/Runtime/runtime.h
Robust/src/Runtime/socket.c

index ddfc8a9bf817b85b07f3ed81e583a7fdeaeee8ba..72b76f6422fd7c06f037c93a273d88e933ca98a2 100644 (file)
@@ -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;
index 95d85b229b439f5ff3b562989dcdc04c06a7b9d8..13798ff0bce81687d400ac2aaf831adb25d9965e 100644 (file)
@@ -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);
     }
index b06fd7066132cc2a4dbf6e210bcfe9bef1fd2a50..02bb8a36d567245fcd592037c533a0180780c388 100644 (file)
@@ -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;
     }
index c471cb2fd2fb9f0b00c453cb3324e47cadf04a7b..cd726b7e83326611ca6b729ce9cb67c442fba852 100644 (file)
@@ -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)+");");
+           }
        }
     }
 }
index bce8e4ca4980cab91d54a0bbb5abd70b122c0054..f487915ee77360b9e0842270f669ad2b47745bdf 100644 (file)
@@ -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<fes.numEffects();j++) {
-                   FlagEffect fe=fes.getEffect(j);
-                   ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
-               }
+               if (fes!=null)
+                   for(int j=0;j<fes.numEffects();j++) {
+                       FlagEffect fe=fes.getEffect(j);
+                       ffan.addFlagAction(flagtemp, fe.getFlag(), fe.getStatus());
+                   } else {
+                       ffan.addFlagAction(flagtemp, null, false);
+                   }
+               
                last.addNext(ffan);
                last=ffan;
            }
index 3e52f59848bfd2d2e52f91f3a131163353eada1f..f546517bff97f9135be7dfd414f5befc7535a56f 100644 (file)
@@ -17,6 +17,10 @@ public class FlatFlagActionNode extends FlatNode {
        this.taskexit=taskexit;
     }
 
+    public int getTaskType() {
+       return taskexit;
+    }
+
     public void addFlagAction(TempDescriptor td, FlagDescriptor fd, boolean status) {
        TempFlagPair tfp=new TempFlagPair(td,fd);
        if (tempflagpairs.containsKey(tfp)) {
index 60595435036aab1ba6767197f5c639f013081867..93b814b41e311ec810fb420e9656c9275927c96b 100644 (file)
@@ -39,7 +39,7 @@ public class FlatLiteralNode extends FlatNode {
            else if (x=='\r')
                new_st+="\\r";
            else if (x=='"')
-               new_st+="'"+'"'+"'";
+               new_st+="\\\"";
            else new_st+=x;
        }
        return new_st;
index 81edcefc76162a1497564165ff2944fc22c2a436..21915d2c568a39b4394a8cf623b79968552e3896 100644 (file)
@@ -10,7 +10,10 @@ public class TempFlagPair {
        this.td=td;
     }
     public int hashCode() {
-       return fd.hashCode()^td.hashCode();
+       if (fd!=null)
+           return fd.hashCode()^td.hashCode();
+       else
+           return td.hashCode();
     }
 
     public TempDescriptor getTemp() {
index fbea5fcef34e8599a7187a5e338cf4c62ebd3c46..f2525acd6afde350ffb2f5663b02ad8ce15dc78b 100644 (file)
@@ -595,7 +595,7 @@ public class BuildIR {
            ExpressionNode condition=parseExpression(pn.getChild("condition").getFirstChild());
            BlockNode body=parseSingleBlock(pn.getChild("statement").getFirstChild());
            blockstatements.add(new LoopNode(condition,body,LoopNode.DOWHILELOOP));
-       } else {
+       } else {
            System.out.println("---------------");
            System.out.println(pn.PPrint(3,true));
            throw new Error();
index 5cd747f7778d0b7a2991579ffa733b1a28b50d7e..e8fb8899499697ba7e0b6f8f3f12e3ec87da5229 100644 (file)
@@ -367,7 +367,7 @@ public class SemanticCheck {
        else
            fd=(FieldDescriptor) ltd.getClassDesc().getFieldTable().get(fieldname);
        if (fd==null)
-           throw new Error("Unknown field "+fieldname);
+           throw new Error("Unknown field "+fieldname + " in "+fan.printNode(0));
        fan.setField(fd);
        if (td!=null)
            if (!typeutil.isSuperorType(td,fan.getType()))
index 4afed2566000e01be33991ed197a10efaa2253ac..2b63b41c0b035fc4bbf8632af5845ac34cfce603 100644 (file)
@@ -109,7 +109,14 @@ public class Main {
        Lex.Lexer l = new Lex.Lexer(fr);
        java_cup.runtime.lr_parser g;
        g = new Parse.Parser(l);
-       ParseNode p=(ParseNode) g./*debug_*/parse().value;
+       ParseNode p=null;
+       try {
+           p=(ParseNode) g./*debug_*/parse().value;
+       } catch (Exception e) {
+           System.err.println("Error parsing file:"+sourcefile);
+           e.printStackTrace();
+           System.exit(-1);
+       }
        state.addParseNode(p);
        if (l.numErrors()!=0) {
            System.out.println("Error parsing "+sourcefile);
index 68773750e3f303b80f5cf4563d899f9ee8863f50..6d20085555d858de7a482553b82f7d940e987bb3 100644 (file)
@@ -368,7 +368,9 @@ flag_effect ::= IDENTIFIER:id LBRACE flag_list:fl RBRACE {:
        :};
 
 flag_list_opt ::= LBRACE flag_list:fl RBRACE {:RESULT=fl;:}
-       | {: RESULT = new ParseNode("empty"); :}
+       | LBRACE RBRACE {: RESULT = new ParseNode("empty"); :}  
+       | 
+       {: RESULT = new ParseNode("empty"); :}
        ;
 
 flag_list ::= flag_change:fc {: 
index cf8a64ead7bed73b571edd2acaeab2c408cd4a98..7a7de4651e0a0a47c67a27cd4251fe6cd417a054 100644 (file)
@@ -124,11 +124,22 @@ int comparetpd(struct taskparamdescriptor *ftd1, struct taskparamdescriptor *ftd
 
 void flagorand(void * ptr, int ormask, int andmask) {
   int oldflag=((int *)ptr)[1];
-  struct RuntimeHash *flagptr=(struct RuntimeHash *)(((int*)ptr)[2]);
   int flag=ormask|oldflag;
   flag&=andmask;
   if (flag==oldflag) /* Don't do anything */
     return;
+  else flagbody(ptr, flag);
+}
+
+void flagorandinit(void * ptr, int ormask, int andmask) {
+  int oldflag=((int *)ptr)[1];
+  int flag=ormask|oldflag;
+  flag&=andmask;
+  flagbody(ptr,flag);
+}
+
+void flagbody(void *ptr, int flag) {
+  struct RuntimeHash *flagptr=(struct RuntimeHash *)(((int*)ptr)[2]);
   ((int*)ptr)[1]=flag;
 
   /*Remove object from all queues */
index 5dd0fe6c198257c572b45ad8c66bcf28b39e5696..3141f83cb674e9128db83320f8553e49f0e71b50 100644 (file)
@@ -29,8 +29,8 @@ void createstartupobject();
 #define CALL02(name, alt1, alt2) name(struct name ## _params * ___params___)
 #define CALL11(name,rest, alt) name(struct name ## _params * ___params___, rest)
 #define CALL12(name,rest, alt1, alt2) name(struct name ## _params * ___params___, rest)
-#define CALL21(name,rest, rest2, alt) name(struct name ## _params * ___params___, rest, rest2)
 #define CALL23(name, rest, rest2, alt1, alt2, alt3) name(struct name ## _params * ___params___, rest, rest2)
+#define CALL24(name, rest, rest2, alt1, alt2, alt3, alt4) name(struct name ## _params * ___params___, rest, rest2)
 #else
 #define VAR(name) name
 #define CALL00(name) name()
@@ -38,14 +38,16 @@ void createstartupobject();
 #define CALL02(name, alt1, alt2) name(alt1, alt2)
 #define CALL11(name,rest, alt) name(alt)
 #define CALL12(name,rest, alt1, alt2) name(alt1, alt2)
-#define CALL21(name,rest, rest2, alt) name(alt)
 #define CALL23(name, rest, rest2, alt1, alt2, alt3) name(alt1, alt2, alt3)
+#define CALL24(name, rest, rest2, alt1, alt2, alt3, alt4) name(alt1, alt2, alt3, alt4)
 #endif
 
 #ifdef TASK
 #include "SimpleHash.h"
 #include "task.h"
 void flagorand(void * ptr, int ormask, int andmask);
+void flagorandinit(void * ptr, int ormask, int andmask);
+void flagbody(void *ptr, int flag);
 void executetasks();
 void processtasks();
 
index 17e189c62f8c5d3cc56099ab5f46e7349528871d..360db1329c47bbbda8ce7810f02c95c8be97a139 100644 (file)
 
 extern struct RuntimeHash *fdtoobject;
 
-int CALL23(___Socket______nativeConnect____I__AR_B_I, int ___fd___, int ___port___, int ___fd___, struct ArrayObject * ___address___ ,int ___port___) {
+int CALL24(___Socket______nativeConnect____I__AR_B_I, int ___fd___, int ___port___, struct ___Socket___ * ___this___, int ___fd___, struct ArrayObject * ___address___ ,int ___port___) {
   struct sockaddr_in sin;
   int rc;
   
   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_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;j<h->h_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;
     }
   }