Charj: migration constructor handling for arrays
authorAaron Becker <akbecker@gmail.com>
Tue, 1 Jun 2010 22:14:40 +0000 (17:14 -0500)
committerAaron Becker <akbecker@gmail.com>
Tue, 1 Jun 2010 22:14:40 +0000 (17:14 -0500)
Note: there are two parts to this. First, identifying array types which
don't have an explicitly defined migration contructor and adding a
default. Second, ensuring that migration constructors are not added to
the interface file regardless of whether they are user-defined or
generated by us.

src/langs/charj/src/charj/translator/AstModifier.java
src/langs/charj/src/charj/translator/CharjASTModifier.g
src/langs/charj/src/charj/translator/CharjEmitter.g
src/langs/charj/src/charj/translator/CharjSemantics.g
src/langs/charj/src/charj/translator/ClassSymbol.java

index 03645a93e4e0ad6097f15bf4e44941eb7992f7e9..270abbb9a3b07b04817a11a65484f5fb7fa83f8d 100644 (file)
@@ -9,6 +9,7 @@ class AstModifier
 {
     private CharjAST pupNode;
     private CharjAST initNode;
+    private CharjAST migrationCtor;
 
     AstModifier()
     {
@@ -253,6 +254,7 @@ class AstModifier
     }
 
     private boolean hasDefaultCtor = false;
+    private boolean hasMigrationCtor = false;
 
     protected void checkForDefaultCtor(CharjAST ctordecl)
     {
@@ -260,16 +262,51 @@ class AstModifier
             return;
 
         CharjAST params = null;
-        for(CharjAST node : ctordecl.getChildren())
+        for(CharjAST node : ctordecl.getChildren()) {
             if(node.getType() == CharjParser.FORMAL_PARAM_LIST)
             {
                 params = node;
                 break;
             }
+        }
         if(params.getChildren() == null)
             hasDefaultCtor = true;
     }
 
+    protected boolean isMigrationCtor(CharjAST ctordecl)
+    {
+        CharjAST params = null;
+        for(CharjAST node : ctordecl.getChildren()) {
+            if(node.getType() == CharjParser.FORMAL_PARAM_LIST)
+            {
+                params = node;
+                break;
+            }
+        }
+        
+        if (params == null || params.getChildren() == null) return false;
+        if (params.getChildren().size() != 1) return false;
+        params = params.getChild(0);
+        if (params == null || params.getType() != CharjParser.FORMAL_PARAM_STD_DECL) return false;
+        params = params.getChild(0);
+        if (params == null || params.getType() != CharjParser.POINTER_TYPE) return false ;
+        params = params.getChild(0);
+        if (params == null || params.getType() != CharjParser.QUALIFIED_TYPE_IDENT) return false;
+        params = params.getChild(0);
+        if (params.toString().equals("CkMigrateMessage")) return true;
+        return false;
+
+    }
+
+    protected void checkForMigrationCtor(CharjAST ctordecl)
+    {
+        if(hasMigrationCtor) return;
+        if (isMigrationCtor(ctordecl)) {
+            hasMigrationCtor = true;
+            migrationCtor = ctordecl;
+        }
+    }
+
     protected void ensureDefaultCtor(CharjAST typenode)
     {
         if(hasDefaultCtor)
@@ -286,4 +323,28 @@ class AstModifier
         typenode.addChild(ctor);
     }
 
+    protected CharjAST ensureMigrationCtor(CharjAST typenode)
+    {
+        if(hasMigrationCtor)
+            return migrationCtor;
+        
+        CharjAST ctor = createNode(CharjParser.CONSTRUCTOR_DECL, "CONSTRUCTOR_DECL");
+        ctor.addChild(createNode(CharjParser.MODIFIER_LIST, "MODIFIER_LIST"));
+        ctor.getChild(0).addChild(createNode(CharjParser.ACCESS_MODIFIER_LIST, "ACCESS_MODIFIER_LIST"));
+        ctor.getChild(0).getChild(0).addChild(createNode(CharjParser.PUBLIC, "public"));
+        ctor.getChild(0).addChild(createNode(CharjParser.CHARJ_MODIFIER_LIST, "CHARJ_MODIFIER_LIST"));
+        ctor.getChild(0).getChild(1).addChild(createNode(CharjParser.ENTRY, "entry"));
+        ctor.addChild(typenode.getChild(1).dupNode());
+        CharjAST args = createNode(CharjParser.FORMAL_PARAM_LIST, "FORMAL_PARAM_LIST");
+        args.addChild(createNode(CharjParser.FORMAL_PARAM_STD_DECL, "FORMAL_PARAM_STD_DECL"));
+        args.getChild(0).addChild(createNode(CharjParser.POINTER_TYPE, "POINTER_TYPE"));
+        args.getChild(0).getChild(0).addChild(createNode(CharjParser.QUALIFIED_TYPE_IDENT, "QUALIFIED_TYPE_IDENT"));
+        args.getChild(0).getChild(0).getChild(0).addChild(createNode(CharjParser.IDENT, "CkMigrateMessage"));
+        args.getChild(0).addChild(createNode(CharjParser.IDENT, "m"));
+        ctor.addChild(args);
+        ctor.addChild(createNode(CharjParser.BLOCK, "BLOCK"));
+        typenode.addChild(ctor);
+        migrationCtor = ctor;
+        return migrationCtor;
+    }
 }
