Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        /*
         * 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();
        }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
        }
Exemplo n.º 7
0
 private static void WriteAccessFlagsParameter(this DataOutputStream stream, JavaAccessFlags flags)
 {
     stream.WriteInt((int)flags);
 }
Exemplo n.º 8
0
 static bool IsPublicOrProtected(JavaAccessFlags flags)
 {
     return((flags & (JavaAccessFlags.ACC_PUBLIC | JavaAccessFlags.ACC_PROTECTED)) != 0);
 }