private static ElementValue ReadElementValue(EndianBinaryReader reader, List<CompileConstant> constants) { var value = new ElementValue(); value.Tag = reader.ReadByte(); switch ((char)value.Tag) { case 'B': case 'C': case 'D': case 'F': case 'I': case 'J': case 'S': case 'Z': case 's': value.ConstValueIndex = reader.ReadInt16(); break; case 'e': value.TypeNameIndex = reader.ReadInt16(); value.ConstNameIndex = reader.ReadInt16(); break; case 'c': value.ClassInfoIndex = reader.ReadInt16(); break; case '@': value.AnnotationValue = ReadAnnotation(reader, constants); break; case '[': short valueCount = reader.ReadInt16(); for (int i = 0; i < valueCount; i++) { value.Values.Add(ReadElementValue(reader, constants)); } break; } return value; }
public override CompileAttribute Read(EndianBinaryReader reader, List<CompileConstant> constants, int length) { Entries = new List<StackMapFrame>(); short entryCount = reader.ReadInt16(); for (int i = 0; i < entryCount; i++) { var entry = new StackMapFrame(); entry.Type = reader.ReadByte(); if (entry.Type <= 63) { // SAME } else if (entry.Type >= 64 && entry.Type <= 127) { // SAME_LOCALS_1_STACK_ITEM var item = new VerificationTypeInfo(); item.Read(reader); entry.Stack.Add(item); } else if (entry.Type == 247) { // SAME_LOCALS_1_STACK_ITEM_EXTENDED entry.OffsetDelta = reader.ReadInt16(); var item = new VerificationTypeInfo(); item.Read(reader); entry.Stack.Add(item); } else if (entry.Type >= 248 && entry.Type <= 250) { // CHOP entry.OffsetDelta = reader.ReadInt16(); } else if (entry.Type == 251) { // SAME_FRAME_EXTENDED entry.OffsetDelta = reader.ReadInt16(); } else if (entry.Type >= 252 && entry.Type <= 254) { // APPEND entry.OffsetDelta = reader.ReadInt16(); var type = (short)entry.Type; for (int x = 251; x < type; x++) { var item = new VerificationTypeInfo(); item.Read(reader); entry.Locals.Add(item); } } else if (entry.Type == 255) { // FULL_FRAME entry.OffsetDelta = reader.ReadInt16(); short localCount = reader.ReadInt16(); for (int x = 0; x < localCount; x++) { var item = new VerificationTypeInfo(); item.Read(reader); entry.Locals.Add(item); } short stackCount = reader.ReadInt16(); for (int x = 0; x < stackCount; x++) { var item = new VerificationTypeInfo(); item.Read(reader); entry.Stack.Add(item); } } Entries.Add(entry); } return this; }
public void Read(EndianBinaryReader reader) { Tag = (VerificationType)reader.ReadByte(); if (Tag == VerificationType.Uninitialized || Tag == VerificationType.Object) { Value = reader.ReadInt16(); } }
public override CompileAttribute Read(EndianBinaryReader reader, List<CompileConstant> constants, int length) { var parameterCount = reader.ReadByte(); ParameterAnnotations = new List<List<CompileAttributeRuntimeVisibleAnnotations.Annotation>>(); for (var i = 0; i < parameterCount; i++) { var parameter = new List<CompileAttributeRuntimeVisibleAnnotations.Annotation>(); var annotationCount = reader.ReadInt16(); for (var x = 0; x < annotationCount; x++) { var annotation = CompileAttributeRuntimeVisibleAnnotations.ReadAnnotation(reader, constants); parameter.Add(annotation); } ParameterAnnotations.Add(parameter); } return this; }