index 29e30e7577da4833e3c6ab8c250596db77aa0d56..24d9a8f1284e7108f64738c634c9c238e5bca863 100644 (file)
@@ -63,23 +63,31 @@ readonlyDeclaration
     ;
 
 typeDeclaration returns [ClassSymbol sym]
-    :   ^(TYPE (CLASS | chareType) IDENT (^('extends' parent=type))? (^('implements' type+))? classScopeDeclaration*)
+@init {
+    boolean array_type = false;
+}
+    :   ^(TYPE (CLASS | (chareType | (chareArrayType { array_type = true; }))) IDENT
+        (^('extends' parent=type))? (^('implements' type+))? classScopeDeclaration*)
         {
             $TYPE.tree.addChild(astmod.getPupRoutineNode());
             $TYPE.tree.addChild(astmod.getInitRoutineNode());
             astmod.ensureDefaultCtor($TYPE.tree);
+            if (array_type) astmod.ensureMigrationCtor($TYPE.tree);
             astmod = new AstModifier();
         }
     |   ^(INTERFACE IDENT (^('extends' type+))?  interfaceScopeDeclaration*)
     |   ^(ENUM IDENT (^('implements' type+))? enumConstant+ classScopeDeclaration*)
     ;
 
+chareArrayType
+    :   ^(CHARE_ARRAY ARRAY_DIMENSION)
+    ;
+
 chareType
     :   CHARE
     |   GROUP
     |   NODEGROUP
     |   MAINCHARE
-    |   ^(CHARE_ARRAY ARRAY_DIMENSION)
     ;
 
 enumConstant
@@ -108,6 +116,7 @@ classScopeDeclaration
             b=block)
         {
             astmod.checkForDefaultCtor($CONSTRUCTOR_DECL);
+            astmod.checkForMigrationCtor($CONSTRUCTOR_DECL);
             if($m.tree == null)
                 astmod.fillPrivateModifier($CONSTRUCTOR_DECL.tree);
         }
index aa392746a5090c3f988ac491c2211b99c3923da4..68d27175099c17ecee0ed19d34be16705f252d8a 100644 (file)
@@ -197,6 +197,7 @@ classScopeDeclaration
 @init
 {
     boolean entry = false;
+    boolean migrationCtor = false;
 }
     :   ^(FUNCTION_METHOD_DECL m=modifierList? g=genericTypeParameterList? 
             ty=type IDENT f=formalParameterList a=arrayDeclaratorList? 
@@ -247,8 +248,10 @@ classScopeDeclaration
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList b=block)
         {
             // determine whether it's an entry method
-            if($m.start != null)
+            if ($m.start != null) {
                 entry = listContainsToken($m.start.getChildren(), CHARJ_MODIFIER_LIST);
+            }
+            migrationCtor = currentClass.migrationCtor == $CONSTRUCTOR_DECL;
         }
         -> {emitCC()}? ctorDecl_cc(
                 modl={$m.st},
@@ -256,7 +259,7 @@ classScopeDeclaration
                 id={$IDENT.text}, 
                 fpl={$f.st}, 
                 block={$b.st})
-        -> {emitCI() && entry}? ctorDecl_ci(
+        -> {emitCI() && entry && !migrationCtor}? ctorDecl_ci(
                 modl={$m.st},
                 gtpl={$g.st}, 
                 id={$IDENT.text}, 
index 60aa19bfdbf7cf0f7060db46c9208760c57b3b18..1906b4f612fc0e712df2424a2528529933d65e0d 100644 (file)
@@ -29,6 +29,7 @@ package charj.translator;
     LocalScope currentLocalScope = null;
     Translator translator;
     List<CharjAST> imports = new ArrayList<CharjAST>();
+    AstModifier astmod = new AstModifier();
 
     /**
      *  Test a list of CharjAST nodes to see if any of them has the given token
@@ -198,6 +199,9 @@ scope ScopeStack;
             ^(VAR_DECLARATOR_LIST field[$objectType.type]+))
     |   ^(CONSTRUCTOR_DECL m=modifierList? g=genericTypeParameterList? IDENT f=formalParameterList 
             b=block)
+        {
+            if (astmod.isMigrationCtor($CONSTRUCTOR_DECL)) currentClass.migrationCtor = $CONSTRUCTOR_DECL;
+        }
     ;
 
 field [ClassSymbol type]
index 7710caa23c51438b6636bfe3df8b00f2a7a2198d..509bdd9a089c54aab5e232e992a899f0f8f717c4 100644 (file)
@@ -23,6 +23,8 @@ public class ClassSymbol extends SymbolWithScope implements Scope {
     public boolean isChare = false;
     public boolean isMainChare = false;
 
+    public CharjAST migrationCtor = null;
+
     public ClassSymbol(
             SymbolTable symtab,
             String name) {