[Ikvm-commit] ikvm/runtime LambdaMetafactory.cs, 1.7, 1.8 TypeWrapper.cs, 1.477, 1.478
Brought to you by:
jfrijters
|
From: Jeroen F. <jfr...@us...> - 2014-07-09 12:25:10
|
Update of /cvsroot/ikvm/ikvm/runtime In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv26692 Modified Files: LambdaMetafactory.cs TypeWrapper.cs Log Message: Added method and field reflection support for lambda classes. Index: TypeWrapper.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/TypeWrapper.cs,v retrieving revision 1.477 retrieving revision 1.478 diff -C2 -d -r1.477 -r1.478 *** TypeWrapper.cs 9 Jul 2014 08:45:25 -0000 1.477 --- TypeWrapper.cs 9 Jul 2014 12:25:08 -0000 1.478 *************** *** 4990,4994 **** } ! private static TypeWrapper GetFieldTypeWrapper(FieldInfo field) { return TypeWrapperFromModOpt(field.GetOptionalCustomModifiers()) --- 4990,4994 ---- } ! internal static TypeWrapper GetFieldTypeWrapper(FieldInfo field) { return TypeWrapperFromModOpt(field.GetOptionalCustomModifiers()) *************** *** 4996,5000 **** } ! private static TypeWrapper GetParameterTypeWrapper(ParameterInfo param) { TypeWrapper tw = TypeWrapperFromModOpt(param.GetOptionalCustomModifiers()); --- 4996,5000 ---- } ! internal static TypeWrapper GetParameterTypeWrapper(ParameterInfo param) { TypeWrapper tw = TypeWrapperFromModOpt(param.GetOptionalCustomModifiers()); *************** *** 5761,5776 **** protected override void LazyPublishMembers() { ! MethodInfo mi = type.GetMethod("writeReplace", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly, null, Type.EmptyTypes, null); ! if (mi != null) { ! SetMethods(new MethodWrapper[] { ! new TypicalMethodWrapper(this, "writeReplace", "()Ljava.lang.Object;", mi, CoreClasses.java.lang.Object.Wrapper, TypeWrapper.EmptyArray, Modifiers.Private, MemberFlags.None) ! }); } ! else { ! SetMethods(MethodWrapper.EmptyArray); } ! SetFields(FieldWrapper.EmptyArray); } } --- 5761,5809 ---- protected override void LazyPublishMembers() { ! List<MethodWrapper> methods = new List<MethodWrapper>(); ! foreach (MethodInfo mi in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { ! if (mi.IsSpecialName) ! { ! // we use special name to hide default methods ! } ! else if (mi.IsPublic) ! { ! TypeWrapper returnType; ! TypeWrapper[] parameterTypes; ! string signature; ! GetSig(mi, out returnType, out parameterTypes, out signature); ! methods.Add(new TypicalMethodWrapper(this, mi.Name, signature, mi, returnType, parameterTypes, Modifiers.Public, MemberFlags.None)); ! } ! else if (mi.Name == "writeReplace") ! { ! methods.Add(new TypicalMethodWrapper(this, "writeReplace", "()Ljava.lang.Object;", mi, CoreClasses.java.lang.Object.Wrapper, TypeWrapper.EmptyArray, ! Modifiers.Private | Modifiers.Final, MemberFlags.None)); ! } } ! SetMethods(methods.ToArray()); ! List<FieldWrapper> fields = new List<FieldWrapper>(); ! foreach (FieldInfo fi in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly)) { ! TypeWrapper fieldType = CompiledTypeWrapper.GetFieldTypeWrapper(fi); ! fields.Add(new SimpleFieldWrapper(this, fieldType, fi, fi.Name, fieldType.SigName, new ExModifiers(Modifiers.Private | Modifiers.Final, false))); } ! SetFields(fields.ToArray()); ! } ! ! private void GetSig(MethodInfo mi, out TypeWrapper returnType, out TypeWrapper[] parameterTypes, out string signature) ! { ! returnType = CompiledTypeWrapper.GetParameterTypeWrapper(mi.ReturnParameter); ! ParameterInfo[] parameters = mi.GetParameters(); ! parameterTypes = new TypeWrapper[parameters.Length]; ! System.Text.StringBuilder sb = new System.Text.StringBuilder("("); ! for (int i = 0; i < parameters.Length; i++) ! { ! parameterTypes[i] = CompiledTypeWrapper.GetParameterTypeWrapper(parameters[i]); ! sb.Append(parameterTypes[i].SigName); ! } ! sb.Append(')'); ! sb.Append(returnType.SigName); ! signature = sb.ToString(); } } Index: LambdaMetafactory.cs =================================================================== RCS file: /cvsroot/ikvm/ikvm/runtime/LambdaMetafactory.cs,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** LambdaMetafactory.cs 9 Jul 2014 08:45:25 -0000 1.7 --- LambdaMetafactory.cs 9 Jul 2014 12:25:08 -0000 1.8 *************** *** 404,408 **** attr |= FieldAttributes.InitOnly; } ! capturedFields[i] = tb.DefineField("c" + i, capturedTypes[i], attr); } --- 404,408 ---- attr |= FieldAttributes.InitOnly; } ! capturedFields[i] = tb.DefineField("arg$" + (i + 1), capturedTypes[i], attr); } *************** *** 480,484 **** ClassFile.ConstantPoolItemMethodHandle implMethod, ClassFile.ConstantPoolItemMethodType instantiatedMethodType, FieldBuilder[] capturedFields) { ! MethodBuilder mb = interfaceMethod.GetDefineMethodHelper().DefineMethod(context.TypeWrapper, tb, interfaceMethod.RealName, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final); CodeEmitter ilgen = CodeEmitter.Create(mb); for (int i = 0; i < capturedFields.Length; i++) --- 480,488 ---- ClassFile.ConstantPoolItemMethodHandle implMethod, ClassFile.ConstantPoolItemMethodType instantiatedMethodType, FieldBuilder[] capturedFields) { ! MethodBuilder mb = interfaceMethod.GetDefineMethodHelper().DefineMethod(context.TypeWrapper, tb, interfaceMethod.Name, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final); ! if (interfaceMethod.Name != interfaceMethod.RealName) ! { ! tb.DefineMethodOverride(mb, (MethodInfo)interfaceMethod.GetMethod()); ! } CodeEmitter ilgen = CodeEmitter.Create(mb); for (int i = 0; i < capturedFields.Length; i++) *************** *** 681,684 **** --- 685,690 ---- private static void AddDefaultInterfaceMethods(DynamicTypeWrapper.FinishContext context, MethodWrapper[] methodList, TypeBuilder tb) { + // we use special name to hide these from Java reflection + const MethodAttributes attr = MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final | MethodAttributes.SpecialName; TypeWrapperFactory factory = context.TypeWrapper.GetClassLoader().GetTypeWrapperFactory(); foreach (MethodWrapper mw in methodList) *************** *** 686,695 **** if (!mw.IsAbstract) { ! MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(factory, tb, mw.RealName, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final); DynamicTypeWrapper.FinishContext.EmitCallDefaultInterfaceMethod(mb, mw); } else if (IsObjectMethod(mw)) { ! MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(factory, tb, mw.RealName, MethodAttributes.Public | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final); CodeEmitter ilgen = CodeEmitter.Create(mb); for (int i = 0, count = mw.GetParameters().Length; i <= count; i++) --- 692,709 ---- if (!mw.IsAbstract) { ! MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(factory, tb, mw.Name, attr); ! if (mw.Name != mw.RealName) ! { ! tb.DefineMethodOverride(mb, (MethodInfo)mw.GetMethod()); ! } DynamicTypeWrapper.FinishContext.EmitCallDefaultInterfaceMethod(mb, mw); } else if (IsObjectMethod(mw)) { ! MethodBuilder mb = mw.GetDefineMethodHelper().DefineMethod(factory, tb, mw.Name, attr); ! if (mw.Name != mw.RealName) ! { ! tb.DefineMethodOverride(mb, (MethodInfo)mw.GetMethod()); ! } CodeEmitter ilgen = CodeEmitter.Create(mb); for (int i = 0, count = mw.GetParameters().Length; i <= count; i++) |