[Ikvm-commit] ikvm/runtime ClassFile.cs, 1.79, 1.80 attributes.cs, 1.34, 1.35
Brought to you by:
jfrijters
From: Jeroen F. <jfr...@us...> - 2010-12-07 06:47:38
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv18231/runtime Modified Files: ClassFile.cs attributes.cs Log Message: Added support for encoding incorrect annotation values and reporting the exception back when the annotation is queried. Removed old (GNU Classpath based) version of AnnotationAttributeBase.java. Index: attributes.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/attributes.cs,v retrieving revision 1.34 retrieving revision 1.35 diff -C2 -d -r1.34 -r1.35 *** attributes.cs 5 Aug 2010 13:43:01 -0000 1.34 --- attributes.cs 7 Dec 2010 06:47:30 -0000 1.35 *************** *** 711,714 **** --- 711,715 ---- public const byte TAG_ANNOTATION = (byte)'@'; public const byte TAG_ARRAY = (byte)'['; + public const byte TAG_ERROR = (byte)'?'; private object defaultValue; *************** *** 726,729 **** --- 727,732 ---- // array: // new object[] { (byte)'[', (element_value)* } + // error: + // new object[] { (byte)'?', "<exceptionClass>", "<exceptionMessage>" } public AnnotationDefaultAttribute(object defaultValue) { Index: ClassFile.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassFile.cs,v retrieving revision 1.79 retrieving revision 1.80 diff -C2 -d -r1.79 -r1.80 *** ClassFile.cs 27 Sep 2010 04:42:56 -0000 1.79 --- ClassFile.cs 7 Dec 2010 06:47:30 -0000 1.80 *************** *** 524,579 **** private static object ReadAnnotationElementValue(BigEndianBinaryReader rdr, ClassFile classFile) { ! byte tag = rdr.ReadByte(); ! switch(tag) { ! case (byte)'Z': ! return classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()) != 0; ! case (byte)'B': ! return (byte)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'C': ! return (char)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'S': ! return (short)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'I': ! return classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'F': ! return classFile.GetConstantPoolConstantFloat(rdr.ReadUInt16()); ! case (byte)'J': ! return classFile.GetConstantPoolConstantLong(rdr.ReadUInt16()); ! case (byte)'D': ! return classFile.GetConstantPoolConstantDouble(rdr.ReadUInt16()); ! case (byte)'s': ! return classFile.GetConstantPoolUtf8String(rdr.ReadUInt16()); ! case (byte)'e': { ! ushort type_name_index = rdr.ReadUInt16(); ! ushort const_name_index = rdr.ReadUInt16(); ! return new object[] { AnnotationDefaultAttribute.TAG_ENUM, classFile.GetConstantPoolUtf8String(type_name_index), classFile.GetConstantPoolUtf8String(const_name_index) }; ! } ! case (byte)'c': ! return new object[] { AnnotationDefaultAttribute.TAG_CLASS, classFile.GetConstantPoolUtf8String(rdr.ReadUInt16()) }; ! case (byte)'@': ! return ReadAnnotation(rdr, classFile); ! case (byte)'[': ! { ! ushort num_values = rdr.ReadUInt16(); ! object[] array = new object[num_values + 1]; ! array[0] = AnnotationDefaultAttribute.TAG_ARRAY; ! for(int i = 0; i < num_values; i++) ! { ! array[i + 1] = ReadAnnotationElementValue(rdr, classFile); ! } ! return array; } - default: - throw new ClassFormatError("Invalid tag {0} in annotation element_value", tag); } } --- 524,592 ---- private static object ReadAnnotationElementValue(BigEndianBinaryReader rdr, ClassFile classFile) { ! try { ! byte tag = rdr.ReadByte(); ! switch (tag) { ! case (byte)'Z': ! return classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()) != 0; ! case (byte)'B': ! return (byte)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'C': ! return (char)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'S': ! return (short)classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'I': ! return classFile.GetConstantPoolConstantInteger(rdr.ReadUInt16()); ! case (byte)'F': ! return classFile.GetConstantPoolConstantFloat(rdr.ReadUInt16()); ! case (byte)'J': ! return classFile.GetConstantPoolConstantLong(rdr.ReadUInt16()); ! case (byte)'D': ! return classFile.GetConstantPoolConstantDouble(rdr.ReadUInt16()); ! case (byte)'s': ! return classFile.GetConstantPoolUtf8String(rdr.ReadUInt16()); ! case (byte)'e': ! { ! ushort type_name_index = rdr.ReadUInt16(); ! ushort const_name_index = rdr.ReadUInt16(); ! return new object[] { AnnotationDefaultAttribute.TAG_ENUM, classFile.GetConstantPoolUtf8String(type_name_index), classFile.GetConstantPoolUtf8String(const_name_index) }; ! } ! case (byte)'c': ! return new object[] { AnnotationDefaultAttribute.TAG_CLASS, classFile.GetConstantPoolUtf8String(rdr.ReadUInt16()) }; ! case (byte)'@': ! return ReadAnnotation(rdr, classFile); ! case (byte)'[': ! { ! ushort num_values = rdr.ReadUInt16(); ! object[] array = new object[num_values + 1]; ! array[0] = AnnotationDefaultAttribute.TAG_ARRAY; ! for (int i = 0; i < num_values; i++) ! { ! array[i + 1] = ReadAnnotationElementValue(rdr, classFile); ! } ! return array; ! } ! default: ! throw new ClassFormatError("Invalid tag {0} in annotation element_value", tag); } } + catch (NullReferenceException) + { + } + catch (InvalidCastException) + { + } + catch (IndexOutOfRangeException) + { + } + return new object[] { AnnotationDefaultAttribute.TAG_ERROR, "java.lang.IllegalArgumentException", "Wrong type at constant pool index" }; } |