internal static JavaClass CreateInnerClass(JavaClass outerClass, string innerName, JavaAccessFlags innerFlags = 0, bool markGenericEntity = false) { if (innerFlags == 0) { innerFlags = JavaAccessFlags.ACC_PUBLIC | JavaAccessFlags.ACC_FINAL | JavaAccessFlags.ACC_SUPER; } innerFlags |= JavaAccessFlags.ACC_SYNTHETIC; var innerClass = new JavaClass(); innerClass.Name = innerName; innerClass.Super = JavaType.ObjectType.ClassName; innerClass.PackageNameLength = outerClass.PackageNameLength; innerClass.Flags = innerFlags; innerClass.Fields = new List <JavaField>(); innerClass.Methods = new List <JavaMethod>(); if (markGenericEntity) { innerClass.AddInterface("system.IGenericEntity"); } outerClass.AddInnerClass(innerClass); return(innerClass); }
/* * JavaFieldReader */ public JavaField(JavaReader rdr) { Class = rdr.Class; Flags = (JavaAccessFlags)rdr.Read16(); Name = rdr.ConstUtf8(rdr.Read16()); rdr.Where.Push($"field '{Name}'"); Type = new JavaType(rdr.ConstUtf8(rdr.Read16()), rdr.Where); var attributes = new JavaAttributeSet(rdr); if ((Flags & JavaAccessFlags.ACC_STATIC) != 0) { var constAttr = attributes.GetAttr <JavaAttribute.ConstantValue>(); if (constAttr != null) { InitConstant(constAttr.value, rdr.Where); } } rdr.Where.Pop(); }
static void PrintClassPrefix(IndentedText txt, JavaAccessFlags Flags, string Name) { if (Name == "interface") { Name = '\"' + Name + '\"'; } txt.Write("/* {0:X} */ {1}{2}{3}{4}{5} {6}", /* 0 */ ((ushort)Flags).ToString("X4"), /* 1 */ ((Flags & JavaAccessFlags.ACC_PUBLIC) != 0 ? "public " : string.Empty), /* 2 */ ((Flags & JavaAccessFlags.ACC_ABSTRACT) != 0 ? "abstract " : string.Empty), /* 3 */ ((Flags & JavaAccessFlags.ACC_STATIC) != 0 ? "static " : string.Empty), /* 4 */ ((Flags & JavaAccessFlags.ACC_FINAL) != 0 ? "final " : string.Empty), /* 5 */ ((Flags & JavaAccessFlags.ACC_INTERFACE) != 0 ? "interface" : ((Flags & JavaAccessFlags.ACC_ENUM) != 0 ? "enum" : "class")), /* 6 */ Name); }
static JavaAccessFlags AttributesToAccessFlags(MethodAttributes attrs, bool hasOverrides, bool hasInnerOrIsGeneric) { var attrs0 = attrs; JavaAccessFlags flags = 0; var methodAccessMask = attrs & MethodAttributes.MemberAccessMask; attrs &= ~MethodAttributes.MemberAccessMask; if (hasOverrides) { // explicit interface implementation is private in cil, // but must be made public callable in the jvm flags |= JavaAccessFlags.ACC_PUBLIC; } else { switch (methodAccessMask) { case MethodAttributes.Private: // .Net nested types can access private methods of parent type, // to emulate this in Java we use the default access modifier // of package-private, rather than ACC_PRIVATE if (!hasInnerOrIsGeneric) { flags |= JavaAccessFlags.ACC_PRIVATE; } break; case MethodAttributes.Family: case MethodAttributes.FamANDAssem: flags |= JavaAccessFlags.ACC_PROTECTED; break; case MethodAttributes.Assembly: case MethodAttributes.FamORAssem: // an assembly can include more than one package namespace default: flags |= JavaAccessFlags.ACC_PUBLIC; break; } } if ((attrs & MethodAttributes.Static) != 0) { flags |= JavaAccessFlags.ACC_STATIC; attrs &= ~MethodAttributes.Static; } if ((attrs & MethodAttributes.PInvokeImpl) != 0) { // note that an extern (PInvoke) method would not have a body, // so ImportMethods would set ACC_ABSTRACT and clear ACC_STATIC attrs &= ~MethodAttributes.PInvokeImpl; } attrs &= ~(MethodAttributes.Final | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.HideBySig | MethodAttributes.Abstract | MethodAttributes.CheckAccessOnOverride | MethodAttributes.SpecialName | MethodAttributes.RTSpecialName | MethodAttributes.HasSecurity | MethodAttributes.RequireSecObject); if (attrs != 0) { throw CilMain.Where.Exception($"unrecognized attributes {attrs0:X}"); } return(flags); }
static JavaAccessFlags AttributesToAccessFlags(FieldAttributes attrs, bool hasInnerOrIsGeneric) { var attrs0 = attrs; JavaAccessFlags flags = 0; var fieldAccessMask = attrs & FieldAttributes.FieldAccessMask; attrs &= ~FieldAttributes.FieldAccessMask; switch (fieldAccessMask) { case FieldAttributes.Private: // .Net nested types can access private fields of parent type, // to emulate this in Java we use the default access modifier // of package-private, rather than ACC_PRIVATE if (!hasInnerOrIsGeneric) { flags |= JavaAccessFlags.ACC_PRIVATE; } break; case FieldAttributes.Family: case FieldAttributes.FamANDAssem: flags |= JavaAccessFlags.ACC_PROTECTED; break; case FieldAttributes.Assembly: case FieldAttributes.FamORAssem: // an assembly can include more than one package namespace default: flags |= JavaAccessFlags.ACC_PUBLIC; break; } if ((attrs & FieldAttributes.Static) != 0) { flags |= JavaAccessFlags.ACC_STATIC; attrs &= ~FieldAttributes.Static; } if ((attrs & FieldAttributes.InitOnly) != 0) { flags |= JavaAccessFlags.ACC_FINAL; attrs &= ~FieldAttributes.InitOnly; } if ((attrs & FieldAttributes.NotSerialized) != 0) { flags |= JavaAccessFlags.ACC_TRANSIENT; attrs &= ~FieldAttributes.NotSerialized; } attrs &= ~(FieldAttributes.Literal | FieldAttributes.HasFieldRVA | FieldAttributes.HasDefault | FieldAttributes.SpecialName | FieldAttributes.RTSpecialName); if (attrs != 0) { throw CilMain.Where.Exception($"unrecognized attributes {attrs0:X}"); } return(flags); }
static JavaAccessFlags AttributesToAccessFlags(TypeAttributes attrs, bool isInterface) { var attrs0 = attrs; JavaAccessFlags flags = 0; var visibilityMask = attrs & TypeAttributes.VisibilityMask; if (visibilityMask == TypeAttributes.NestedPrivate) { flags |= JavaAccessFlags.ACC_PRIVATE; } else if (visibilityMask == TypeAttributes.NestedFamily || visibilityMask == TypeAttributes.NestedFamANDAssem) { flags |= JavaAccessFlags.ACC_PROTECTED; } else { // an assembly can include more than one package namespace, // so even assembly-private-internal types must be made public flags |= JavaAccessFlags.ACC_PUBLIC; } attrs &= ~TypeAttributes.VisibilityMask; if (isInterface) { flags |= JavaAccessFlags.ACC_INTERFACE | JavaAccessFlags.ACC_ABSTRACT; } else { flags |= JavaAccessFlags.ACC_SUPER; if ((attrs & TypeAttributes.Abstract) != 0) { flags |= JavaAccessFlags.ACC_ABSTRACT; } else if ((attrs & TypeAttributes.Sealed) != 0) { flags |= JavaAccessFlags.ACC_FINAL; } } attrs &= ~(TypeAttributes.Abstract | TypeAttributes.Sealed | TypeAttributes.SpecialName | TypeAttributes.Interface | TypeAttributes.LayoutMask | TypeAttributes.Serializable | TypeAttributes.StringFormatMask | TypeAttributes.BeforeFieldInit | TypeAttributes.HasSecurity); if (attrs != 0) { throw CilMain.Where.Exception($"unrecognized attributes {attrs0:X}"); } return(flags); }
private static void WriteAccessFlagsParameter(this DataOutputStream stream, JavaAccessFlags flags) { stream.WriteInt((int)flags); }
static bool IsPublicOrProtected(JavaAccessFlags flags) { return((flags & (JavaAccessFlags.ACC_PUBLIC | JavaAccessFlags.ACC_PROTECTED)) != 0); }