示例#1
0
 public void Put(JavaAttribute attr)
 {
     set.Add(attr);
 }
示例#2
0
        public JavaAttributeSet(JavaReader rdr, bool withCode = true)
        {
            var count = rdr.Read16();

            set = new List <JavaAttribute>(count);

            for (int i = 0; i < count; i++)
            {
                var name = rdr.ConstUtf8(rdr.Read16());
                rdr.Where.Push($"attribute '{name}'");
                bool popped = false;

                var length   = JavaAttribute.ReadLength(rdr, name);
                var position = rdr.StreamPosition;

                JavaAttribute attr;
                switch (name)
                {
                case JavaAttribute.SourceFile.tag:
                    attr = new JavaAttribute.SourceFile(rdr);
                    break;

                case JavaAttribute.Signature.tag:
                    attr = new JavaAttribute.Signature(rdr);
                    break;

                case JavaAttribute.Exceptions.tag:
                    attr = new JavaAttribute.Exceptions(rdr);
                    break;

                case JavaAttribute.InnerClasses.tag:
                    attr = new JavaAttribute.InnerClasses(rdr);
                    break;

                case JavaAttribute.EnclosingMethod.tag:
                    attr = new JavaAttribute.EnclosingMethod(rdr);
                    break;

                case JavaAttribute.ConstantValue.tag:
                    attr = new JavaAttribute.ConstantValue(rdr);
                    break;

                case JavaAttribute.MethodParameters.tag:
                    attr = new JavaAttribute.MethodParameters(rdr);
                    break;

                //
                // Code attributes
                //

                case JavaAttribute.Code.tag:
                    attr = withCode ? (JavaAttribute) new JavaAttribute.Code(rdr)
                             : (JavaAttribute) new JavaAttribute.Generic(rdr, name, length);
                    break;

                case JavaAttribute.BootstrapMethods.tag:
                    attr = withCode ? (JavaAttribute) new JavaAttribute.BootstrapMethods(rdr)
                             : (JavaAttribute) new JavaAttribute.Generic(rdr, name, length);
                    break;

                case JavaAttribute.StackMapTable.tag:
                    attr = new JavaAttribute.StackMapTable(rdr);
                    break;

                case JavaAttribute.LineNumberTable.tag:
                    attr = new JavaAttribute.LineNumberTable(rdr);
                    break;

                case JavaAttribute.LocalVariableTable.tag:
                    attr = new JavaAttribute.LocalVariableTable(rdr);
                    break;

                //
                // Unhandled attributes
                //

                case "Synthetic":
                case "AnnotationDefault":
                case "LocalVariableTypeTable":
                case "RuntimeVisibleAnnotations":
                case "RuntimeInvisibleAnnotations":
                case "RuntimeInvisibleParameterAnnotations":
                case "Deprecated":
                    attr = new JavaAttribute.Generic(rdr, name, length);
                    break;

                default:
                    rdr.Where.Pop();
                    popped = true;
                    Console.WriteLine($"skipping unknown attribute '{name}'{rdr.Where}");
                    attr = new JavaAttribute.Generic(rdr, name, length);
                    break;
                }

                set.Add(attr);

                if (rdr.StreamPosition != position + length)
                {
                    throw rdr.Where.Exception("attribute too short");
                }

                if (!popped)
                {
                    rdr.Where.Pop();
                }
            }
        }