summaryrefslogtreecommitdiff
path: root/src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java')
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java159
1 files changed, 159 insertions, 0 deletions
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java b/src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java
new file mode 100644
index 0000000000..3e8b658d49
--- /dev/null
+++ b/src/msil/ch/epfl/lamp/compiler/msil/MethodAttributes.java
@@ -0,0 +1,159 @@
+/*
+ * System.Reflection-like API for access to .NET assemblies (DLL & EXE)
+ */
+
+// $Id$
+
+package ch.epfl.lamp.compiler.msil;
+
+/** Specifies flags for method attributes.
+ *
+ * @author Nikolay Mihaylov
+ * @version 1.0
+ */
+public final class MethodAttributes {
+
+ //##########################################################################
+ // Method access attributes
+
+ /** Bitmask used to retrieve accessibility information. */
+ public static final short MemberAccessMask = 0x0007;
+
+ ///** Member not referenceable*/
+ //public static final short CompilerConstrolled = 0x0000;
+
+ /** Indicates that the member cannot be referenced. */
+ public static final short PrivateScope = 0x0000;
+
+ /** Method is accessible only by the current class. */
+ public static final short Private = 0x0001;
+
+ /** Method is accessible to members of this type
+ * and its derived types that are in this assembly only. */
+ public static final short FamANDAssem = 0x0002;
+
+ /** Method is accessible to any class of this assembly. */
+ public static final short Assembly = 0x0003;
+
+ /** Method is accessible only to members of this class
+ * and its derived classes. */
+ public static final short Family = 0x0004;
+
+ /** Method is accessible to derived classes anywhere,
+ * as well as to any class in the assembly. */
+ public static final short FamORAssem = 0x0005;
+
+ /** Method is accessible to any object for which this object is in scope. */
+ public static final short Public = 0x0006;
+
+
+ //##########################################################################
+ // Flags
+
+ /** Method is defined on the type; otherwise, it is defined per instance. */
+ public static final short Static = 0x0010;
+
+ /** Method cannot be overridden. */
+ public static final short Final = 0x0020;
+
+ /** Method is virtual. */
+ public static final short Virtual = 0x0040;
+
+ /** Method hides by name and signature; otherwise, by name only. */
+ public static final short HideBySig = 0x0080;
+
+
+ //##########################################################################
+ // vtable attributes
+
+ /** Bitmask used to retrieve vtable attributes. */
+ public static final short VtableLayoutMask = 0x0100;
+
+ /** Method reuses existing slot in the vtable. */
+ public static final short ReuseSlot = 0x0000;
+
+
+ /** Method always gets a new slot in the vtable. */
+ public static final short NewSlot = 0x0100;
+
+
+ //##########################################################################
+ // Flags
+
+ /** Method does not provide implementation. */
+ public static final short Abstract = 0x0400;
+
+ /** Method is special. */
+ public static final short SpecialName = 0x0800;
+
+
+ //##########################################################################
+ // Interop attributes
+
+ /** Method implementation is forwarded through PInvoke. */
+ public static final short PInvokeImpl = 0x2000;
+
+ /** Reserved: shall be zero for conforming implementations.
+ * Managed method is exported by thunk to unmanaged code. */
+ public static final short UnmanagedExport = 0x0008;
+
+
+ //##########################################################################
+ // Additional flags
+
+ /** CLI provides special behavior, depending on the name of the method. */
+ public static final short RTSpecialName = 0x1000;
+
+ /** Method has security associated with it.
+ * Reserved flag for runtime use only.
+ */
+ public static final short HasSecurity = 0x00000040;
+
+ /**
+ * Indicates that the method calls another method containing security code.
+ * Reserved flag for runtime use only.
+ */
+ public static final short RequireSecObject = 0x00004000;
+
+ /** Indicates a reserved flag for runtime use only. */
+ public static final short ReservedMask = 0x0000;
+
+
+ //##########################################################################
+
+ public static String toString(short attrs) {
+ StringBuffer str = new StringBuffer(accessFlagsToString(attrs));
+ if ((attrs & Static) != 0) str.append(" static");
+ if ((attrs & Final) != 0) str.append(" final");
+ if ((attrs & Virtual) != 0) str.append(" virtual");
+ if ((attrs & Abstract) != 0) str.append(" abstract");
+ if ((attrs & HideBySig) != 0) str.append(" hidebysig");
+ if ((attrs & NewSlot) != 0) str.append(" newslot");
+ if ((attrs & SpecialName) != 0) str.append(" specialname");
+ if ((attrs & PInvokeImpl) != 0) str.append(" pinvokeimpl(?!?)");
+ if ((attrs & RTSpecialName) != 0) str.append(" rtspecialname");
+ return str.toString();
+
+ }
+
+ public static String accessFlagsToString(short attrs) {
+ switch (attrs & MemberAccessMask) {
+ case PrivateScope: return "compilercontrolled";
+ case Private: return "private";
+ case FamANDAssem: return "famandassem";
+ case Assembly: return "assembly";
+ case Family: return "family";
+ case FamORAssem: return "famorassem";
+ case Public: return "public";
+ default: return "xxx";
+ }
+ }
+
+ //##########################################################################
+
+ // makes the class uninstantiable
+ private MethodAttributes() {}
+
+ //##########################################################################
+
+} // class Method Attributes