@@ -388,7 +388,10 @@ private static void AddVirtualMethod(MethodInfo method, Type baseType, TypeBuild
388388 private static void AddPythonMethod ( string methodName , PyObject func , TypeBuilder typeBuilder )
389389 {
390390 if ( func . HasAttr ( "_clr_method_name_" ) )
391- methodName = func . GetAttr ( "_clr_method_name_" ) . ToString ( ) ;
391+ {
392+ using ( PyObject pyMethodName = func . GetAttr ( "_clr_method_name_" ) )
393+ methodName = pyMethodName . ToString ( ) ;
394+ }
392395
393396 using ( PyObject pyReturnType = func . GetAttr ( "_clr_return_type_" ) )
394397 using ( PyObject pyArgTypes = func . GetAttr ( "_clr_arg_types_" ) )
@@ -477,37 +480,45 @@ private static void AddPythonProperty(string propertyName, PyObject func, TypeBu
477480 propertyType ,
478481 null ) ;
479482
480- if ( func . HasAttr ( "fget" ) && func . GetAttr ( "fget" ) . IsTrue ( ) )
483+ if ( func . HasAttr ( "fget" ) )
481484 {
482- MethodBuilder methodBuilder = typeBuilder . DefineMethod ( "get_" + propertyName ,
483- methodAttribs ,
484- propertyType ,
485- null ) ;
486-
487- ILGenerator il = methodBuilder . GetILGenerator ( ) ;
488- il . Emit ( OpCodes . Ldarg_0 ) ;
489- il . Emit ( OpCodes . Ldstr , propertyName ) ;
490- il . Emit ( OpCodes . Call , typeof ( PythonDerivedType ) . GetMethod ( "InvokeGetProperty" ) . MakeGenericMethod ( propertyType ) ) ;
491- il . Emit ( OpCodes . Ret ) ;
492-
493- propertyBuilder . SetGetMethod ( methodBuilder ) ;
485+ using ( PyObject pyfget = func . GetAttr ( "fget" ) )
486+ if ( pyfget . IsTrue ( ) )
487+ {
488+ MethodBuilder methodBuilder = typeBuilder . DefineMethod ( "get_" + propertyName ,
489+ methodAttribs ,
490+ propertyType ,
491+ null ) ;
492+
493+ ILGenerator il = methodBuilder . GetILGenerator ( ) ;
494+ il . Emit ( OpCodes . Ldarg_0 ) ;
495+ il . Emit ( OpCodes . Ldstr , propertyName ) ;
496+ il . Emit ( OpCodes . Call , typeof ( PythonDerivedType ) . GetMethod ( "InvokeGetProperty" ) . MakeGenericMethod ( propertyType ) ) ;
497+ il . Emit ( OpCodes . Ret ) ;
498+
499+ propertyBuilder . SetGetMethod ( methodBuilder ) ;
500+ }
494501 }
495502
496- if ( func . HasAttr ( "fset" ) && func . GetAttr ( "fset" ) . IsTrue ( ) )
503+ if ( func . HasAttr ( "fset" ) )
497504 {
498- MethodBuilder methodBuilder = typeBuilder . DefineMethod ( "set_" + propertyName ,
499- methodAttribs ,
500- null ,
501- new Type [ ] { propertyType } ) ;
502-
503- ILGenerator il = methodBuilder . GetILGenerator ( ) ;
504- il . Emit ( OpCodes . Ldarg_0 ) ;
505- il . Emit ( OpCodes . Ldstr , propertyName ) ;
506- il . Emit ( OpCodes . Ldarg_1 ) ;
507- il . Emit ( OpCodes . Call , typeof ( PythonDerivedType ) . GetMethod ( "InvokeSetProperty" ) . MakeGenericMethod ( propertyType ) ) ;
508- il . Emit ( OpCodes . Ret ) ;
509-
510- propertyBuilder . SetSetMethod ( methodBuilder ) ;
505+ using ( PyObject pyset = func . GetAttr ( "fset" ) )
506+ if ( pyset . IsTrue ( ) )
507+ {
508+ MethodBuilder methodBuilder = typeBuilder . DefineMethod ( "set_" + propertyName ,
509+ methodAttribs ,
510+ null ,
511+ new Type [ ] { propertyType } ) ;
512+
513+ ILGenerator il = methodBuilder . GetILGenerator ( ) ;
514+ il . Emit ( OpCodes . Ldarg_0 ) ;
515+ il . Emit ( OpCodes . Ldstr , propertyName ) ;
516+ il . Emit ( OpCodes . Ldarg_1 ) ;
517+ il . Emit ( OpCodes . Call , typeof ( PythonDerivedType ) . GetMethod ( "InvokeSetProperty" ) . MakeGenericMethod ( propertyType ) ) ;
518+ il . Emit ( OpCodes . Ret ) ;
519+
520+ propertyBuilder . SetSetMethod ( methodBuilder ) ;
521+ }
511522 }
512523 }
513524 }
0 commit comments