001    /* Copyright 2000, 2001, Compaq Computer Corporation */
002    
003    package escjava.translate;
004    
005    import javafe.util.Assert;
006    import javafe.util.Set;
007    import javafe.util.ErrorSet;
008    import javafe.ast.*;
009    
010    import escjava.ast.*;
011    import escjava.ast.TagConstants;
012    
013    
014    
015    public class Helper {
016    
017      /** Provides support for appropriately handling the 'helper' pragma
018          during translation.
019      **/
020    
021        /* The following decoration lets us cache the fact that a given
022           RoutineDecl is known to be not helper recursive, so that we don't
023           have to recompute this fact.  In particular, the helperDecoration of
024           a RoutineDecl is non-null precisely when the RoutineDecl is known
025           to be not helper recursive.
026           
027           FIXME - this is not currently used, but should be?
028        
029        static {
030            ASTDecoration helperDecoration = 
031                new ASTDecoration("helperDecoration");
032        }
033        */
034    
035    
036        /* Returns true iff the given RoutineDecl has a 'helper' modifier
037           pragma.
038        */
039        public static boolean isHelper(RoutineDecl r) {
040            if (r != null && r.pmodifiers != null) {
041                int pmodSize = r.pmodifiers.size();
042                for (int i = 0; i < pmodSize; i++) {
043                    ModifierPragma mp = r.pmodifiers.elementAt(i);
044                    if (mp.getTag() == TagConstants.HELPER) {
045                        return true;
046                    }
047                }
048            }
049            return false;
050        }
051    
052    
053        // Abort the program because the given RoutineDecl is helper recursive.
054        public static void abort(/*@ non_null */ RoutineDecl rd) {
055            ErrorSet.fatal(rd.locId, "helper routine is recursive");
056        }
057    
058    }