1 cananian 1.1.2.2 // AccessFlags.java, created Mon Jan 18 22:44:33 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1 package harpoon.IR.RawClass;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 /** 
 7 cananian 1.1.2.1  * Represents a set of method or field access flags, containing
 8 cananian 1.1.2.1  * permissions and properties of a field or method.
 9 cananian 1.1.2.1  *
10 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
11 cananian 1.3      * @version $Id: AccessFlags.java,v 1.3 2002/04/10 03:05:30 cananian Exp $
12 cananian 1.1.2.1  * @see "The Java Virtual Machine Specification"
13 cananian 1.1.2.1  * @see ClassFile
14 cananian 1.1.2.1  * @see FieldInfo
15 cananian 1.1.2.1  * @see MethodInfo
16 cananian 1.1.2.1  */
17 cananian 1.1.2.1 public class AccessFlags {
18 cananian 1.1.2.1   /** May be accessed from outside package. */
19 cananian 1.1.2.1   static final int ACC_PUBLIC  = 0x001;
20 cananian 1.1.2.1   /** Usable only within defining class. */
21 cananian 1.1.2.1   static final int ACC_PRIVATE = 0x002;
22 cananian 1.1.2.1   /** May be accessed withing subclasses. */
23 cananian 1.1.2.1   static final int ACC_PROTECTED=0x004;
24 cananian 1.1.2.1   /** Is static. */
25 cananian 1.1.2.1   static final int ACC_STATIC  = 0x008;
26 cananian 1.1.2.1   /** No further assignment after init. */
27 cananian 1.1.2.1   static final int ACC_FINAL   = 0x010;
28 cananian 1.1.2.1   /** Wrap use in monitor lock. */
29 cananian 1.1.2.1   static final int ACC_SYNCHRON= 0x020;
30 cananian 1.1.2.1   /** Use new superclass semantics. */
31 cananian 1.1.2.1   static final int ACC_SUPER   = 0x020;
32 cananian 1.1.2.1   /** Is volatile; cannot be cached. */
33 cananian 1.1.2.1   static final int ACC_VOLATILE= 0x040;
34 cananian 1.1.2.1   /** Not touched by persistent object manager. */
35 cananian 1.1.2.1   static final int ACC_TRANSIENT=0x080;
36 cananian 1.1.2.1   /** Not implemented in Java. */
37 cananian 1.1.2.1   static final int ACC_NATIVE   =0x100;
38 cananian 1.1.2.1   /** Is an interface. */
39 cananian 1.1.2.1   static final int ACC_INTERFACE=0x200;
40 cananian 1.1.2.1   /** No implementation is provided. */
41 cananian 1.1.2.1   static final int ACC_ABSTRACT =0x400;
42 cananian 1.2.2.1   /** Floating-point mode is FP-strict. */
43 cananian 1.2.2.1   static final int ACC_STRICT   =0x800;
44 cananian 1.1.2.1 
45 cananian 1.1.2.1   public int access_flags;
46 cananian 1.1.2.1 
47 cananian 1.1.2.1   /** Constructor. */
48 cananian 1.1.2.1   public AccessFlags(int flags) {
49 cananian 1.1.2.1     access_flags = flags;
50 cananian 1.1.2.1   }
51 cananian 1.1.2.1   /** Constructor. */
52 cananian 1.1.2.1   public AccessFlags(ClassDataInputStream in) throws java.io.IOException {
53 cananian 1.1.2.1     this(in.read_u2());
54 cananian 1.1.2.1   }
55 cananian 1.1.2.1   /** Write to bytecode file. */
56 cananian 1.1.2.1   public void write(ClassDataOutputStream out) throws java.io.IOException {
57 cananian 1.1.2.1     out.write_u2(access_flags);
58 cananian 1.1.2.1   }
59 cananian 1.1.2.1 
60 cananian 1.1.2.1   public boolean isPublic()   { return (access_flags & ACC_PUBLIC) != 0; }
61 cananian 1.1.2.1   public boolean isPrivate()  { return (access_flags & ACC_PRIVATE) != 0; }
62 cananian 1.1.2.1   public boolean isProtected(){ return (access_flags & ACC_PROTECTED) != 0; }
63 cananian 1.1.2.1   public boolean isStatic()   { return (access_flags & ACC_STATIC) != 0; }
64 cananian 1.1.2.1   public boolean isFinal()    { return (access_flags & ACC_FINAL) != 0; }
65 cananian 1.1.2.1   public boolean isVolatile() { return (access_flags & ACC_VOLATILE) != 0; }
66 cananian 1.1.2.1   public boolean isTransient(){ return (access_flags & ACC_TRANSIENT) != 0; }
67 cananian 1.1.2.1   public boolean isSynchronized(){return(access_flags& ACC_SYNCHRON) != 0; }
68 cananian 1.1.2.1   public boolean isNative()   { return (access_flags & ACC_NATIVE) != 0; }
69 cananian 1.1.2.1   public boolean isAbstract() { return (access_flags & ACC_ABSTRACT) != 0; }
70 cananian 1.1.2.1   public boolean isSuper()    { return (access_flags & ACC_SUPER) != 0; }
71 cananian 1.1.2.1   public boolean isInterface(){ return (access_flags & ACC_INTERFACE) != 0; }
72 cananian 1.2.2.1   public boolean isStrict()   { return (access_flags & ACC_STRICT) != 0; }
73 cananian 1.1.2.1 
74 cananian 1.1.2.1   // ClassFile uses:  PUBLIC, FINAL, SUPER, INTERFACE, ABSTRACT.
75 cananian 1.1.2.1   // FieldInfo uses:  PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL, 
76 cananian 1.1.2.1   //                  VOLATILE, TRANSIENT.
77 cananian 1.1.2.1   // MethodInfo uses: PUBLIC, PRIVATE, PROTECTED, STATIC, FINAL,
78 cananian 1.2.2.1   //                  SYNCHRONIZED, NATIVE, ABSTRACT, STRICT.
79 cananian 1.1.2.1 
80 cananian 1.1.2.1   /**
81 cananian 1.1.2.1    * Returns a string with the access flags in canonical order.
82 cananian 1.1.2.1    * Omits ACC_SUPER and ACC_INTERFACE.
83 cananian 1.1.2.1    */
84 cananian 1.1.2.1   public String toString() {
85 cananian 1.1.2.1     StringBuffer r = new StringBuffer();
86 cananian 1.1.2.1     if (isPublic()) r.append("public ");
87 cananian 1.1.2.1     if (isProtected()) r.append("protected ");
88 cananian 1.1.2.1     if (isPrivate()) r.append("private ");
89 cananian 1.1.2.1     if (isAbstract()) r.append("abstract ");
90 cananian 1.1.2.1     if (isStatic()) r.append("static ");
91 cananian 1.1.2.1     if (isFinal()) r.append("final ");
92 cananian 1.1.2.1     if (isTransient()) r.append("transient ");
93 cananian 1.1.2.1     if (isVolatile()) r.append("volatile ");
94 cananian 1.1.2.1     if (isSynchronized()) r.append("synchronized ");
95 cananian 1.1.2.1     if (isNative()) r.append("native ");
96 cananian 1.2.2.1     if (isStrict()) r.append("strictfp ");
97 cananian 1.1.2.1     return r.toString().trim();
98 cananian 1.1.2.1   }
99 cananian 1.2     }