ikvm-commit Mailing List for IKVM.NET (Page 6)
Brought to you by:
jfrijters
You can subscribe to this list here.
2007 |
Jan
(25) |
Feb
(22) |
Mar
(32) |
Apr
(77) |
May
(111) |
Jun
(129) |
Jul
(223) |
Aug
(109) |
Sep
(60) |
Oct
(60) |
Nov
(36) |
Dec
(55) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(23) |
Feb
(76) |
Mar
(42) |
Apr
(49) |
May
(33) |
Jun
(64) |
Jul
(19) |
Aug
(124) |
Sep
(16) |
Oct
|
Nov
(87) |
Dec
(54) |
2009 |
Jan
(53) |
Feb
(116) |
Mar
(86) |
Apr
(64) |
May
(101) |
Jun
(99) |
Jul
(105) |
Aug
(63) |
Sep
(20) |
Oct
(110) |
Nov
(102) |
Dec
(36) |
2010 |
Jan
(87) |
Feb
(67) |
Mar
(5) |
Apr
(100) |
May
(178) |
Jun
(95) |
Jul
(22) |
Aug
(85) |
Sep
(82) |
Oct
(99) |
Nov
(119) |
Dec
(132) |
2011 |
Jan
(130) |
Feb
(18) |
Mar
(114) |
Apr
(8) |
May
(21) |
Jun
(53) |
Jul
(127) |
Aug
(111) |
Sep
(29) |
Oct
(28) |
Nov
(64) |
Dec
(94) |
2012 |
Jan
(56) |
Feb
(8) |
Mar
(65) |
Apr
(48) |
May
(22) |
Jun
(52) |
Jul
(73) |
Aug
(38) |
Sep
(18) |
Oct
(59) |
Nov
(16) |
Dec
(21) |
2013 |
Jan
(83) |
Feb
(151) |
Mar
(102) |
Apr
(13) |
May
(37) |
Jun
(1) |
Jul
(7) |
Aug
(42) |
Sep
(28) |
Oct
(13) |
Nov
(5) |
Dec
(3) |
2014 |
Jan
(3) |
Feb
(39) |
Mar
(11) |
Apr
(40) |
May
(62) |
Jun
(54) |
Jul
(21) |
Aug
(3) |
Sep
|
Oct
(15) |
Nov
(26) |
Dec
(7) |
2015 |
Jan
(6) |
Feb
(12) |
Mar
(51) |
Apr
(15) |
May
(7) |
Jun
(41) |
Jul
(2) |
Aug
(8) |
Sep
(5) |
Oct
(6) |
Nov
(11) |
Dec
(1) |
2016 |
Jan
|
Feb
(1) |
Mar
|
Apr
(1) |
May
|
Jun
(2) |
Jul
(19) |
Aug
(2) |
Sep
(2) |
Oct
|
Nov
|
Dec
|
2017 |
Jan
|
Feb
(2) |
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Jeroen F. <jfr...@us...> - 2015-04-06 06:54:45
|
Update of /cvsroot/ikvm/ikvm/reflect/Emit In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv32174/Emit Modified Files: ModuleBuilder.cs Log Message: Renamed TypeNameSpace to TypeNamespace for consistency. Index: ModuleBuilder.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/reflect/Emit/ModuleBuilder.cs,v retrieving revision 1.102 retrieving revision 1.103 diff -C2 -d -r1.102 -r1.103 *** ModuleBuilder.cs 17 Feb 2015 13:48:31 -0000 1.102 --- ModuleBuilder.cs 6 Apr 2015 06:54:43 -0000 1.103 *************** *** 911,915 **** rec.TypeName = this.Strings.Add(type.__Name); string ns = type.__Namespace; ! rec.TypeNameSpace = ns == null ? 0 : this.Strings.Add(ns); token = 0x01000000 | this.TypeRef.AddRecord(rec); } --- 911,915 ---- rec.TypeName = this.Strings.Add(type.__Name); string ns = type.__Namespace; ! rec.TypeNamespace = ns == null ? 0 : this.Strings.Add(ns); token = 0x01000000 | this.TypeRef.AddRecord(rec); } *************** *** 1606,1610 **** rec.ResolutionScope = resolutionScope; rec.TypeName = this.Strings.Add(name); ! rec.TypeNameSpace = ns == null ? 0 : this.Strings.Add(ns); return 0x01000000 | this.TypeRef.AddRecord(rec); } --- 1606,1610 ---- rec.ResolutionScope = resolutionScope; rec.TypeName = this.Strings.Add(name); ! rec.TypeNamespace = ns == null ? 0 : this.Strings.Add(ns); return 0x01000000 | this.TypeRef.AddRecord(rec); } |
From: Jeroen F. <jfr...@us...> - 2015-03-31 08:19:35
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv32167 Modified Files: BigEndianBinaryReader.cs ClassFile.cs Log Message: Bug fix. Don't enforce canonical UTF8 encoding for class file versions <= 47. Index: ClassFile.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassFile.cs,v retrieving revision 1.135 retrieving revision 1.136 diff -C2 -d -r1.135 -r1.136 *** ClassFile.cs 24 Mar 2015 09:31:46 -0000 1.135 --- ClassFile.cs 31 Mar 2015 08:19:32 -0000 1.136 *************** *** 146,150 **** break; case Constant.Utf8: ! isstub |= (utf8_cp[i] = br.ReadString("<unknown>")) == "IKVM.NET.Assembly"; break; default: --- 146,150 ---- break; case Constant.Utf8: ! isstub |= (utf8_cp[i] = br.ReadString(null, majorVersion)) == "IKVM.NET.Assembly"; break; default: *************** *** 240,244 **** break; case Constant.Utf8: ! utf8_cp[i] = br.ReadString(inputClassName); break; default: --- 240,244 ---- break; case Constant.Utf8: ! utf8_cp[i] = br.ReadString(inputClassName, majorVersion); break; default: Index: BigEndianBinaryReader.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/BigEndianBinaryReader.cs,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** BigEndianBinaryReader.cs 18 Jun 2014 11:01:39 -0000 1.11 --- BigEndianBinaryReader.cs 31 Mar 2015 08:19:32 -0000 1.12 *************** *** 140,144 **** } ! internal string ReadString(string classFile) { int len = ReadUInt16(); --- 140,144 ---- } ! internal string ReadString(string classFile, int majorVersion) { int len = ReadUInt16(); *************** *** 179,183 **** } c = (((c & 0x1F) << 6) | (char2 & 0x3F)); ! if(c < 0x80 && c != 0) { goto default; --- 179,183 ---- } c = (((c & 0x1F) << 6) | (char2 & 0x3F)); ! if(c < 0x80 && c != 0 && majorVersion >= 48) { goto default; *************** *** 193,197 **** } c = (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); ! if(c < 0x800) { goto default; --- 193,197 ---- } c = (((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0)); ! if(c < 0x800 && majorVersion >= 48) { goto default; *************** *** 199,203 **** break; default: ! throw new ClassFormatError("Illegal UTF8 string in constant pool in class file {0}", classFile); } ch[l++] = (char)c; --- 199,203 ---- break; default: ! throw new ClassFormatError("Illegal UTF8 string in constant pool in class file {0}", classFile ?? "<Unknown>"); } ch[l++] = (char)c; |
From: Jeroen F. <jfr...@us...> - 2015-03-24 09:43:16
|
Update of /cvsroot/ikvm/ikvm In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv23435 Modified Files: CommonAssemblyInfo.cs.in Log Message: Updated version to 8.1. Index: CommonAssemblyInfo.cs.in =================================================================== RCS file: /cvsroot/ikvm/ikvm/CommonAssemblyInfo.cs.in,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** CommonAssemblyInfo.cs.in 16 Feb 2015 10:29:11 -0000 1.13 --- CommonAssemblyInfo.cs.in 24 Mar 2015 09:43:14 -0000 1.14 *************** *** 30,34 **** [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] ! [assembly: AssemblyVersion("8.0.@BUILD@.0")] #if SIGNCODE --- 30,34 ---- [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] ! [assembly: AssemblyVersion("8.1.@BUILD@.0")] #if SIGNCODE |
From: Jeroen F. <jfr...@us...> - 2015-03-24 09:39:13
|
Update of /cvsroot/ikvm/ikvm/ikvmc In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv23273/ikvmc Modified Files: AotTypeWrapper.cs CompilerClassLoader.cs remapper.cs Log Message: Removed sig decoding methods with implicit LoadMode. Index: CompilerClassLoader.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/ikvmc/CompilerClassLoader.cs,v retrieving revision 1.274 retrieving revision 1.275 diff -C2 -d -r1.274 -r1.275 *** CompilerClassLoader.cs 24 Mar 2015 09:15:03 -0000 1.274 --- CompilerClassLoader.cs 24 Mar 2015 09:39:11 -0000 1.275 *************** *** 1291,1295 **** AttributeHelper.HideFromJava(typeWrapper.helperTypeBuilder); } ! helper = typeWrapper.helperTypeBuilder.DefineMethod(m.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static, typeWrapper.GetClassLoader().RetTypeWrapperFromSig(m.Sig).TypeAsSignatureType, argTypes); if(m.Attributes != null) { --- 1291,1295 ---- AttributeHelper.HideFromJava(typeWrapper.helperTypeBuilder); } ! helper = typeWrapper.helperTypeBuilder.DefineMethod(m.Name, MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Static, typeWrapper.GetClassLoader().RetTypeWrapperFromSig(m.Sig, LoadMode.LoadOrThrow).TypeAsSignatureType, argTypes); if(m.Attributes != null) { *************** *** 1335,1339 **** MethodBuilder mbCore = null; Type[] paramTypes = typeWrapper.GetClassLoader().ArgTypeListFromSig(m.Sig); ! Type retType = typeWrapper.GetClassLoader().RetTypeWrapperFromSig(m.Sig).TypeAsSignatureType; if(typeWrapper.shadowType.IsSealed && (m.Modifiers & IKVM.Internal.MapXml.MapModifiers.Static) == 0) --- 1335,1339 ---- MethodBuilder mbCore = null; Type[] paramTypes = typeWrapper.GetClassLoader().ArgTypeListFromSig(m.Sig); ! Type retType = typeWrapper.GetClassLoader().RetTypeWrapperFromSig(m.Sig, LoadMode.LoadOrThrow).TypeAsSignatureType; if(typeWrapper.shadowType.IsSealed && (m.Modifiers & IKVM.Internal.MapXml.MapModifiers.Static) == 0) *************** *** 1807,1811 **** attr |= FieldAttributes.Static; } ! FieldBuilder fb = tb.DefineField(f.Name, GetClassLoader().FieldTypeWrapperFromSig(f.Sig).TypeAsSignatureType, attr); if(f.Attributes != null) { --- 1807,1811 ---- attr |= FieldAttributes.Static; } ! FieldBuilder fb = tb.DefineField(f.Name, GetClassLoader().FieldTypeWrapperFromSig(f.Sig, LoadMode.LoadOrThrow).TypeAsSignatureType, attr); if(f.Attributes != null) { *************** *** 1828,1836 **** } fb.SetConstant(constant); ! fields.Add(new ConstantFieldWrapper(this, GetClassLoader().FieldTypeWrapperFromSig(f.Sig), f.Name, f.Sig, (Modifiers)f.Modifiers, fb, constant, MemberFlags.None)); } else { ! fields.Add(FieldWrapper.Create(this, GetClassLoader().FieldTypeWrapperFromSig(f.Sig), fb, f.Name, f.Sig, new ExModifiers((Modifiers)f.Modifiers, false))); } } --- 1828,1836 ---- } fb.SetConstant(constant); ! fields.Add(new ConstantFieldWrapper(this, GetClassLoader().FieldTypeWrapperFromSig(f.Sig, LoadMode.LoadOrThrow), f.Name, f.Sig, (Modifiers)f.Modifiers, fb, constant, MemberFlags.None)); } else { ! fields.Add(FieldWrapper.Create(this, GetClassLoader().FieldTypeWrapperFromSig(f.Sig, LoadMode.LoadOrThrow), fb, f.Name, f.Sig, new ExModifiers((Modifiers)f.Modifiers, false))); } } Index: AotTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/ikvmc/AotTypeWrapper.cs,v retrieving revision 1.86 retrieving revision 1.87 diff -C2 -d -r1.86 -r1.87 *** AotTypeWrapper.cs 13 Jun 2014 06:54:06 -0000 1.86 --- AotTypeWrapper.cs 24 Mar 2015 09:39:10 -0000 1.87 *************** *** 393,398 **** foreach(IKVM.Internal.MapXml.Property prop in clazz.Properties) { ! TypeWrapper typeWrapper = GetClassLoader().RetTypeWrapperFromSigNoThrow(prop.Sig); ! TypeWrapper[] propargs = GetClassLoader().ArgTypeWrapperListFromSigNoThrow(prop.Sig); Type[] indexer = new Type[propargs.Length]; for(int i = 0; i < propargs.Length; i++) --- 393,398 ---- foreach(IKVM.Internal.MapXml.Property prop in clazz.Properties) { ! TypeWrapper typeWrapper = GetClassLoader().RetTypeWrapperFromSig(prop.Sig, LoadMode.Link); ! TypeWrapper[] propargs = GetClassLoader().ArgTypeWrapperListFromSig(prop.Sig, LoadMode.Link); Type[] indexer = new Type[propargs.Length]; for(int i = 0; i < propargs.Length; i++) *************** *** 568,573 **** private void MapSignature(string sig, out Type returnType, out Type[] parameterTypes) { ! returnType = GetClassLoader().RetTypeWrapperFromSigNoThrow(sig).TypeAsSignatureType; ! TypeWrapper[] parameterTypeWrappers = GetClassLoader().ArgTypeWrapperListFromSigNoThrow(sig); parameterTypes = new Type[parameterTypeWrappers.Length]; for(int i = 0; i < parameterTypeWrappers.Length; i++) --- 568,573 ---- private void MapSignature(string sig, out Type returnType, out Type[] parameterTypes) { ! returnType = GetClassLoader().RetTypeWrapperFromSig(sig, LoadMode.Link).TypeAsSignatureType; ! TypeWrapper[] parameterTypeWrappers = GetClassLoader().ArgTypeWrapperListFromSig(sig, LoadMode.Link); parameterTypes = new Type[parameterTypeWrappers.Length]; for(int i = 0; i < parameterTypeWrappers.Length; i++) Index: remapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/ikvmc/remapper.cs,v retrieving revision 1.47 retrieving revision 1.48 diff -C2 -d -r1.47 -r1.48 *** remapper.cs 19 Nov 2014 07:24:41 -0000 1.47 --- remapper.cs 24 Mar 2015 09:39:11 -0000 1.48 *************** *** 1225,1229 **** internal override void Generate(CodeGenContext context, CodeEmitter ilgen) { ! ilgen.Emit(OpCodes.Ldelema, context.ClassLoader.FieldTypeWrapperFromSig(Sig).TypeAsArrayType); } } --- 1225,1229 ---- internal override void Generate(CodeGenContext context, CodeEmitter ilgen) { ! ilgen.Emit(OpCodes.Ldelema, context.ClassLoader.FieldTypeWrapperFromSig(Sig, LoadMode.LoadOrThrow).TypeAsArrayType); } } *************** *** 1237,1241 **** internal override void Generate(CodeGenContext context, CodeEmitter ilgen) { ! ilgen.Emit(OpCodes.Newarr, context.ClassLoader.FieldTypeWrapperFromSig(Sig).TypeAsArrayType); } } --- 1237,1241 ---- internal override void Generate(CodeGenContext context, CodeEmitter ilgen) { ! ilgen.Emit(OpCodes.Newarr, context.ClassLoader.FieldTypeWrapperFromSig(Sig, LoadMode.LoadOrThrow).TypeAsArrayType); } } |
From: Jeroen F. <jfr...@us...> - 2015-03-24 09:37:27
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv23196 Modified Files: DynamicTypeWrapper.cs vm.cs Log Message: Added environment switch IKVM_DISABLE_EAGER_CLASS_LOADING to enable testing late binding. Index: vm.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/vm.cs,v retrieving revision 1.119 retrieving revision 1.120 diff -C2 -d -r1.119 -r1.120 *** vm.cs 14 Apr 2014 09:05:36 -0000 1.119 --- vm.cs 24 Mar 2015 09:37:25 -0000 1.120 *************** *** 98,101 **** --- 98,102 ---- internal static bool relaxedVerification = true; internal static bool AllowNonVirtualCalls; + internal static readonly bool DisableEagerClassLoading = SafeGetEnvironmentVariable("IKVM_DISABLE_EAGER_CLASS_LOADING") != null; #endif Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.271 retrieving revision 1.272 diff -C2 -d -r1.271 -r1.272 *** DynamicTypeWrapper.cs 24 Mar 2015 09:31:46 -0000 1.271 --- DynamicTypeWrapper.cs 24 Mar 2015 09:37:25 -0000 1.272 *************** *** 1715,1719 **** // Prevent infinity recursion for broken class loaders by keeping a recursion count and falling // back to late binding if we recurse more than twice. ! LoadMode mode = System.Threading.Interlocked.Increment(ref recursionCount) > 2 ? LoadMode.ReturnUnloadable : LoadMode.Link; --- 1715,1719 ---- // Prevent infinity recursion for broken class loaders by keeping a recursion count and falling // back to late binding if we recurse more than twice. ! LoadMode mode = System.Threading.Interlocked.Increment(ref recursionCount) > 2 || (JVM.DisableEagerClassLoading && wrapper.Name != "sun.reflect.misc.Trampoline") ? LoadMode.ReturnUnloadable : LoadMode.Link; |
From: Jeroen F. <jfr...@us...> - 2015-03-24 09:31:48
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv23007 Modified Files: ClassFile.cs DynamicTypeWrapper.cs MemberWrapper.cs Log Message: Avoid infinite recursion if (broken) class loader triggers a load of a class currently being finished. Index: MemberWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/MemberWrapper.cs,v retrieving revision 1.204 retrieving revision 1.205 diff -C2 -d -r1.204 -r1.205 *** MemberWrapper.cs 11 Nov 2014 15:37:09 -0000 1.204 --- MemberWrapper.cs 24 Mar 2015 09:31:46 -0000 1.205 *************** *** 590,593 **** --- 590,598 ---- internal void Link() { + Link(LoadMode.Link); + } + + internal void Link(LoadMode mode) + { lock(this) { *************** *** 598,603 **** } ClassLoaderWrapper loader = this.DeclaringType.GetClassLoader(); ! TypeWrapper ret = loader.RetTypeWrapperFromSigNoThrow(Signature); ! TypeWrapper[] parameters = loader.ArgTypeWrapperListFromSigNoThrow(Signature); lock(this) { --- 603,608 ---- } ClassLoaderWrapper loader = this.DeclaringType.GetClassLoader(); ! TypeWrapper ret = loader.RetTypeWrapperFromSig(Signature, mode); ! TypeWrapper[] parameters = loader.ArgTypeWrapperListFromSig(Signature, mode); lock(this) { *************** *** 1463,1466 **** --- 1468,1476 ---- internal void Link() { + Link(LoadMode.Link); + } + + internal void Link(LoadMode mode) + { lock(this) { *************** *** 1470,1474 **** } } ! TypeWrapper fld = this.DeclaringType.GetClassLoader().FieldTypeWrapperFromSigNoThrow(Signature); lock(this) { --- 1480,1484 ---- } } ! TypeWrapper fld = this.DeclaringType.GetClassLoader().FieldTypeWrapperFromSig(Signature, mode); lock(this) { Index: ClassFile.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassFile.cs,v retrieving revision 1.134 retrieving revision 1.135 diff -C2 -d -r1.134 -r1.135 *** ClassFile.cs 24 Mar 2015 09:15:03 -0000 1.134 --- ClassFile.cs 24 Mar 2015 09:31:46 -0000 1.135 *************** *** 960,964 **** } ! internal void Link(TypeWrapper thisType) { // this is not just an optimization, it's required for anonymous classes to be able to refer to themselves --- 960,964 ---- } ! internal void Link(TypeWrapper thisType, LoadMode mode) { // this is not just an optimization, it's required for anonymous classes to be able to refer to themselves *************** *** 968,972 **** if(constantpool[i] != null) { ! constantpool[i].Link(thisType); } } --- 968,972 ---- if(constantpool[i] != null) { ! constantpool[i].Link(thisType, mode); } } *************** *** 1425,1429 **** } ! internal virtual void Link(TypeWrapper thisType) { } --- 1425,1429 ---- } ! internal virtual void Link(TypeWrapper thisType, LoadMode mode) { } *************** *** 1563,1571 **** } ! internal override void Link(TypeWrapper thisType) { if(typeWrapper == VerifierTypeWrapper.Null) { ! TypeWrapper tw = thisType.GetClassLoader().LoadClass(name, LoadMode.Link | LoadMode.WarnClassNotFound); #if !STATIC_COMPILER && !FIRST_PASS if(!tw.IsUnloadable) --- 1563,1571 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { if(typeWrapper == VerifierTypeWrapper.Null) { ! TypeWrapper tw = thisType.GetClassLoader().LoadClass(name, mode | LoadMode.WarnClassNotFound); #if !STATIC_COMPILER && !FIRST_PASS if(!tw.IsUnloadable) *************** *** 1678,1684 **** } ! internal override void Link(TypeWrapper thisType) { ! clazz.Link(thisType); } --- 1678,1684 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! clazz.Link(thisType, mode); } *************** *** 1741,1747 **** } ! internal override void Link(TypeWrapper thisType) { ! base.Link(thisType); lock(this) { --- 1741,1747 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! base.Link(thisType, mode); lock(this) { *************** *** 1762,1770 **** if(fw != null) { ! fw.Link(); } } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper fld = classLoader.FieldTypeWrapperFromSigNoThrow(this.Signature); lock(this) { --- 1762,1770 ---- if(fw != null) { ! fw.Link(mode); } } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper fld = classLoader.FieldTypeWrapperFromSig(this.Signature, mode); lock(this) { *************** *** 1818,1824 **** } ! internal override void Link(TypeWrapper thisType) { ! base.Link(thisType); lock(this) { --- 1818,1824 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! base.Link(thisType, mode); lock(this) { *************** *** 1829,1834 **** } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSigNoThrow(this.Signature); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSigNoThrow(this.Signature); lock(this) { --- 1829,1834 ---- } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSig(this.Signature, mode); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSig(this.Signature, mode); lock(this) { *************** *** 1873,1879 **** } ! internal override void Link(TypeWrapper thisType) { ! base.Link(thisType); TypeWrapper wrapper = GetClassType(); if(wrapper != null && !wrapper.IsUnloadable) --- 1873,1879 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! base.Link(thisType, mode); TypeWrapper wrapper = GetClassType(); if(wrapper != null && !wrapper.IsUnloadable) *************** *** 1882,1886 **** if(method != null) { ! method.Link(); } if(Name != StringConstants.INIT --- 1882,1886 ---- if(method != null) { ! method.Link(mode); } if(Name != StringConstants.INIT *************** *** 1893,1897 **** if(invokespecialMethod != null) { ! invokespecialMethod.Link(); } } --- 1893,1897 ---- if(invokespecialMethod != null) { ! invokespecialMethod.Link(mode); } } *************** *** 1906,1912 **** } ! internal override void Link(TypeWrapper thisType) { ! base.Link(thisType); TypeWrapper wrapper = GetClassType(); if(wrapper != null) --- 1906,1912 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! base.Link(thisType, mode); TypeWrapper wrapper = GetClassType(); if(wrapper != null) *************** *** 1923,1927 **** if(method != null) { ! method.Link(); } } --- 1923,1927 ---- if(method != null) { ! method.Link(mode); } } *************** *** 2118,2124 **** } ! internal override void Link(TypeWrapper thisType) { ! cpi.Link(thisType); } --- 2118,2124 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { ! cpi.Link(thisType, mode); } *************** *** 2151,2155 **** } ! internal override void Link(TypeWrapper thisType) { lock (this) --- 2151,2155 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { lock (this) *************** *** 2161,2166 **** } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSigNoThrow(descriptor); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSigNoThrow(descriptor); lock (this) { --- 2161,2166 ---- } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSig(descriptor, mode); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSig(descriptor, mode); lock (this) { *************** *** 2221,2225 **** } ! internal override void Link(TypeWrapper thisType) { lock (this) --- 2221,2225 ---- } ! internal override void Link(TypeWrapper thisType, LoadMode mode) { lock (this) *************** *** 2231,2236 **** } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSigNoThrow(descriptor); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSigNoThrow(descriptor); lock (this) { --- 2231,2236 ---- } ClassLoaderWrapper classLoader = thisType.GetClassLoader(); ! TypeWrapper[] args = classLoader.ArgTypeWrapperListFromSig(descriptor, mode); ! TypeWrapper ret = classLoader.RetTypeWrapperFromSig(descriptor, mode); lock (this) { Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.270 retrieving revision 1.271 diff -C2 -d -r1.270 -r1.271 *** DynamicTypeWrapper.cs 22 Mar 2015 07:48:10 -0000 1.270 --- DynamicTypeWrapper.cs 24 Mar 2015 09:31:46 -0000 1.271 *************** *** 479,482 **** --- 479,483 ---- private MethodBuilder clinitMethod; private MethodBuilder finalizeMethod; + private int recursionCount; #if STATIC_COMPILER private DynamicTypeWrapper enclosingClassWrapper; *************** *** 1712,1723 **** // may not run any Java code, because that might result in a request to finish the type that we // are in the process of finishing, and this would be a problem. ! classFile.Link(wrapper); ! for (int i = 0; i < fields.Length; i++) { ! fields[i].Link(); } ! for (int i = 0; i < methods.Length; i++) { ! methods[i].Link(); } // this is the correct lock, FinishCore doesn't call any user code and mutates global state, --- 1713,1736 ---- // may not run any Java code, because that might result in a request to finish the type that we // are in the process of finishing, and this would be a problem. ! // Prevent infinity recursion for broken class loaders by keeping a recursion count and falling ! // back to late binding if we recurse more than twice. ! LoadMode mode = System.Threading.Interlocked.Increment(ref recursionCount) > 2 ! ? LoadMode.ReturnUnloadable ! : LoadMode.Link; ! try { ! classFile.Link(wrapper, mode); ! for (int i = 0; i < fields.Length; i++) ! { ! fields[i].Link(mode); ! } ! for (int i = 0; i < methods.Length; i++) ! { ! methods[i].Link(mode); ! } } ! finally { ! System.Threading.Interlocked.Decrement(ref recursionCount); } // this is the correct lock, FinishCore doesn't call any user code and mutates global state, |
From: Jeroen F. <jfr...@us...> - 2015-03-24 09:15:05
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv22517/runtime Modified Files: AssemblyClassLoader.cs ClassFile.cs ClassLoaderWrapper.cs Log Message: Minor class loading refactoring. Index: ClassLoaderWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassLoaderWrapper.cs,v retrieving revision 1.233 retrieving revision 1.234 diff -C2 -d -r1.233 -r1.234 *** ClassLoaderWrapper.cs 22 Mar 2015 11:19:37 -0000 1.233 --- ClassLoaderWrapper.cs 24 Mar 2015 09:15:03 -0000 1.234 *************** *** 1,4 **** /* ! Copyright (C) 2002-2014 Jeroen Frijters This software is provided 'as-is', without any express or implied --- 1,4 ---- /* ! Copyright (C) 2002-2015 Jeroen Frijters This software is provided 'as-is', without any express or implied *************** *** 56,59 **** --- 56,85 ---- } + [Flags] + enum LoadMode + { + // These are the modes that should be used + Find = ReturnNull, + LoadOrNull = Load | ReturnNull, + LoadOrThrow = Load | ThrowClassNotFound, + Link = Load | ReturnUnloadable | SuppressExceptions, + + // call into Java class loader + Load = 0x0001, + + // return value + DontReturnUnloadable = 0x0002, // This is used with a bitwise OR to disable returning unloadable + ReturnUnloadable = 0x0004, + ReturnNull = 0x0004 | DontReturnUnloadable, + ThrowClassNotFound = 0x0008 | DontReturnUnloadable, + MaskReturn = ReturnUnloadable | ReturnNull | ThrowClassNotFound, + + // exceptions (not ClassNotFoundException) + SuppressExceptions = 0x0010, + + // warnings + WarnClassNotFound = 0x0020, + } + #if !STUB_GENERATOR abstract class TypeWrapperFactory *************** *** 182,186 **** if (name.Length > 1 && name[0] == '[') { ! return FindOrLoadArrayClass(name, true); } TypeWrapper tw; --- 208,212 ---- if (name.Length > 1 && name[0] == '[') { ! return FindOrLoadArrayClass(name, LoadMode.Find); } TypeWrapper tw; *************** *** 475,515 **** internal TypeWrapper LoadClassByDottedName(string name) { ! TypeWrapper type = LoadClassByDottedNameFastImpl(name, true); ! if(type != null) ! { ! return RegisterInitiatingLoader(type); ! } ! throw new ClassNotFoundException(name); } internal TypeWrapper LoadClassByDottedNameFast(string name) { ! TypeWrapper type = LoadClassByDottedNameFastImpl(name, false); ! if(type != null) ! { ! return RegisterInitiatingLoader(type); ! } ! return null; } ! private TypeWrapper LoadClassByDottedNameFastImpl(string name, bool throwClassNotFoundException) { ! Profiler.Enter("LoadClassByDottedName"); try { ! TypeWrapper type = LoadRegisteredOrPendingClass(name); ! if(type != null) { ! return type; } ! if(name.Length > 1 && name[0] == '[') { ! return FindOrLoadArrayClass(name, false); } - return LoadClassImpl(name, throwClassNotFoundException); } finally { ! Profiler.Leave("LoadClassByDottedName"); } } --- 501,560 ---- internal TypeWrapper LoadClassByDottedName(string name) { ! return LoadClass(name, LoadMode.LoadOrThrow); } internal TypeWrapper LoadClassByDottedNameFast(string name) { ! return LoadClass(name, LoadMode.LoadOrNull); } ! internal TypeWrapper LoadClass(string name, LoadMode mode) { ! Profiler.Enter("LoadClass"); try { ! TypeWrapper tw = LoadRegisteredOrPendingClass(name); ! if (tw != null) { ! return tw; } ! if (name.Length > 1 && name[0] == '[') { ! tw = FindOrLoadArrayClass(name, mode); ! } ! else ! { ! tw = LoadClassImpl(name, mode); ! } ! if (tw != null) ! { ! return RegisterInitiatingLoader(tw); ! } ! #if STATIC_COMPILER ! if (!(name.Length > 1 && name[0] == '[') && ((mode & LoadMode.WarnClassNotFound) != 0) || WarningLevelHigh) ! { ! IssueMessage(Message.ClassNotFound, name); ! } ! #else ! if (!(name.Length > 1 && name[0] == '[')) ! { ! Tracer.Error(Tracer.ClassLoading, "Class not found: {0}", name); ! } ! #endif ! switch (mode & LoadMode.MaskReturn) ! { ! case LoadMode.ReturnNull: ! return null; ! case LoadMode.ReturnUnloadable: ! return new UnloadableTypeWrapper(name); ! case LoadMode.ThrowClassNotFound: ! throw new ClassNotFoundException(name); ! default: ! throw new InvalidOperationException(); } } finally { ! Profiler.Leave("LoadClass"); } } *************** *** 543,552 **** } ! private TypeWrapper FindOrLoadClass(string name, bool find) ! { ! return find ? FindLoadedClass(name) : LoadClassByDottedNameFast(name); ! } ! ! private TypeWrapper FindOrLoadArrayClass(string name, bool find) { int dims = 1; --- 588,592 ---- } ! private TypeWrapper FindOrLoadArrayClass(string name, LoadMode mode) { int dims = 1; *************** *** 570,574 **** // NOTE it's important that we're registered as the initiating loader // for the element type here ! TypeWrapper type = FindOrLoadClass(elemClass, find); if(type != null) { --- 610,614 ---- // NOTE it's important that we're registered as the initiating loader // for the element type here ! TypeWrapper type = LoadClass(elemClass, mode | LoadMode.DontReturnUnloadable); if(type != null) { *************** *** 605,615 **** } ! internal TypeWrapper FindOrLoadGenericClass(string name, bool find) { // we need to handle delegate methods here (for generic delegates) // (note that other types with manufactured inner classes such as Attribute and Enum can't be generic) if (name.EndsWith(DotNetTypeWrapper.DelegateInterfaceSuffix)) { ! TypeWrapper outer = FindOrLoadGenericClass(name.Substring(0, name.Length - DotNetTypeWrapper.DelegateInterfaceSuffix.Length), find); if (outer != null && outer.IsFakeTypeContainer) { --- 645,658 ---- } ! internal TypeWrapper FindOrLoadGenericClass(string name, LoadMode mode) { + // we don't want to expose any failures to load any of the component types + mode = (mode & LoadMode.MaskReturn) | LoadMode.ReturnNull; + // we need to handle delegate methods here (for generic delegates) // (note that other types with manufactured inner classes such as Attribute and Enum can't be generic) if (name.EndsWith(DotNetTypeWrapper.DelegateInterfaceSuffix)) { ! TypeWrapper outer = FindOrLoadGenericClass(name.Substring(0, name.Length - DotNetTypeWrapper.DelegateInterfaceSuffix.Length), mode); if (outer != null && outer.IsFakeTypeContainer) { *************** *** 635,639 **** return null; } ! TypeWrapper def = FindOrLoadClass(name.Substring(0, pos), find); if (def == null || !def.TypeAsTBD.IsGenericTypeDefinition) { --- 678,682 ---- return null; } ! TypeWrapper def = LoadClass(name.Substring(0, pos), mode); if (def == null || !def.TypeAsTBD.IsGenericTypeDefinition) { *************** *** 709,713 **** { case 'L': ! tw = FindOrLoadClass(s.Substring(dims + 1), find); if(tw == null) { --- 752,756 ---- { case 'L': ! tw = LoadClass(s.Substring(dims + 1), mode); if(tw == null) { *************** *** 767,773 **** } ! protected virtual TypeWrapper LoadClassImpl(string name, bool throwClassNotFoundException) { ! TypeWrapper tw = FindOrLoadGenericClass(name, false); if(tw != null) { --- 810,816 ---- } ! protected virtual TypeWrapper LoadClassImpl(string name, LoadMode mode) { ! TypeWrapper tw = FindOrLoadGenericClass(name, mode); if(tw != null) { *************** *** 775,778 **** --- 818,825 ---- } #if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR + if((mode & LoadMode.Load) == 0) + { + return null; + } Profiler.Enter("ClassLoader.loadClass"); try *************** *** 793,797 **** catch(java.lang.ClassNotFoundException x) { ! if(throwClassNotFoundException) { throw new ClassLoadingException(ikvm.runtime.Util.mapException(x), name); --- 840,844 ---- catch(java.lang.ClassNotFoundException x) { ! if((mode & LoadMode.MaskReturn) == LoadMode.ThrowClassNotFound) { throw new ClassLoadingException(ikvm.runtime.Util.mapException(x), name); *************** *** 799,805 **** return null; } catch(Exception x) { ! throw new ClassLoadingException(ikvm.runtime.Util.mapException(x), name); } finally --- 846,878 ---- return null; } + catch(java.lang.ThreadDeath) + { + throw; + } catch(Exception x) { ! if((mode & LoadMode.SuppressExceptions) == 0) ! { ! throw new ClassLoadingException(ikvm.runtime.Util.mapException(x), name); ! } ! if(Tracer.ClassLoading.TraceError) ! { ! java.lang.ClassLoader cl = GetJavaClassLoader(); ! if(cl != null) ! { ! System.Text.StringBuilder sb = new System.Text.StringBuilder(); ! string sep = ""; ! while(cl != null) ! { ! sb.Append(sep).Append(cl); ! sep = " -> "; ! cl = cl.getParent(); ! } ! Tracer.Error(Tracer.ClassLoading, "ClassLoader chain: {0}", sb); ! } ! Exception m = ikvm.runtime.Util.mapException(x); ! Tracer.Error(Tracer.ClassLoading, m.ToString() + Environment.NewLine + m.StackTrace); ! } ! return null; } finally *************** *** 847,857 **** } - private TypeWrapper SigDecoderLoadClass(string name, bool nothrow) - { - return nothrow ? LoadClassNoThrow(this, name, false) : LoadClassByDottedName(name); - } - // NOTE: this will ignore anything following the sig marker (so that it can be used to decode method signatures) ! private TypeWrapper SigDecoderWrapper(ref int index, string sig, bool nothrow) { switch(sig[index++]) --- 920,925 ---- } // NOTE: this will ignore anything following the sig marker (so that it can be used to decode method signatures) ! private TypeWrapper SigDecoderWrapper(ref int index, string sig, LoadMode mode) { switch(sig[index++]) *************** *** 873,877 **** int pos = index; index = sig.IndexOf(';', index) + 1; ! return SigDecoderLoadClass(sig.Substring(pos, index - pos - 1), nothrow); } case 'S': --- 941,945 ---- int pos = index; index = sig.IndexOf(';', index) + 1; ! return LoadClass(sig.Substring(pos, index - pos - 1), mode); } case 'S': *************** *** 896,900 **** int pos = index; index = sig.IndexOf(';', index) + 1; ! return SigDecoderLoadClass(array + sig.Substring(pos, index - pos), nothrow); } case 'B': --- 964,968 ---- int pos = index; index = sig.IndexOf(';', index) + 1; ! return LoadClass(array + sig.Substring(pos, index - pos), mode); } case 'B': *************** *** 906,910 **** case 'S': case 'Z': ! return SigDecoderLoadClass(array + sig[index++], nothrow); default: throw new InvalidOperationException(sig.Substring(index)); --- 974,978 ---- case 'S': case 'Z': ! return LoadClass(array + sig[index++], mode); default: throw new InvalidOperationException(sig.Substring(index)); *************** *** 918,967 **** internal TypeWrapper FieldTypeWrapperFromSig(string sig) { ! int index = 0; ! return SigDecoderWrapper(ref index, sig, false); } internal TypeWrapper FieldTypeWrapperFromSigNoThrow(string sig) { int index = 0; ! return SigDecoderWrapper(ref index, sig, true); } internal TypeWrapper RetTypeWrapperFromSig(string sig) { ! int index = sig.IndexOf(')') + 1; ! return SigDecoderWrapper(ref index, sig, false); } internal TypeWrapper RetTypeWrapperFromSigNoThrow(string sig) { int index = sig.IndexOf(')') + 1; ! return SigDecoderWrapper(ref index, sig, true); } internal TypeWrapper[] ArgTypeWrapperListFromSig(string sig) { ! if(sig[1] == ')') ! { ! return TypeWrapper.EmptyArray; ! } ! List<TypeWrapper> list = new List<TypeWrapper>(); ! for(int i = 1; sig[i] != ')';) ! { ! list.Add(SigDecoderWrapper(ref i, sig, false)); ! } ! return list.ToArray(); } internal TypeWrapper[] ArgTypeWrapperListFromSigNoThrow(string sig) { ! if (sig[1] == ')') { return TypeWrapper.EmptyArray; } List<TypeWrapper> list = new List<TypeWrapper>(); ! for (int i = 1; sig[i] != ')'; ) { ! list.Add(SigDecoderWrapper(ref i, sig, true)); } return list.ToArray(); --- 986,1039 ---- internal TypeWrapper FieldTypeWrapperFromSig(string sig) { ! return FieldTypeWrapperFromSig(sig, LoadMode.LoadOrThrow); } internal TypeWrapper FieldTypeWrapperFromSigNoThrow(string sig) { + return FieldTypeWrapperFromSig(sig, LoadMode.Link); + } + + internal TypeWrapper FieldTypeWrapperFromSig(string sig, LoadMode mode) + { int index = 0; ! return SigDecoderWrapper(ref index, sig, mode); } internal TypeWrapper RetTypeWrapperFromSig(string sig) { ! return RetTypeWrapperFromSig(sig, LoadMode.LoadOrThrow); } internal TypeWrapper RetTypeWrapperFromSigNoThrow(string sig) { + return RetTypeWrapperFromSig(sig, LoadMode.Link); + } + + internal TypeWrapper RetTypeWrapperFromSig(string sig, LoadMode mode) + { int index = sig.IndexOf(')') + 1; ! return SigDecoderWrapper(ref index, sig, mode); } internal TypeWrapper[] ArgTypeWrapperListFromSig(string sig) { ! return ArgTypeWrapperListFromSig(sig, LoadMode.LoadOrThrow); } internal TypeWrapper[] ArgTypeWrapperListFromSigNoThrow(string sig) { ! return ArgTypeWrapperListFromSig(sig, LoadMode.Link); ! } ! ! internal TypeWrapper[] ArgTypeWrapperListFromSig(string sig, LoadMode mode) ! { ! if(sig[1] == ')') { return TypeWrapper.EmptyArray; } List<TypeWrapper> list = new List<TypeWrapper>(); ! for(int i = 1; sig[i] != ')';) { ! list.Add(SigDecoderWrapper(ref i, sig, mode)); } return list.ToArray(); *************** *** 1411,1472 **** #endif - internal static TypeWrapper LoadClassNoThrow(ClassLoaderWrapper classLoader, string name, bool issueWarning) - { - try - { - TypeWrapper wrapper = classLoader.LoadClassByDottedNameFast(name); - if (wrapper == null) - { - string elementTypeName = name; - if (elementTypeName.StartsWith("[")) - { - int skip = 1; - while (elementTypeName[skip++] == '[') ; - elementTypeName = elementTypeName.Substring(skip, elementTypeName.Length - skip - 1); - } - #if STATIC_COMPILER - if (issueWarning || classLoader.WarningLevelHigh) - { - classLoader.IssueMessage(Message.ClassNotFound, elementTypeName); - } - #else - Tracer.Error(Tracer.ClassLoading, "Class not found: {0}", elementTypeName); - #endif - wrapper = new UnloadableTypeWrapper(name); - } - return wrapper; - } - catch (RetargetableJavaException x) - { - // HACK keep the compiler from warning about unused local - GC.KeepAlive(x); - #if !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR - if(x.ToJava() is java.lang.ThreadDeath) - { - throw x.ToJava(); - } - if(Tracer.ClassLoading.TraceError) - { - java.lang.ClassLoader cl = classLoader.GetJavaClassLoader(); - if(cl != null) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - string sep = ""; - while(cl != null) - { - sb.Append(sep).Append(cl); - sep = " -> "; - cl = cl.getParent(); - } - Tracer.Error(Tracer.ClassLoading, "ClassLoader chain: {0}", sb); - } - Exception m = ikvm.runtime.Util.mapException(x.ToJava()); - Tracer.Error(Tracer.ClassLoading, m.ToString() + Environment.NewLine + m.StackTrace); - } - #endif // !STATIC_COMPILER && !FIRST_PASS && !STUB_GENERATOR - return new UnloadableTypeWrapper(name); - } - } - #if STATIC_COMPILER internal virtual void IssueMessage(Message msgId, params string[] values) --- 1483,1486 ---- *************** *** 1565,1569 **** protected override TypeWrapper FindLoadedClassLazy(string name) { ! TypeWrapper tw1 = FindOrLoadGenericClass(name, true); if (tw1 != null) { --- 1579,1583 ---- protected override TypeWrapper FindLoadedClassLazy(string name) { ! TypeWrapper tw1 = FindOrLoadGenericClass(name, LoadMode.Find); if (tw1 != null) { Index: AssemblyClassLoader.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/AssemblyClassLoader.cs,v retrieving revision 1.66 retrieving revision 1.67 diff -C2 -d -r1.66 -r1.67 *** AssemblyClassLoader.cs 6 Aug 2014 15:25:11 -0000 1.66 --- AssemblyClassLoader.cs 24 Mar 2015 09:15:03 -0000 1.67 *************** *** 672,676 **** } ! protected override TypeWrapper LoadClassImpl(string name, bool throwClassNotFoundException) { TypeWrapper tw = FindLoadedClass(name); --- 672,676 ---- } ! protected override TypeWrapper LoadClassImpl(string name, LoadMode mode) { TypeWrapper tw = FindLoadedClass(name); *************** *** 693,702 **** hasCustomClassLoader = 1; } ! return base.LoadClassImpl(name, throwClassNotFoundException); } #endif return LoadBootstrapIfNonJavaAssembly(name) ?? LoadDynamic(name) ! ?? FindOrLoadGenericClass(name, false); } --- 693,702 ---- hasCustomClassLoader = 1; } ! return base.LoadClassImpl(name, mode); } #endif return LoadBootstrapIfNonJavaAssembly(name) ?? LoadDynamic(name) ! ?? FindOrLoadGenericClass(name, LoadMode.LoadOrNull); } *************** *** 709,713 **** ?? LoadBootstrapIfNonJavaAssembly(name) ?? LoadDynamic(name) ! ?? FindOrLoadGenericClass(name, false); } --- 709,713 ---- ?? LoadBootstrapIfNonJavaAssembly(name) ?? LoadDynamic(name) ! ?? FindOrLoadGenericClass(name, LoadMode.LoadOrNull); } *************** *** 1012,1016 **** return DoLoad(name) ?? FindReferenced(name) ! ?? FindOrLoadGenericClass(name, true); } --- 1012,1016 ---- return DoLoad(name) ?? FindReferenced(name) ! ?? FindOrLoadGenericClass(name, LoadMode.Find); } Index: ClassFile.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassFile.cs,v retrieving revision 1.133 retrieving revision 1.134 diff -C2 -d -r1.133 -r1.134 *** ClassFile.cs 13 Mar 2015 12:54:26 -0000 1.133 --- ClassFile.cs 24 Mar 2015 09:15:03 -0000 1.134 *************** *** 1567,1571 **** if(typeWrapper == VerifierTypeWrapper.Null) { ! TypeWrapper tw = ClassLoaderWrapper.LoadClassNoThrow(thisType.GetClassLoader(), name, true); #if !STATIC_COMPILER && !FIRST_PASS if(!tw.IsUnloadable) --- 1567,1571 ---- if(typeWrapper == VerifierTypeWrapper.Null) { ! TypeWrapper tw = thisType.GetClassLoader().LoadClass(name, LoadMode.Link | LoadMode.WarnClassNotFound); #if !STATIC_COMPILER && !FIRST_PASS if(!tw.IsUnloadable) |
From: Jeroen F. <jfr...@us...> - 2015-03-22 11:19:39
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv12661 Modified Files: ClassLoaderWrapper.cs Log Message: CreateArrayType should be a static method. Index: ClassLoaderWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ClassLoaderWrapper.cs,v retrieving revision 1.232 retrieving revision 1.233 diff -C2 -d -r1.232 -r1.233 *** ClassLoaderWrapper.cs 5 Mar 2015 12:43:14 -0000 1.232 --- ClassLoaderWrapper.cs 22 Mar 2015 11:19:37 -0000 1.233 *************** *** 573,577 **** if(type != null) { ! type = type.GetClassLoader().CreateArrayType(name, type, dims); } return type; --- 573,577 ---- if(type != null) { ! type = CreateArrayType(name, type, dims); } return type; *************** *** 585,603 **** { case 'B': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.BYTE, dims); case 'C': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.CHAR, dims); case 'D': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.DOUBLE, dims); case 'F': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.FLOAT, dims); case 'I': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.INT, dims); case 'J': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.LONG, dims); case 'S': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.SHORT, dims); case 'Z': ! return GetBootstrapClassLoader().CreateArrayType(name, PrimitiveTypeWrapper.BOOLEAN, dims); default: return null; --- 585,603 ---- { case 'B': ! return CreateArrayType(name, PrimitiveTypeWrapper.BYTE, dims); case 'C': ! return CreateArrayType(name, PrimitiveTypeWrapper.CHAR, dims); case 'D': ! return CreateArrayType(name, PrimitiveTypeWrapper.DOUBLE, dims); case 'F': ! return CreateArrayType(name, PrimitiveTypeWrapper.FLOAT, dims); case 'I': ! return CreateArrayType(name, PrimitiveTypeWrapper.INT, dims); case 'J': ! return CreateArrayType(name, PrimitiveTypeWrapper.LONG, dims); case 'S': ! return CreateArrayType(name, PrimitiveTypeWrapper.SHORT, dims); case 'Z': ! return CreateArrayType(name, PrimitiveTypeWrapper.BOOLEAN, dims); default: return null; *************** *** 812,821 **** } ! private TypeWrapper CreateArrayType(string name, TypeWrapper elementTypeWrapper, int dims) { Debug.Assert(new String('[', dims) + elementTypeWrapper.SigName == name); Debug.Assert(!elementTypeWrapper.IsUnloadable && !elementTypeWrapper.IsVerifierType && !elementTypeWrapper.IsArray); Debug.Assert(dims >= 1); ! return RegisterInitiatingLoader(new ArrayTypeWrapper(elementTypeWrapper, name)); } --- 812,821 ---- } ! private static TypeWrapper CreateArrayType(string name, TypeWrapper elementTypeWrapper, int dims) { Debug.Assert(new String('[', dims) + elementTypeWrapper.SigName == name); Debug.Assert(!elementTypeWrapper.IsUnloadable && !elementTypeWrapper.IsVerifierType && !elementTypeWrapper.IsArray); Debug.Assert(dims >= 1); ! return elementTypeWrapper.GetClassLoader().RegisterInitiatingLoader(new ArrayTypeWrapper(elementTypeWrapper, name)); } |
From: Jeroen F. <jfr...@us...> - 2015-03-22 07:48:13
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv6195 Modified Files: DynamicTypeWrapper.cs TypeWrapper.cs Log Message: Bug fix. Dynamica caller id should return host class for anonymous classes injected into host class. Index: TypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/TypeWrapper.cs,v retrieving revision 1.482 retrieving revision 1.483 diff -C2 -d -r1.482 -r1.483 *** TypeWrapper.cs 16 Mar 2015 07:03:43 -0000 1.482 --- TypeWrapper.cs 22 Mar 2015 07:48:10 -0000 1.483 *************** *** 3546,3549 **** --- 3546,3556 ---- return null; } + + #if !STATIC_COMPILER && !STUB_GENERATOR + internal virtual TypeWrapper Host + { + get { return null; } + } + #endif } Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.269 retrieving revision 1.270 diff -C2 -d -r1.269 -r1.270 *** DynamicTypeWrapper.cs 21 Mar 2015 06:47:16 -0000 1.269 --- DynamicTypeWrapper.cs 22 Mar 2015 07:48:10 -0000 1.270 *************** *** 463,466 **** --- 463,467 ---- internal abstract byte[] GetMethodRawTypeAnnotations(int index); internal abstract byte[] GetFieldRawTypeAnnotations(int index); + internal abstract TypeWrapper Host { get; } } *************** *** 1837,1841 **** } #endif ! finishedType = new FinishedTypeImpl(type, innerClassesTypeWrappers, declaringTypeWrapper, wrapper.ReflectiveModifiers, Metadata.Create(classFile), finishedClinitMethod, finalizeMethod); return finishedType; } --- 1838,1842 ---- } #endif ! finishedType = new FinishedTypeImpl(type, innerClassesTypeWrappers, declaringTypeWrapper, wrapper.ReflectiveModifiers, Metadata.Create(classFile), finishedClinitMethod, finalizeMethod, host); return finishedType; } *************** *** 3534,3537 **** --- 3535,3543 ---- return null; } + + internal override TypeWrapper Host + { + get { return host; } + } } *************** *** 3847,3852 **** private readonly MethodInfo finalizeMethod; private readonly Metadata metadata; ! internal FinishedTypeImpl(Type type, TypeWrapper[] innerclasses, TypeWrapper declaringTypeWrapper, Modifiers reflectiveModifiers, Metadata metadata, MethodInfo clinitMethod, MethodInfo finalizeMethod) { this.type = type; --- 3853,3859 ---- private readonly MethodInfo finalizeMethod; private readonly Metadata metadata; + private readonly TypeWrapper host; ! internal FinishedTypeImpl(Type type, TypeWrapper[] innerclasses, TypeWrapper declaringTypeWrapper, Modifiers reflectiveModifiers, Metadata metadata, MethodInfo clinitMethod, MethodInfo finalizeMethod, TypeWrapper host) { this.type = type; *************** *** 3857,3860 **** --- 3864,3868 ---- this.finalizeMethod = finalizeMethod; this.metadata = metadata; + this.host = host; } *************** *** 3994,3997 **** --- 4002,4010 ---- return Metadata.GetFieldRawTypeAnnotations(metadata, index); } + + internal override TypeWrapper Host + { + get { return host; } + } } *************** *** 7137,7140 **** --- 7150,7160 ---- } + #if !STATIC_COMPILER && !STUB_GENERATOR + internal override TypeWrapper Host + { + get { return impl.Host; } + } + #endif + [Conditional("STATIC_COMPILER")] internal void EmitLevel4Warning(HardError error, string message) *************** *** 7249,7253 **** } TypeWrapper caller = ClassLoaderWrapper.GetWrapperFromType(method.DeclaringType); ! return CreateCallerID(caller); } } --- 7269,7273 ---- } TypeWrapper caller = ClassLoaderWrapper.GetWrapperFromType(method.DeclaringType); ! return CreateCallerID(caller.Host ?? caller); } } |
From: Jeroen F. <jfr...@us...> - 2015-03-22 07:21:08
|
Update of /cvsroot/ikvm/ikvm/runtime/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5524 Modified Files: sun.reflect.cs Log Message: Added a hack to the deprecated Reflection.getCallerClass(int) version to skip LamdbaForm methods to report the right caller when dynamic binding is used. Index: sun.reflect.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/openjdk/sun.reflect.cs,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** sun.reflect.cs 11 Mar 2015 08:44:44 -0000 1.25 --- sun.reflect.cs 22 Mar 2015 07:21:06 -0000 1.26 *************** *** 141,152 **** return null; #else ! int i = 3; ! if (realFramesToSkip <= 1) { ! i = 1; ! realFramesToSkip = Math.Max(realFramesToSkip + 2, 2); } ! realFramesToSkip--; ! for (; ; ) { MethodBase method = new StackFrame(i++, false).GetMethod(); --- 141,149 ---- return null; #else ! if (realFramesToSkip <= 0) { ! return ikvm.@internal.ClassLiteral<sun.reflect.Reflection>.Value; } ! for (int i = 2; ; ) { MethodBase method = new StackFrame(i++, false).GetMethod(); *************** *** 159,162 **** --- 156,165 ---- continue; } + // HACK we skip HideFromJavaFlags.StackTrace too because we want to skip the LambdaForm methods + // that are used by late binding + if ((GetHideFromJavaFlags(method) & HideFromJavaFlags.StackTrace) != 0) + { + continue; + } if (--realFramesToSkip == 0) { |
From: Jeroen F. <jfr...@us...> - 2015-03-21 06:47:18
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv19953 Modified Files: DynamicTypeWrapper.cs Log Message: Bug fix. Handle ghost and value types in override stub signatures. Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.268 retrieving revision 1.269 diff -C2 -d -r1.268 -r1.269 *** DynamicTypeWrapper.cs 18 Mar 2015 08:36:26 -0000 1.268 --- DynamicTypeWrapper.cs 21 Mar 2015 06:47:16 -0000 1.269 *************** *** 6537,6544 **** typeBuilder.DefineMethodOverride(overrideStub, (MethodInfo)baseMethod.GetMethod()); ! Type stubret = baseMethod.ReturnTypeForDefineMethod; ! Type[] stubargs = baseMethod.GetParametersForDefineMethod(); ! Type targetRet = targetMethod.ReturnTypeForDefineMethod; ! Type[] targetArgs = targetMethod.GetParametersForDefineMethod(); CodeEmitter ilgen = CodeEmitter.Create(overrideStub); ilgen.Emit(OpCodes.Ldarg_0); --- 6537,6542 ---- typeBuilder.DefineMethodOverride(overrideStub, (MethodInfo)baseMethod.GetMethod()); ! TypeWrapper[] stubargs = baseMethod.GetParameters(); ! TypeWrapper[] targetArgs = targetMethod.GetParameters(); CodeEmitter ilgen = CodeEmitter.Create(overrideStub); ilgen.Emit(OpCodes.Ldarg_0); *************** *** 6546,6553 **** { ilgen.EmitLdarg(i + 1); ! if (targetArgs[i] != stubargs[i]) ! { ! ilgen.Emit(OpCodes.Castclass, targetArgs[i]); ! } } if (target != null) --- 6544,6548 ---- { ilgen.EmitLdarg(i + 1); ! ConvertStubArg(stubargs[i], targetArgs[i], ilgen); } if (target != null) *************** *** 6559,6570 **** targetMethod.EmitCallvirt(ilgen); } ! if (targetRet != stubret) ! { ! ilgen.Emit(OpCodes.Castclass, stubret); ! } ilgen.Emit(OpCodes.Ret); ilgen.DoEmit(); } private static void GetParameterNamesFromMP(ClassFile.Method m, string[] parameterNames) { --- 6554,6584 ---- targetMethod.EmitCallvirt(ilgen); } ! ConvertStubArg(targetMethod.ReturnType, baseMethod.ReturnType, ilgen); ilgen.Emit(OpCodes.Ret); ilgen.DoEmit(); } + private static void ConvertStubArg(TypeWrapper src, TypeWrapper dst, CodeEmitter ilgen) + { + if (src != dst) + { + if (dst.IsUnloadable) + { + if (!src.IsUnloadable && (src.IsGhost || src.IsNonPrimitiveValueType)) + { + src.EmitConvSignatureTypeToStackType(ilgen); + } + } + else if (dst.IsGhost || dst.IsNonPrimitiveValueType) + { + dst.EmitConvStackTypeToSignatureType(ilgen, null); + } + else + { + dst.EmitCheckcast(ilgen); + } + } + } + private static void GetParameterNamesFromMP(ClassFile.Method m, string[] parameterNames) { |
From: Jeroen F. <jfr...@us...> - 2015-03-21 06:40:49
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv19708 Modified Files: compiler.cs Log Message: Bug fix. Handle invocation of method on unloadable value type. Index: compiler.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/compiler.cs,v retrieving revision 1.261 retrieving revision 1.262 diff -C2 -d -r1.261 -r1.262 *** compiler.cs 20 Mar 2015 14:44:55 -0000 1.261 --- compiler.cs 21 Mar 2015 06:40:47 -0000 1.262 *************** *** 3441,3444 **** --- 3441,3448 ---- ilGenerator.EmitAssertType(declaringType.TypeAsTBD); } + else if(declaringType.IsNonPrimitiveValueType) + { + ilGenerator.Emit(OpCodes.Unbox, declaringType.TypeAsTBD); + } else { |
From: Jeroen F. <jfr...@us...> - 2015-03-20 14:44:57
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv15781 Modified Files: ByteCodeHelper.cs compiler.cs Log Message: Bug fix. Handle unloadable type in MH.invoke() signature. Index: ByteCodeHelper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/ByteCodeHelper.cs,v retrieving revision 1.99 retrieving revision 1.100 diff -C2 -d -r1.99 -r1.100 *** ByteCodeHelper.cs 13 Mar 2015 16:00:03 -0000 1.99 --- ByteCodeHelper.cs 20 Mar 2015 14:44:55 -0000 1.100 *************** *** 932,936 **** } ! public static T GetDelegateForInvoke<T>(global::java.lang.invoke.MethodHandle h, ref InvokeCache<T> cache) where T : class { --- 932,936 ---- } ! public static T GetDelegateForInvoke<T>(global::java.lang.invoke.MethodHandle h, java.lang.invoke.MethodType realType, ref InvokeCache<T> cache) where T : class { *************** *** 951,954 **** --- 951,959 ---- adapter = adapter.asVarargsCollector(h.type().parameterType(h.type().parameterCount() - 1)); } + // if realType is set, the delegate contains erased unloadable types + if (realType != null) + { + adapter = adapter.asType(realType.insertParameterTypes(0, ikvm.@internal.ClassLiteral<java.lang.invoke.MethodHandle>.Value)).asFixedArity(); + } adapter = adapter.asType(MethodHandleUtil.GetDelegateMethodType(typeof(T))); del = GetDelegateForInvokeExact<T>(adapter); Index: compiler.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/compiler.cs,v retrieving revision 1.260 retrieving revision 1.261 diff -C2 -d -r1.260 -r1.261 *** compiler.cs 19 Mar 2015 09:20:39 -0000 1.260 --- compiler.cs 20 Mar 2015 14:44:55 -0000 1.261 *************** *** 3748,3751 **** --- 3748,3763 ---- FieldBuilder fb = compiler.context.DefineMethodHandleInvokeCacheField(typeofInvokeCache.MakeGenericType(delegateType)); ilgen.Emit(OpCodes.Ldloc, temps[0]); + if (HasUnloadable(cpi.GetArgTypes(), cpi.GetRetType())) + { + // TODO consider sharing the cache for the same signatures + ilgen.Emit(OpCodes.Ldsflda, compiler.context.DefineDynamicMethodTypeCacheField()); + ilgen.Emit(OpCodes.Ldstr, cpi.Signature); + compiler.context.EmitCallerID(ilgen, compiler.m.IsLambdaFormCompiled); + ilgen.Emit(OpCodes.Call, ByteCodeHelperMethods.DynamicLoadMethodType); + } + else + { + ilgen.Emit(OpCodes.Ldnull); + } ilgen.Emit(OpCodes.Ldsflda, fb); ilgen.Emit(OpCodes.Call, mi); |
From: Jeroen F. <jfr...@us...> - 2015-03-19 14:59:13
|
Update of /cvsroot/ikvm/ikvm/runtime/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv12207 Modified Files: java.lang.invoke.cs Log Message: Bug fix. Disallow invokevirtual MH constant to resolve to interface method and disallow invokeinterface MH constant to resolve to non-public method. Index: java.lang.invoke.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/openjdk/java.lang.invoke.cs,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** java.lang.invoke.cs 13 Mar 2015 12:54:26 -0000 1.43 --- java.lang.invoke.cs 19 Mar 2015 14:59:10 -0000 1.44 *************** *** 302,305 **** --- 302,313 ---- throw new java.lang.IncompatibleClassChangeError(msg); } + if (self.getReferenceKind() == MethodHandleNatives.Constants.REF_invokeVirtual && mw.DeclaringType.IsInterface) + { + throw new java.lang.IncompatibleClassChangeError("Found interface " + mw.DeclaringType.Name + ", but class was expected"); + } + if (!mw.IsPublic && self.getReferenceKind() == MethodHandleNatives.Constants.REF_invokeInterface) + { + throw new java.lang.IncompatibleClassChangeError("private interface method requires invokespecial, not invokeinterface: method " + self.getDeclaringClass().getName() + "." + self.getName() + self.getSignature()); + } if (mw.IsConstructor && mw.DeclaringType == CoreClasses.java.lang.String.Wrapper) { |
From: Jeroen F. <jfr...@us...> - 2015-03-19 14:19:07
|
Update of /cvsroot/ikvm/ikvm/runtime/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv7398 Modified Files: java.lang.cs Log Message: Bug fix. Make sure inner classes are loadable. Index: java.lang.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/openjdk/java.lang.cs,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -d -r1.21 -r1.22 *** java.lang.cs 19 Mar 2015 14:14:13 -0000 1.21 --- java.lang.cs 19 Mar 2015 14:19:05 -0000 1.22 *************** *** 329,337 **** } decl.Finish(); ! if (Array.IndexOf(decl.InnerClasses, wrapper) == -1) { ! throw new IncompatibleClassChangeError(string.Format("{0} and {1} disagree on InnerClasses attribute", decl.Name, wrapper.Name)); } ! return decl.ClassObject; } catch (RetargetableJavaException x) --- 329,341 ---- } decl.Finish(); ! TypeWrapper[] declInner = decl.InnerClasses; ! for (int i = 0; i < declInner.Length; i++) { ! if (declInner[i].Name == wrapper.Name && declInner[i].EnsureLoadable(decl.GetClassLoader()) == wrapper) ! { ! return decl.ClassObject; ! } } ! throw new IncompatibleClassChangeError(string.Format("{0} and {1} disagree on InnerClasses attribute", decl.Name, wrapper.Name)); } catch (RetargetableJavaException x) |
From: Jeroen F. <jfr...@us...> - 2015-03-19 14:14:15
|
Update of /cvsroot/ikvm/ikvm/runtime/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv7066 Modified Files: java.lang.cs Log Message: Bug fix. Try loading unloadable declared classes instead of simply throwing a NoClassDefFoundError. Index: java.lang.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/openjdk/java.lang.cs,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** java.lang.cs 19 Mar 2015 13:54:40 -0000 1.20 --- java.lang.cs 19 Mar 2015 14:14:13 -0000 1.21 *************** *** 620,633 **** for (int i = 0; i < innerclasses.Length; i++) { ! if (wrappers[i].IsUnloadable) ! { ! throw new java.lang.NoClassDefFoundError(wrappers[i].Name); ! } ! if (!wrappers[i].IsAccessibleFrom(wrapper)) { ! throw new IllegalAccessError(string.Format("tried to access class {0} from class {1}", wrappers[i].Name, wrapper.Name)); } ! wrappers[i].Finish(); ! innerclasses[i] = wrappers[i].ClassObject; } return innerclasses; --- 620,630 ---- for (int i = 0; i < innerclasses.Length; i++) { ! TypeWrapper tw = wrappers[i].EnsureLoadable(wrapper.GetClassLoader()); ! if (!tw.IsAccessibleFrom(wrapper)) { ! throw new IllegalAccessError(string.Format("tried to access class {0} from class {1}", tw.Name, wrapper.Name)); } ! tw.Finish(); ! innerclasses[i] = tw.ClassObject; } return innerclasses; |
From: Jeroen F. <jfr...@us...> - 2015-03-19 13:54:42
|
Update of /cvsroot/ikvm/ikvm/runtime/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv5457 Modified Files: java.lang.cs Log Message: Bug fix. Make sure declaring class is loadable. Index: java.lang.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/openjdk/java.lang.cs,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** java.lang.cs 7 Jul 2014 07:40:35 -0000 1.19 --- java.lang.cs 19 Mar 2015 13:54:40 -0000 1.20 *************** *** 323,326 **** --- 323,327 ---- return null; } + decl = decl.EnsureLoadable(wrapper.GetClassLoader()); if (!decl.IsAccessibleFrom(wrapper)) { |
From: Jeroen F. <jfr...@us...> - 2015-03-19 09:50:54
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv28310 Modified Files: verifier.cs Log Message: Bug fix. Verifier would incorrectly report a loader constraints violated if a field type was not unloadable, but the field ref type was unloadable. Index: verifier.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/verifier.cs,v retrieving revision 1.124 retrieving revision 1.125 diff -C2 -d -r1.124 -r1.125 *** verifier.cs 5 Mar 2015 12:15:08 -0000 1.124 --- verifier.cs 19 Mar 2015 09:50:52 -0000 1.125 *************** *** 3874,3878 **** return; } ! if(cpi.GetFieldType() != field.FieldTypeWrapper && !field.FieldTypeWrapper.IsUnloadable) { #if STATIC_COMPILER --- 3874,3878 ---- return; } ! if(cpi.GetFieldType() != field.FieldTypeWrapper && !cpi.GetFieldType().IsUnloadable & !field.FieldTypeWrapper.IsUnloadable) { #if STATIC_COMPILER |
From: Jeroen F. <jfr...@us...> - 2015-03-19 09:20:41
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv27609 Modified Files: compiler.cs Log Message: Bug fix. Handle unloadable type in BSM extra arguments. Index: compiler.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/compiler.cs,v retrieving revision 1.259 retrieving revision 1.260 diff -C2 -d -r1.259 -r1.260 *** compiler.cs 12 Mar 2015 14:46:14 -0000 1.259 --- compiler.cs 19 Mar 2015 09:20:39 -0000 1.260 *************** *** 3191,3195 **** wrapper.GetMethodWrapper("valueOf", "(" + constType.SigName + ")" + wrapper.SigName, false).EmitCall(ilgen); } ! if (targetType.IsPrimitive) { string unbox; --- 3191,3199 ---- wrapper.GetMethodWrapper("valueOf", "(" + constType.SigName + ")" + wrapper.SigName, false).EmitCall(ilgen); } ! if (targetType.IsUnloadable) ! { ! // do nothing ! } ! else if (targetType.IsPrimitive) { string unbox; |
From: Jeroen F. <jfr...@us...> - 2015-03-19 08:02:41
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv25859 Modified Files: LocalVars.cs Log Message: Bug fix. Late bound invokespecial should also be handled in local variable analysis. Index: LocalVars.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/LocalVars.cs,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** LocalVars.cs 24 Mar 2013 12:40:33 -0000 1.10 --- LocalVars.cs 19 Mar 2015 08:02:39 -0000 1.11 *************** *** 155,159 **** else { ! if (instructions[i].NormalizedOpCode == NormalizedByteCode.__invokespecial) { invokespecialLocalVars[i] = new LocalVar[method.MaxLocals]; --- 155,159 ---- else { ! if (instructions[i].NormalizedOpCode == NormalizedByteCode.__invokespecial || instructions[i].NormalizedOpCode == NormalizedByteCode.__dynamic_invokespecial) { invokespecialLocalVars[i] = new LocalVar[method.MaxLocals]; |
From: Jeroen F. <jfr...@us...> - 2015-03-18 08:36:29
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv13668 Modified Files: DynamicTypeWrapper.cs Log Message: Bug fix Handle unloadable types in native method signature in JniProxyBuilder (used when -Xsave is used). Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.267 retrieving revision 1.268 diff -C2 -d -r1.267 -r1.268 *** DynamicTypeWrapper.cs 18 Mar 2015 08:34:17 -0000 1.267 --- DynamicTypeWrapper.cs 18 Mar 2015 08:36:26 -0000 1.268 *************** *** 5729,5736 **** // NOTE we take a shortcut here by assuming that all "special" types (i.e. ghost or value types) // are public and so we can get away with replacing all other types with object. ! argTypes[i + instance] = (args[i].IsPrimitive || args[i].IsGhost || args[i].IsNonPrimitiveValueType) ? args[i].TypeAsSignatureType : typeof(object); } argTypes[argTypes.Length - 1] = CoreClasses.ikvm.@internal.CallerID.Wrapper.TypeAsSignatureType; ! Type retType = (mw.ReturnType.IsPrimitive || mw.ReturnType.IsGhost || mw.ReturnType.IsNonPrimitiveValueType) ? mw.ReturnType.TypeAsSignatureType : typeof(object); MethodBuilder mb = tb.DefineMethod("method", MethodAttributes.Public | MethodAttributes.Static, retType, argTypes); AttributeHelper.HideFromJava(mb); --- 5729,5736 ---- // NOTE we take a shortcut here by assuming that all "special" types (i.e. ghost or value types) // are public and so we can get away with replacing all other types with object. ! argTypes[i + instance] = !args[i].IsUnloadable && (args[i].IsPrimitive || args[i].IsGhost || args[i].IsNonPrimitiveValueType) ? args[i].TypeAsSignatureType : typeof(object); } argTypes[argTypes.Length - 1] = CoreClasses.ikvm.@internal.CallerID.Wrapper.TypeAsSignatureType; ! Type retType = !mw.ReturnType.IsUnloadable && (mw.ReturnType.IsPrimitive || mw.ReturnType.IsGhost || mw.ReturnType.IsNonPrimitiveValueType) ? mw.ReturnType.TypeAsSignatureType : typeof(object); MethodBuilder mb = tb.DefineMethod("method", MethodAttributes.Public | MethodAttributes.Static, retType, argTypes); AttributeHelper.HideFromJava(mb); *************** *** 5745,5749 **** context.EmitCallerID(ilGenerator, m.IsLambdaFormCompiled); ilGenerator.Emit(OpCodes.Call, mb); ! if (!mw.ReturnType.IsPrimitive && !mw.ReturnType.IsGhost && !mw.ReturnType.IsNonPrimitiveValueType) { ilGenerator.Emit(OpCodes.Castclass, mw.ReturnType.TypeAsSignatureType); --- 5745,5749 ---- context.EmitCallerID(ilGenerator, m.IsLambdaFormCompiled); ilGenerator.Emit(OpCodes.Call, mb); ! if (!mw.ReturnType.IsUnloadable && !mw.ReturnType.IsPrimitive && !mw.ReturnType.IsGhost && !mw.ReturnType.IsNonPrimitiveValueType) { ilGenerator.Emit(OpCodes.Castclass, mw.ReturnType.TypeAsSignatureType); |
From: Jeroen F. <jfr...@us...> - 2015-03-18 08:34:19
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv13563 Modified Files: DynamicTypeWrapper.cs Log Message: Bug fix. Handle unloadable return type in native method signature. Index: DynamicTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DynamicTypeWrapper.cs,v retrieving revision 1.266 retrieving revision 1.267 diff -C2 -d -r1.266 -r1.267 *** DynamicTypeWrapper.cs 12 Mar 2015 14:46:14 -0000 1.266 --- DynamicTypeWrapper.cs 18 Mar 2015 08:34:17 -0000 1.267 *************** *** 5821,5825 **** ilGenerator.BeginExceptionBlock(); TypeWrapper retTypeWrapper = mw.ReturnType; ! if (!retTypeWrapper.IsUnloadable && !retTypeWrapper.IsPrimitive) { // this one is for use after we return from "calli" --- 5821,5825 ---- ilGenerator.BeginExceptionBlock(); TypeWrapper retTypeWrapper = mw.ReturnType; ! if (retTypeWrapper.IsUnloadable || !retTypeWrapper.IsPrimitive) { // this one is for use after we return from "calli" *************** *** 5893,5897 **** if (retTypeWrapper != PrimitiveTypeWrapper.VOID) { ! if (!retTypeWrapper.IsUnloadable && !retTypeWrapper.IsPrimitive) { ilGenerator.Emit(OpCodes.Call, unwrapLocalRef); --- 5893,5901 ---- if (retTypeWrapper != PrimitiveTypeWrapper.VOID) { ! if (retTypeWrapper.IsUnloadable) ! { ! ilGenerator.Emit(OpCodes.Call, unwrapLocalRef); ! } ! else if (!retTypeWrapper.IsPrimitive) { ilGenerator.Emit(OpCodes.Call, unwrapLocalRef); |
From: Jeroen F. <jfr...@us...> - 2015-03-16 09:00:21
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv2084 Modified Files: DotNetTypeWrapper.cs Log Message: Implemented delegate constructor invocation on existing object (to enable MethodHandle to construct a delegate). Index: DotNetTypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/DotNetTypeWrapper.cs,v retrieving revision 1.79 retrieving revision 1.80 diff -C2 -d -r1.79 -r1.80 *** DotNetTypeWrapper.cs 11 Mar 2015 12:38:33 -0000 1.79 --- DotNetTypeWrapper.cs 16 Mar 2015 09:00:19 -0000 1.80 *************** *** 1856,1860 **** { ilgen.Emit(OpCodes.Ldtoken, delegateConstructor.DeclaringType); ! ilgen.Emit(OpCodes.Call, Types.Type.GetMethod("GetTypeFromHandle", new Type[] { Types.RuntimeTypeHandle })); ilgen.Emit(OpCodes.Ldstr, GetDelegateInvokeStubName(DeclaringType.TypeAsTBD)); ilgen.Emit(OpCodes.Ldstr, iface.GetMethods()[0].Signature); --- 1856,1860 ---- { ilgen.Emit(OpCodes.Ldtoken, delegateConstructor.DeclaringType); ! ilgen.Emit(OpCodes.Call, Compiler.getTypeFromHandleMethod); ilgen.Emit(OpCodes.Ldstr, GetDelegateInvokeStubName(DeclaringType.TypeAsTBD)); ilgen.Emit(OpCodes.Ldstr, iface.GetMethods()[0].Signature); *************** *** 1862,1865 **** --- 1862,1879 ---- ilgen.Emit(OpCodes.Castclass, delegateConstructor.DeclaringType); } + + internal override void EmitCall(CodeEmitter ilgen) + { + // This is a bit of a hack. We bind the existing delegate to a new delegate to be able to reuse the DynamicCreateDelegate error + // handling. This leaks out to the user because Delegate.Target will return the target delegate instead of the bound object. + + // create the target delegate + EmitNewobj(ilgen); + + // invoke the constructor, binding the delegate to the target delegate + ilgen.Emit(OpCodes.Dup); + ilgen.Emit(OpCodes.Ldvirtftn, MethodHandleUtil.GetDelegateInvokeMethod(delegateConstructor.DeclaringType)); + ilgen.Emit(OpCodes.Call, delegateConstructor); + } #endif // EMITTERS } |
From: Jeroen F. <jfr...@us...> - 2015-03-16 07:03:46
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv31398 Modified Files: TypeWrapper.cs Log Message: Made the CallerID from signature stripping for CallerSensitive methods more robust. Index: TypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/TypeWrapper.cs,v retrieving revision 1.481 retrieving revision 1.482 diff -C2 -d -r1.481 -r1.482 *** TypeWrapper.cs 13 Mar 2015 12:54:26 -0000 1.481 --- TypeWrapper.cs 16 Mar 2015 07:03:43 -0000 1.482 *************** *** 4441,4451 **** } ! private bool IsCallerID(Type type) { #if STUB_GENERATOR return type.FullName == "ikvm.internal.CallerID"; #else ! return type == CoreClasses.ikvm.@internal.CallerID.Wrapper.TypeAsSignatureType ! && GetClassLoader() == ClassLoaderWrapper.GetBootstrapClassLoader(); #endif } --- 4441,4468 ---- } ! private static bool IsCallerID(Type type) { #if STUB_GENERATOR return type.FullName == "ikvm.internal.CallerID"; #else ! return type == CoreClasses.ikvm.@internal.CallerID.Wrapper.TypeAsSignatureType; ! #endif ! } ! ! private static bool IsCallerSensitive(MethodBase mb) ! { ! #if FIRST_PASS ! return false; ! #elif STATIC_COMPILER || STUB_GENERATOR ! foreach (CustomAttributeData cad in mb.GetCustomAttributesData()) ! { ! if (cad.AttributeType.FullName == "sun.reflect.CallerSensitiveAttribute") ! { ! return true; ! } ! } ! return false; ! #else ! return mb.IsDefined(typeof(sun.reflect.CallerSensitiveAttribute), false); #endif } *************** *** 4458,4462 **** if(len > 0 && IsCallerID(parameters[len - 1].ParameterType) ! && !method.DeclaringType.IsInterface) { len--; --- 4475,4480 ---- if(len > 0 && IsCallerID(parameters[len - 1].ParameterType) ! && GetClassLoader() == ClassLoaderWrapper.GetBootstrapClassLoader() ! && IsCallerSensitive(method)) { len--; |
From: Jeroen F. <jfr...@us...> - 2015-03-14 08:29:43
|
Update of /cvsroot/ikvm/ikvm/openjdk In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv24345 Modified Files: map.xml Log Message: Removed obsolete workaround. Index: map.xml =================================================================== RCS file: /cvsroot/ikvm/ikvm/openjdk/map.xml,v retrieving revision 1.109 retrieving revision 1.110 diff -C2 -d -r1.109 -r1.110 *** map.xml 6 Mar 2015 13:26:19 -0000 1.109 --- map.xml 14 Mar 2015 08:29:41 -0000 1.110 *************** *** 2966,2975 **** </class> <class name="java.lang.invoke.MethodHandles$Lookup"> - <!-- We have to disable this check, because we rely on Lookup.lookup() in our lambda bootstrap method --> - <method name="checkUnprivilegedlookupClass" sig="(Ljava.lang.Class;I)V"> - <body> - <ret /> - </body> - </method> <!-- We hook this to undo the fiddling we do to support string constructors --> <method name="revealDirect" sig="(Ljava.lang.invoke.MethodHandle;)Ljava.lang.invoke.MethodHandleInfo;"> --- 2966,2969 ---- |