55using System . Linq ;
66using System . Linq . Expressions ;
77using System . Reflection ;
8- using System . Reflection . Emit ;
98using System . Text ;
109
11- using Mono . Linq . Expressions ;
12-
1310using Java . Interop ;
1411
1512namespace Java . Interop . Dynamic {
1613
1714 public class DynamicJavaClass : IDynamicMetaObjectProvider
1815 {
16+ readonly static Func < string , JniPeerMembers > CreatePeerMembers ;
17+
18+ static DynamicJavaClass ( )
19+ {
20+ CreatePeerMembers = ( Func < string , JniPeerMembers > )
21+ Delegate . CreateDelegate (
22+ typeof ( Func < string , JniPeerMembers > ) ,
23+ typeof ( JniPeerMembers ) . GetMethod ( "CreatePeerMembers" , BindingFlags . NonPublic | BindingFlags . Static ) ) ;
24+ if ( CreatePeerMembers == null )
25+ throw new NotSupportedException ( "Could not find JniPeerMembers.CreatePeerMembers!" ) ;
26+ }
27+
1928 public string JniClassName { get ; private set ; }
2029
2130 JniPeerMembers members ;
@@ -26,7 +35,7 @@ public DynamicJavaClass (string jniClassName)
2635 throw new ArgumentNullException ( "jniClassName" ) ;
2736
2837 JniClassName = jniClassName ;
29- members = new JniPeerMembers ( jniClassName , CreateManagedPeerType ( ) ) ;
38+ members = CreatePeerMembers ( jniClassName ) ;
3039 }
3140
3241 DynamicMetaObject IDynamicMetaObjectProvider . GetMetaObject ( Expression parameter )
@@ -41,7 +50,7 @@ internal StaticMethodAccess GetStaticMethodAccess (InvokeMemberBinder binder, Dy
4150
4251 public object CallStaticMethod ( InvokeMemberBinder binder , DynamicMetaObject [ ] args , Type returnType )
4352 {
44- Console . WriteLine ( "# DynamicJavaClass({0}).invoke({1}) with args({2}) as {3}" ,
53+ Debug . WriteLine ( "# DynamicJavaClass({0}).invoke({1}) with args({2}) as {3}" ,
4554 JniClassName , binder . Name , string . Join ( ", " , args . Select ( a => a . Value ) ) , returnType ) ;
4655 var encoded = GetEncodedJniSignature ( binder , args , returnType ) ;
4756 var margs = args . Select ( arg => new JniArgumentMarshalInfo ( arg . Value , arg . LimitType ) ) . ToList ( ) ;
@@ -73,15 +82,15 @@ static string GetEncodedJniSignature (InvokeMemberBinder binder, DynamicMetaObje
7382
7483 public object GetStaticFieldValue ( string fieldName , Type fieldType )
7584 {
76- Console . WriteLine ( "# DynamicJavaClass({0}).field({1}) as {2}" , JniClassName , fieldName , fieldType ) ;
85+ Debug . WriteLine ( "# DynamicJavaClass({0}).field({1}) as {2}" , JniClassName , fieldName , fieldType ) ;
7786 var typeInfo = JniEnvironment . Current . JavaVM . GetJniTypeInfoForType ( fieldType ) ;
7887 var encoded = fieldName + "\u0000 " + typeInfo . ToString ( ) ;
7988 return members . StaticFields . GetValue ( encoded ) ;
8089 }
8190
8291 public void SetStaticFieldValue ( string fieldName , Type fieldType , object value )
8392 {
84- Console . WriteLine ( "# DynamicJavaClass({0}).field({1}) as {2} = {3}" , JniClassName , fieldName , fieldType , value ) ;
93+ Debug . WriteLine ( "# DynamicJavaClass({0}).field({1}) as {2} = {3}" , JniClassName , fieldName , fieldType , value ) ;
8594 var typeInfo = JniEnvironment . Current . JavaVM . GetJniTypeInfoForType ( fieldType ) ;
8695 var encoded = fieldName + "\u0000 " + typeInfo . ToString ( ) ;
8796 members . StaticFields . SetValue ( encoded , value ) ;
@@ -92,6 +101,7 @@ internal StaticFieldAccess GetStaticFieldAccess (string fieldName)
92101 return new StaticFieldAccess ( this , fieldName ) ;
93102 }
94103
104+ #if false
95105 Type CreateManagedPeerType ( )
96106 {
97107 var className = JniClassName . Replace ( '/' , '-' ) ;
@@ -107,6 +117,7 @@ Type CreateManagedPeerType ()
107117
108118 return type . CreateType ( ) ;
109119 }
120+ #endif
110121 }
111122
112123 class DynamicMetaObject < T > : DynamicMetaObject {
@@ -130,20 +141,20 @@ class MetaStaticMemberAccessObject : DynamicMetaObject<DynamicJavaClass>
130141 public MetaStaticMemberAccessObject ( Expression parameter , DynamicJavaClass value )
131142 : base ( parameter , value )
132143 {
133- Console . WriteLine ( "# MyMetaObject..ctor: paramter={0} {1} {2}" , parameter . ToCSharpCode ( ) , parameter . GetType ( ) , parameter . Type ) ;
134- Console . WriteLine ( "# MyMetaObject..ctor: value={0} {1}" , value , value . GetType ( ) ) ;
144+ // Console.WriteLine ("# MyMetaObject..ctor: paramter={0} {1} {2}", parameter.ToCSharpCode (), parameter.GetType (), parameter.Type);
145+ Debug . WriteLine ( "# MyMetaObject..ctor: value={0} {1}" , value , value . GetType ( ) ) ;
135146 }
136147
137148 public override DynamicMetaObject BindConvert ( ConvertBinder binder )
138149 {
139- Console . WriteLine ( "Convert: Expression={0} [{1}]" , Expression . ToCSharpCode ( ) , Expression . Type ) ;
150+ // Console.WriteLine ("Convert: Expression={0} [{1}]", Expression.ToCSharpCode (), Expression.Type);
140151 throw new NotSupportedException ( "How is this being invoked?!" ) ;
141152 }
142153
143154 public override DynamicMetaObject BindInvokeMember ( InvokeMemberBinder binder , DynamicMetaObject [ ] args )
144155 {
145- Console . WriteLine ( "InvokeMember of method={0}; ReturnType={1}; args={{{2}}}; CallInfo={3}" , binder . Name , binder . ReturnType ,
146- string . Join ( ", " , args . Select ( a => string . Format ( "{0} [{1}]" , a . Expression . ToCSharpCode ( ) , a . LimitType ) ) ) , binder . CallInfo ) ;
156+ // Console.WriteLine ("InvokeMember of method={0}; ReturnType={1}; args={{{2}}}; CallInfo={3}", binder.Name, binder.ReturnType,
157+ // string.Join (", ", args.Select (a => string.Format ("{0} [{1}]", a.Expression.ToCSharpCode (), a.LimitType))), binder.CallInfo);
147158
148159 Func < InvokeMemberBinder , DynamicMetaObject [ ] , StaticMethodAccess > gsma = Value . GetStaticMethodAccess ;
149160
@@ -162,7 +173,7 @@ public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, Dy
162173
163174 public override DynamicMetaObject BindSetMember ( SetMemberBinder binder , DynamicMetaObject value )
164175 {
165- Console . WriteLine ( "SetMember: Expression={0} [{1}]; property={2}; value.LimitType={3}; value.RuntimeType={4}; value.Value={5}" , Expression . ToCSharpCode ( ) , Expression . Type , binder . Name , value . LimitType , value . RuntimeType , value . Value ) ;
176+ // Console.WriteLine ("SetMember: Expression={0} [{1}]; property={2}; value.LimitType={3}; value.RuntimeType={4}; value.Value={5}", Expression.ToCSharpCode (), Expression.Type, binder.Name, value.LimitType, value.RuntimeType, value.Value);
166177 var self = Value ;
167178 var fieldValue = value . Expression ;
168179 if ( ! value . HasValue ) {
@@ -184,7 +195,7 @@ public override DynamicMetaObject BindSetMember(SetMemberBinder binder, DynamicM
184195
185196 public override DynamicMetaObject BindGetMember ( GetMemberBinder binder )
186197 {
187- Console . WriteLine ( "GetMember: Expression={0} [{1}]; property={2}" , Expression . ToCSharpCode ( ) , Expression . Type , binder . Name ) ;
198+ // Console.WriteLine ("GetMember: Expression={0} [{1}]; property={2}", Expression.ToCSharpCode (), Expression.Type, binder.Name);
188199 var expr =
189200 Expression . Call (
190201 ExpressionAsT ,
@@ -213,7 +224,7 @@ public StaticMethodAccess (DynamicJavaClass klass, InvokeMemberBinder invokeBind
213224
214225 public DynamicMetaObject GetMetaObject ( Expression parameter )
215226 {
216- Console . WriteLine ( "# StaticMethodAccess.GetMetaObject: parameter={0}" , parameter ) ;
227+ // Console.WriteLine ("# StaticMethodAccess.GetMetaObject: parameter={0}", parameter);
217228 return new MetaStaticMethodAccessObject ( parameter , this ) ;
218229 }
219230 }
@@ -223,12 +234,12 @@ class MetaStaticMethodAccessObject : DynamicMetaObject<StaticMethodAccess> {
223234 public MetaStaticMethodAccessObject ( Expression e , StaticMethodAccess value )
224235 : base ( e , value )
225236 {
226- Console . WriteLine ( "MetaStaticMethodAccessObject: e={0}" , e . ToCSharpCode ( ) ) ;
237+ // Console.WriteLine ("MetaStaticMethodAccessObject: e={0}", e.ToCSharpCode ());
227238 }
228239
229240 public override DynamicMetaObject BindConvert ( ConvertBinder binder )
230241 {
231- Console . WriteLine ( "MetaStaticMethodAccessObject.Convert: Expression={0} [{1}]" , Expression . ToCSharpCode ( ) , Expression . Type ) ;
242+ // Console.WriteLine ("MetaStaticMethodAccessObject.Convert: Expression={0} [{1}]", Expression.ToCSharpCode (), Expression.Type);
232243
233244 var method = ExpressionAsT ;
234245 var instance = Expression . Property ( method , "JavaClass" ) ;
@@ -259,7 +270,7 @@ public StaticFieldAccess (DynamicJavaClass klass, string fieldName)
259270
260271 public DynamicMetaObject GetMetaObject ( Expression parameter )
261272 {
262- Console . WriteLine ( "# FieldAccessInfo.GetMetaObject: parameter={0}" , parameter ) ;
273+ // Console.WriteLine ("# FieldAccessInfo.GetMetaObject: parameter={0}", parameter);
263274 return new MetaStaticFieldAccessObject ( parameter , this ) ;
264275 }
265276 }
@@ -269,12 +280,12 @@ class MetaStaticFieldAccessObject : DynamicMetaObject<StaticFieldAccess> {
269280 public MetaStaticFieldAccessObject ( Expression e , StaticFieldAccess value )
270281 : base ( e , value )
271282 {
272- Console . WriteLine ( "MyHelperObject: e={0}" , e . ToCSharpCode ( ) ) ;
283+ // Console.WriteLine ("MyHelperObject: e={0}", e.ToCSharpCode ());
273284 }
274285
275286 public override DynamicMetaObject BindConvert ( ConvertBinder binder )
276287 {
277- Console . WriteLine ( "MetaStaticFieldAccessObject.Convert: Expression={0} [{1}]" , Expression . ToCSharpCode ( ) , Expression . Type ) ;
288+ // Console.WriteLine ("MetaStaticFieldAccessObject.Convert: Expression={0} [{1}]", Expression.ToCSharpCode (), Expression.Type);
278289
279290 var field = ExpressionAsT ;
280291 var instance = Expression . Property ( field , "JavaClass" ) ;
0 commit comments