changes and a bug fix
authorbdemsky <bdemsky>
Wed, 25 Jul 2007 19:31:32 +0000 (19:31 +0000)
committerbdemsky <bdemsky>
Wed, 25 Jul 2007 19:31:32 +0000 (19:31 +0000)
12 files changed:
Robust/src/ClassLibrary/Object.java
Robust/src/ClassLibrary/ObjectJava.java
Robust/src/ClassLibrary/ObjectJavaNT.java
Robust/src/IR/FieldDescriptor.java
Robust/src/IR/MethodDescriptor.java
Robust/src/IR/Tree/AtomicNode.java [new file with mode: 0644]
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/CreateObjectNode.java
Robust/src/IR/Tree/Kind.java
Robust/src/IR/Tree/Modifiers.java
Robust/src/Main/Main.java
Robust/src/Parse/java14.cup

index 6fbd8047f4b24f4f44d55f697a1e99aeb175d54d..92971f667856f6d6b941baeeb1f4f74e94491716 100644 (file)
@@ -1,6 +1,6 @@
 public class Object {
     public native int nativehashCode();
-    private int cachedCode;
+    private int cachedCode;//first field has to be a primitive
     private boolean cachedHash;
 
     /* DO NOT USE ANY OF THESE - THEY ARE FOR IMPLEMENTING TAGS */
index 82b1ef68cc4894891c86049a89b6b627d5c7aa23..0ef8f296cfdb45b32401da626a08d357cf94a492 100644 (file)
@@ -1,5 +1,5 @@
 public class Object {
-    public int cachedCode;
+    public int cachedCode; //first field has to be a primitive
     public boolean cachedHash;
 
     public native int nativehashCode();
index 57b504652febfcfdf2f0b9341f2167814eb6528e..ef808ae963fc4043c550ec0deb01fbc469d04f66 100644 (file)
@@ -1,8 +1,9 @@
 public class Object {
-    public int cachedCode;
+    public int cachedCode; //first field has to be a primitive
     public boolean cachedHash;
 
     public native int nativehashCode();
+    public Object foo;
 
     public int hashCode() {
        if (!cachedHash) {
index 883147d84df3dd7ee602c701b0ed585cf8e76a54..a74e6917562402b3fa16f07376e1f0df54a96871 100644 (file)
@@ -10,23 +10,29 @@ import IR.Tree.ExpressionNode;
 
 public class FieldDescriptor extends Descriptor {
 
-    public static FieldDescriptor arrayLength=new FieldDescriptor(new Modifiers(Modifiers.PUBLIC|Modifiers.FINAL), new TypeDescriptor(TypeDescriptor.INT), "length", null);
+    public static FieldDescriptor arrayLength=new FieldDescriptor(new Modifiers(Modifiers.PUBLIC|Modifiers.FINAL), new TypeDescriptor(TypeDescriptor.INT), "length", null, false);
 
     protected Modifiers modifier;
     protected TypeDescriptor td;
     protected String identifier;
     protected ExpressionNode en;
-    
-    public FieldDescriptor(Modifiers m, TypeDescriptor t, String identifier, ExpressionNode e) {
+    private boolean isglobal;
+
+    public FieldDescriptor(Modifiers m, TypeDescriptor t, String identifier, ExpressionNode e, boolean isglobal) {
        super(identifier);
        this.modifier=m;
        this.td=t;
        this.en=e;
         this.safename = "___" + name + "___";
        this.uniqueid=count++;
+       this.isglobal=isglobal;
        if (en!=null) throw new Error("Field initializers not implemented");
     }
 
+    public boolean isGlobal() {
+       return isglobal;
+    }
+
     public TypeDescriptor getType() {
        return td;
     }
index 2360aae9f1e8bc84b2a8a8085595a85ae4ffb0b0..79056252263b2468a6c773fde70d2547db2fcbcc 100644 (file)
@@ -18,7 +18,7 @@ public class MethodDescriptor extends Descriptor {
     protected SymbolTable paramtable;
     protected ClassDescriptor cd;
     protected VarDescriptor thisvd;
-
+    protected boolean isglobal;
 
     public MethodDescriptor(Modifiers m, TypeDescriptor rt, String identifier) {
        super(identifier);
@@ -54,7 +54,12 @@ public class MethodDescriptor extends Descriptor {
     }
 
     public MethodDescriptor(Modifiers m, String identifier) {
+       this(m, identifier, false);
+    }
+
+    public MethodDescriptor(Modifiers m, String identifier, boolean isglobal) {
        super(identifier);
+       this.isglobal=isglobal;
        this.modifier=m;
        this.returntype=null;
        this.identifier=identifier;
diff --git a/Robust/src/IR/Tree/AtomicNode.java b/Robust/src/IR/Tree/AtomicNode.java
new file mode 100644 (file)
index 0000000..465bb2c
--- /dev/null
@@ -0,0 +1,20 @@
+package IR.Tree;
+
+public class AtomicNode extends BlockStatementNode {
+    BlockNode bn;
+    public AtomicNode(BlockNode bn) {
+        this.bn=bn;
+    }
+    
+    public String printNode(int indent) {
+        return printSpace(indent)+"atomic {\n"+bn.printNode(indent)+"\n"+printSpace(indent)+"}";
+    }
+
+    public BlockNode getBlockNode() {
+        return bn;
+    }
+
+    public int kind() {
+        return Kind.AtomicNode;
+    }
+}
index 6fa0cd6ef762cf7ed8b3901ab33fd03c9b1d380c..5f17f23b48a873f82698d42bf4bbdc89fc1659af 100644 (file)
@@ -329,10 +329,10 @@ public class BuildIR {
        TypeDescriptor t=parseTypeDescriptor(tn);
        ParseNode vn=pn.getChild("variables").getChild("variable_declarators_list");
        ParseNodeVector pnv=vn.getChildren();
+       boolean isglobal=pn.getChild("global")!=null;
+
        for(int i=0;i<pnv.size();i++) {
            ParseNode vardecl=pnv.elementAt(i);
-
-           
            ParseNode tmp=vardecl;
            TypeDescriptor arrayt=t;
            while (tmp.getChild("single")==null) {
@@ -340,16 +340,14 @@ public class BuildIR {
                tmp=tmp.getChild("array");
            }
            String identifier=tmp.getChild("single").getTerminal();
-
            ParseNode epn=vardecl.getChild("initializer");
-           
+
            ExpressionNode en=null;
            if (epn!=null)
                en=parseExpression(epn.getFirstChild());
   
-           cn.addField(new FieldDescriptor(m,arrayt,identifier, en));
+           cn.addField(new FieldDescriptor(m, arrayt, identifier, en, isglobal));
        }
-       
     }
 
     private ExpressionNode parseExpression(ParseNode pn) {
@@ -395,7 +393,8 @@ public class BuildIR {
        } else if (isNode(pn,"createobject")) {
            TypeDescriptor td=parseTypeDescriptor(pn);
            Vector args=parseArgumentList(pn);
-           CreateObjectNode con=new CreateObjectNode(td);
+           boolean isglobal=pn.getChild("global")!=null;
+           CreateObjectNode con=new CreateObjectNode(td, isglobal);
            for(int i=0;i<args.size();i++) {
                con.addArgument((ExpressionNode)args.get(i));
            }
@@ -413,6 +412,7 @@ public class BuildIR {
            return con;
        } else if (isNode(pn,"createarray")) {
            //System.out.println(pn.PPrint(3,true));
+           boolean isglobal=pn.getChild("createarray")!=null;
            TypeDescriptor td=parseTypeDescriptor(pn);
            Vector args=parseDimExprs(pn);
            int num=0;
@@ -420,7 +420,7 @@ public class BuildIR {
                num=((Integer)pn.getChild("dims_opt").getLiteral()).intValue();
            for(int i=0;i<(args.size()+num);i++)
                td=td.makeArray(state);
-           CreateObjectNode con=new CreateObjectNode(td);
+           CreateObjectNode con=new CreateObjectNode(td, isglobal);
            for(int i=0;i<args.size();i++) {
                con.addArgument((ExpressionNode)args.get(i));
            }
@@ -529,8 +529,9 @@ public class BuildIR {
        ParseNode mn=pn.getChild("modifiers");
        Modifiers m=parseModifiersList(mn);
        ParseNode cdecl=pn.getChild("constructor_declarator");
+       boolean isglobal=cdecl.getChild("global")!=null;
        String name=cdecl.getChild("name").getChild("identifier").getTerminal();
-       MethodDescriptor md=new MethodDescriptor(m, name);
+       MethodDescriptor md=new MethodDescriptor(m, name, isglobal);
        ParseNode paramnode=cdecl.getChild("parameters");
        parseParameterList(md,paramnode);
        ParseNode bodyn0=pn.getChild("body");
@@ -618,6 +619,9 @@ public class BuildIR {
                ccs=parseChecks(pn.getChild("cons_checks"));
            
            blockstatements.add(new TaskExitNode(vfe, ccs));
+       } else if (isNode(pn,"atomic")) {
+           BlockNode bn=parseBlockHelper(pn);
+           blockstatements.add(new AtomicNode(bn));
        } else if (isNode(pn,"return")) {
            if (isEmpty(pn.getTerminal()))
                blockstatements.add(new ReturnNode());
@@ -728,6 +732,8 @@ public class BuildIR {
                    m.addModifier(Modifiers.NATIVE);
                else if (isNode(modn,"synchronized"))
                    m.addModifier(Modifiers.SYNCHRONIZED);
+               else if (isNode(modn,"atomic"))
+                   m.addModifier(Modifiers.ATOMIC);
                else throw new Error("Unrecognized Modifier");
            }
        }
index 6cbb9bf9bb543130f73a233d55a1977dd8d0595b..5f19aae22d775ffe69eb72550d02963146a6d35b 100644 (file)
@@ -8,10 +8,16 @@ public class CreateObjectNode extends ExpressionNode {
     Vector argumentlist;
     MethodDescriptor md;
     FlagEffects fe;
+    boolean isglobal;
 
-    public CreateObjectNode(TypeDescriptor type) {
+    public CreateObjectNode(TypeDescriptor type, boolean isglobal) {
        td=type;
        argumentlist=new Vector();
+       this.isglobal=isglobal;
+    }
+
+    public boolean isGlobal() {
+       return isglobal;
     }
 
     public void addFlagEffects(FlagEffects fe) {
index 930317f5a3bdb967a650119ca00aa7ac66665526..a8e902ff0bd4428ecc0061cc4061e909836eadb5 100644 (file)
@@ -21,4 +21,5 @@ public class Kind {
     public final static int FlagOpNode=18;
     public final static int TaskExitNode=19;
     public final static int TagDeclarationNode=20;
+    public final static int AtomicNode=21;
 }
index d20c7962005ec485131c8c504b3d8fd95dafce2b..d4270d8d5cdbf92ecf25d8cdd4b6e53254112fbb 100644 (file)
@@ -9,6 +9,7 @@ public class Modifiers {
     public static final int FINAL=32;
     public static final int NATIVE=64;
     public static final int SYNCHRONIZED=128;
+    public static final int ATOMIC=2048;
 //     TRANSIENT=256
 //     VOLATILE=512
 //     STRICTFP=1024
@@ -29,6 +30,10 @@ public class Modifiers {
            throw new Error("Synchronized native methods are not supported");
     }
 
+    public boolean isAtomic() {
+       return ((value&ATOMIC)!=0);
+    }
+
     public boolean isSynchronized() {
        return ((value&SYNCHRONIZED)!=0);
     }
@@ -57,6 +62,8 @@ public class Modifiers {
            st+="native ";
        if ((value&SYNCHRONIZED)!=0)
            st+="synchronized ";
+       if ((value&ATOMIC)!=0)
+           st+="atomic ";
        return st;
     }
 }
index d92cc1c5bbe158fa9a0c92354d63a549464c14af..46f780b6a22618f9443adabdd328c16f9999cd97 100644 (file)
@@ -87,12 +87,17 @@ public class Main {
       readSourceFile(state, ClassLibraryPrefix+"File.java");
       readSourceFile(state, ClassLibraryPrefix+"InetAddress.java");
 
-      if (state.THREAD) {
-         readSourceFile(state, ClassLibraryPrefix+"Thread.java");
-         readSourceFile(state, ClassLibraryPrefix+"ObjectJava.java");
-      } else {
+
+
+      if (state.TASK) {
          readSourceFile(state, ClassLibraryPrefix+"Object.java");
          readSourceFile(state, ClassLibraryPrefix+"TagDescriptor.java");
+      } else {
+         if (state.THREAD) {
+             readSourceFile(state, ClassLibraryPrefix+"Thread.java");
+             readSourceFile(state, ClassLibraryPrefix+"ObjectJava.java");
+         } else
+             readSourceFile(state, ClassLibraryPrefix+"ObjectJavaNT.java");
       }
 
       if (state.TASK) {
index 4514bf9bfb7fc0317067f543e116f288dea737af..07bfd1ec238d34063276b5fa94e5a3be9aa8df20 100644 (file)
@@ -961,6 +961,16 @@ constructor_declaration ::=
                pn.addChild(cd);
                pn.addChild("body").addChild(body);
                RESULT=pn;
+       :} |
+               modifiers_opt:mo GLOBAL constructor_declarator:cd
+//throws_opt 
+                       constructor_body:body   {:
+               ParseNode pn=new ParseNode("constructor_declaration");
+               pn.addChild("global");
+               pn.addChild("modifiers").addChild(mo);
+               pn.addChild(cd);
+               pn.addChild("body").addChild(body);
+               RESULT=pn;
        :}
        ;
 constructor_declarator ::=
@@ -1363,10 +1373,10 @@ class_instance_creation_expression ::=
        //Global object
        | GLOBAL NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN flag_list_opt:feo {: 
                ParseNode pn=new ParseNode("createobject");
-               pn.addChild("global");
                pn.addChild(type);
                pn.addChild(args);
                pn.addChild(feo);
+               pn.addChild("global");
                RESULT=pn;
        :}
        | NEW class_or_interface_type:type LPAREN argument_list_opt:args RPAREN LBRACE RBRACE LBRACE tag_list:tl RBRACE {: 
@@ -1450,6 +1460,22 @@ array_creation_uninit ::=
                pn.addChild("dims_opt").setLiteral(dims);
                RESULT=pn;
        :}
+       |       NEW GLOBAL primitive_type:type dim_exprs:dimexpr dims_opt:dims {: 
+               ParseNode pn=new ParseNode("createarray");
+               pn.addChild(type);
+               pn.addChild(dimexpr);
+               pn.addChild("dims_opt").setLiteral(dims);
+               pn.addChild("global");
+               RESULT=pn;
+               :}
+       |       NEW GLOBAL class_or_interface_type:type dim_exprs:dimexpr dims_opt:dims {: 
+               ParseNode pn=new ParseNode("createarray");
+               pn.addChild(type);
+               pn.addChild(dimexpr);
+               pn.addChild("dims_opt").setLiteral(dims);
+               pn.addChild("global");
+               RESULT=pn;
+       :}
        ;
 //array_creation_init ::=
 //             NEW primitive_type dims array_initializer