support no flag parameters
authorbdemsky <bdemsky>
Mon, 21 May 2007 22:02:28 +0000 (22:02 +0000)
committerbdemsky <bdemsky>
Mon, 21 May 2007 22:02:28 +0000 (22:02 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/IR/TaskDescriptor.java
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/SemanticCheck.java
Robust/src/Parse/java14.cup

index 7e249e1661c2ced0c284257347a9ae4df04dec64..ed2f50f2d6cd3bac4a31c87e147bb059115b0035 100644 (file)
@@ -405,28 +405,37 @@ public class BuildCode {
            FlagExpressionNode param_flag=task.getFlag(param_var);
            TagExpressionList param_tag=task.getTag(param_var);
 
-           DNFFlag dflag=param_flag.getDNF();
-           
-           Hashtable flags=(Hashtable)flagorder.get(param_type.getClassDesc());
-           output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
-           for(int j=0;j<dflag.size();j++) {
-               if (j!=0)
-                   output.println(",");
-               Vector term=dflag.get(j);
-               int andmask=0;
-               int checkmask=0;
-               for(int k=0;k<term.size();k++) {
-                   DNFFlagAtom dfa=(DNFFlagAtom)term.get(k);
-                   FlagDescriptor fd=dfa.getFlag();
-                   boolean negated=dfa.getNegated();
-                   int flagid=1<<((Integer)flags.get(fd)).intValue();
-                   andmask|=flagid;
-                   if (!negated)
-                       checkmask|=flagid;
+           int dnfterms;
+           if (param_flag==null) {
+               output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
+               output.println("0x0, 0x0 };");
+               dnfterms=1;
+           } else {
+
+               DNFFlag dflag=param_flag.getDNF();
+               dnfterms=dflag.size();
+               
+               Hashtable flags=(Hashtable)flagorder.get(param_type.getClassDesc());
+               output.println("int parameterdnf_"+i+"_"+task.getSafeSymbol()+"[]={");
+               for(int j=0;j<dflag.size();j++) {
+                   if (j!=0)
+                       output.println(",");
+                   Vector term=dflag.get(j);
+                   int andmask=0;
+                   int checkmask=0;
+                   for(int k=0;k<term.size();k++) {
+                       DNFFlagAtom dfa=(DNFFlagAtom)term.get(k);
+                       FlagDescriptor fd=dfa.getFlag();
+                       boolean negated=dfa.getNegated();
+                       int flagid=1<<((Integer)flags.get(fd)).intValue();
+                       andmask|=flagid;
+                       if (!negated)
+                           checkmask|=flagid;
+                   }
+                   output.print("0x"+Integer.toHexString(andmask)+", 0x"+Integer.toHexString(checkmask));
                }
-               output.print("0x"+Integer.toHexString(andmask)+", 0x"+Integer.toHexString(checkmask));
+               output.println("};");
            }
-           output.println("};");
 
            output.println("int parametertag_"+i+"_"+task.getSafeSymbol()+"[]={");
            //BUG...added next line to fix, test with any task program
@@ -446,7 +455,7 @@ public class BuildCode {
 
            output.println("struct parameterdescriptor parameter_"+i+"_"+task.getSafeSymbol()+"={");
            output.println("/* type */"+param_type.getClassDesc().getId()+",");
-           output.println("/* number of DNF terms */"+dflag.size()+",");
+           output.println("/* number of DNF terms */"+dnfterms+",");
            output.println("parameterdnf_"+i+"_"+task.getSafeSymbol()+",");
            output.println("0,");
            //BUG, added next line to fix and else statement...test
index 33935f6d6a3720c87e3af26a61397772b3189e21..1fa23b89136128835f371da069982cdc41b876e7 100644 (file)
@@ -47,7 +47,8 @@ public class TaskDescriptor extends Descriptor {
            throw new Error("Can't have parameter named this");
        VarDescriptor vd=new VarDescriptor(type, paramname);
        params.add(vd);
-       flagstable.put(vd, fen);
+       if (fen!=null)
+           flagstable.put(vd, fen);
        if (tel!=null) {//BUGFIX - added null check here...test with any bristlecone program
            tagstable.put(vd, tel);
            for(int i=0;i<tel.numTags();i++) {
index 33335983eb84549982bfa8b6c0b035123bb33a50..4f8a0aa61295092ab67f457e59158f045da9dd61 100644 (file)
@@ -176,7 +176,9 @@ public class BuildIR {
             TypeDescriptor type=parseTypeDescriptor(paramn);
 
             String paramname=paramn.getChild("single").getTerminal();
-            FlagExpressionNode fen=parseFlagExpression(paramn.getChild("flag").getFirstChild());
+            FlagExpressionNode fen=null;
+            if (paramn.getChild("flag")!=null)
+                fen=parseFlagExpression(paramn.getChild("flag").getFirstChild());
 
             ParseNode tagnode=paramn.getChild("tag");
 
index a47be0fbd684f42a21192841c58d068c7d52a642..d9b21abe8efbbb73379eb0e02eb547cd93b3ea8b 100644 (file)
@@ -147,7 +147,8 @@ public class SemanticCheck {
            if (!param_type.isClass())
                throw new Error("Cannot have non-object argument to a task");
            ClassDescriptor cd=param_type.getClassDesc();
-           checkFlagExpressionNode(cd, fen);
+           if (fen!=null)
+               checkFlagExpressionNode(cd, fen);
        }
 
        checkFlagEffects(td, td.getFlagEffects(),td.getParameterTable());
index 357ee8dbc376046bf4379ac265706129e1cb8068..d8121536d3a90df9603fb393fab9b7caddf39ec5 100644 (file)
@@ -296,6 +296,13 @@ task_parameter ::=
                pn.addChild("tag").addChild(texp);
                RESULT=pn;
        :}
+        | type:type variable_declarator_id:name LBRACE RBRACE LBRACE tag_expression_list:texp RBRACE {:
+               ParseNode pn=new ParseNode("task_parameter");
+               pn.addChild(type);
+               pn.addChild(name);
+               pn.addChild("tag").addChild(texp);
+               RESULT=pn;
+       :}
        ;
 
 tag_expression_list ::= tag_expression:te {: