[IronPython] .NET attributes for methods

Lukas Cenovsky cenovsky at bakalari.cz
Fri Nov 13 15:20:46 CET 2009


I also tested creating interfaces and it fails with the exception below. 
Does this mean it will not be possible to use IronPython interface in 
Silverlight because of AppDomain?

--
-- Lukáš


    SystemError: Application code cannot access System.AppDomain.get_CurrentDomain() using Reflection.

clrtype.py
|Line 180:             validate_clr_types(b)
Line 181:         if not ClrInterface.interface_module_builder:
Line 182: 
            assembly_builder = AppDomain.CurrentDomain.DefineDynamicAssembly(AssemblyName("interfaces"), AssemblyBuilderAccess.Run)
Line 183: 
            ClrInterface.interface_module_builder = assembly_builder.DefineDynamicModule("interfaces")
Line 184: 
        attrs = TypeAttributes.Public | TypeAttributes.Interface | TypeAttributes.Abstract 
|

SystemError
|at define_interface in clrtype.py, line 182
at __clrtype__ in clrtype.py, line 213
at app.py in app.py, line 12
CLR Stack Trace:
   at System.Reflection.MethodBase.PerformSecurityCheck(Object obj, RuntimeMethodHandle method, IntPtr parent, UInt32 invocationFlags) 

   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) 

   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) 

   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Microsoft.Scripting.Actions.Calls.MethodCandidate.Caller.Call(Object[] args, Boolean& shouldOptimize) 

   at IronPython.Runtime.Types.BuiltinFunction.BuiltinFunctionCaller`1.Call0(CallSite site, CodeContext context, TFuncType func) 

   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) 

   at IronPython.Runtime.Types.BuiltinFunction.Call0(CodeContext context, SiteLocalStorage`1 storage, Object instance) 

   at IronPython.Runtime.Types.ReflectedProperty.CallGetter(CodeContext context, PythonType owner, SiteLocalStorage`1 storage, Object instance) 

   at IronPython.Runtime.Types.ReflectedProperty.TryGetValue(CodeContext context, Object instance, PythonType owner, Object& value) 

   at IronPython.Runtime.Binding.MetaPythonType.FastGetBinderHelper.SlotAccessDelegate.Target(CodeContext context, Object self, Object& result) 

   at IronPython.Runtime.Types.TypeGetBase.RunDelegatesNoOptimize(Object self, CodeContext context) 

   at IronPython.Runtime.Types.SystemTypeGet.Target(CallSite site, Object self, CodeContext context) 

   at System.Dynamic.UpdateDelegates.UpdateAndExecute2[T0,T1,TRet](CallSite site, T0 arg0, T1 arg1) 

   at clrtype$3.define_interface$21(PythonFunction $function, Object typename, Object bases) 

   at IronPython.Runtime.PythonFunction.FunctionCaller`2.Call2(CallSite site, CodeContext context, Object func, T0 arg0, T1 arg1) 

   at System.Dynamic.UpdateDelegates.UpdateAndExecute4[T0,T1,T2,T3,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3) 

   at clrtype$3.__clrtype__$23(PythonFunction $function, Object self)
   at IronPython.Runtime.PythonFunction.FunctionCaller`1.Call1(CallSite site, CodeContext context, Object func, T0 arg0) 

   at CallSite.Target(Closure , CallSite , CodeContext , Object )
   at IronPython.NewTypes.IronPython.Runtime.Types.PythonType_1$1.__clrtype__() 

   at IronPython.Runtime.Types.PythonType.InitializeUserType(CodeContext context, String name, PythonTuple bases, PythonDictionary vars) 

   at IronPython.Runtime.Types.PythonType..ctor(CodeContext context, String name, PythonTuple bases, PythonDictionary dict) 

   at IronPython.NewTypes.IronPython.Runtime.Types.PythonType_1$1..ctor(CodeContext context, PythonType cls, String name, PythonTuple bases, PythonDictionary dict) 

   at CallSite.Target(Closure , CallSite , CodeContext , BuiltinFunction , PythonType , Object , Object , Object ) 

   at System.Dynamic.UpdateDelegates.UpdateAndExecute6[T0,T1,T2,T3,T4,T5,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5) 

   at IronPython.Runtime.Types.UserInstanceCreator.CreateInstance(CodeContext context, Object arg0, Object arg1, Object arg2) 

   at IronPython.Runtime.Types.PythonType.CreateInstance(CodeContext context, Object arg0, Object arg1, Object arg2) 

   at IronPython.Runtime.Types.PythonType.__new__(CodeContext context, PythonType cls, String name, PythonTuple bases, PythonDictionary dict) 

   at CallSite.Target(Closure , CallSite , CodeContext , Object , String , PythonTuple , PythonDictionary ) 

   at System.Dynamic.UpdateDelegates.UpdateAndExecute5[T0,T1,T2,T3,T4,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2, T3 arg3, T4 arg4) 

   at CallSite.Target(Closure , CallSite , CodeContext , Object , String , PythonTuple , PythonDictionary ) 

   at IronPython.Runtime.Operations.PythonOps.MakeClass(CodeContext context, String name, Object[] bases, String selfNames, PythonDictionary vars) 

   at IronPython.Runtime.Operations.PythonOps.MakeClass(Object body, CodeContext parentContext, String name, Object[] bases, String selfNames) 

   at <unnamed>$1.<unnamed>(CodeContext $globalContext, FunctionCode functionCode) 

   at IronPython.Compiler.PythonScriptCode.RunWorker(CodeContext ctx)
   at IronPython.Compiler.PythonScriptCode.Run(Scope scope)
   at IronPython.Compiler.RuntimeScriptCode.InvokeTarget(Scope scope)
   at IronPython.Compiler.RuntimeScriptCode.Run(Scope scope)
   at Microsoft.Scripting.Hosting.CompiledCode.Execute(ScriptScope scope)
   at Microsoft.Scripting.Silverlight.DynamicEngine.Run(String entryPoint)
   at Microsoft.Scripting.Silverlight.DynamicApplication.<DynamicApplication_Startup>b__1() 

   at Microsoft.Scripting.Silverlight.Cache.Download(List`1 uris, Action onComplete) 

   at Microsoft.Scripting.Silverlight.HttpVirtualFilesystem.DownloadAndCache(List`1 uris, Action onComplete) 

   at Microsoft.Scripting.Silverlight.DynamicScriptTags.DownloadExternalCode(Action onComplete) 

   at Microsoft.Scripting.Silverlight.DynamicApplication.<DynamicApplication_Startup>b__0() 

   at Microsoft.Scripting.Silverlight.DynamicLanguageConfig.DownloadLanguages(DynamicAppManifest appManifest, Action onComplete) 

   at Microsoft.Scripting.Silverlight.DynamicApplication.DynamicApplication_Startup(Object sender, StartupEventArgs e) 

   at System.Windows.CoreInvokeHandler.InvokeEventHandler(Int32 typeIndex, Delegate handlerDelegate, Object sender, Object args) 

   at MS.Internal.JoltHelper.FireEvent(IntPtr unmanagedObj, IntPtr unmanagedObjArgs, Int32 argsTypeIndex, String eventName) 
|


Shri Borde wrote:
>
> Here is an updated version of clrtype.py that uses @property + 
> @clrtype.accepts/@clrtype.returns to indicate a CLR property, instead 
> of using "_clrproperties". I think its more Pythonic in general, but 
> also you should be able to modify @notify_property to work with it.
>
>  
>
> Note that notify_property won't just work. You will have to change it 
> to propagate the func_name, arg_types, and return_type properties from 
> the old getter/setter function objects to the new getter/setter 
> function objects since these values are used by clrtype to generate 
> the CLR members. Something like this:
>
>  
>
> class notify_property(property):
>
>  
>
>     def propagate_attributes(old_function, new_function):
>
>         new_function.func_name = old_function.func_name
>
>         new_function.arg_types = old_function.arg_types
>
>         new_function.return_type = old_function.return_type
>
>  
>
>     def __init__(self, getter):
>
>         def newgetter(slf):
>
>             try:
>
>                 return getter(slf)
>
>             except AttributeError:
>
>                 return None
>
>         propagate_attributes(getter, newgetter)
>
>         super(notify_property, self).__init__(newgetter)
>
>  
>
>     def setter(self, setter):
>
>         def newsetter(slf, newvalue):
>
>             oldvalue = self.fget(slf)
>
>             if oldvalue != newvalue:
>
>                 setter(slf, newvalue)
>
>                 slf.OnPropertyChanged(setter.__name__)
>
>         propagate_attributes(setter, newsetter)
>
>         return property(
>
>             fget=self.fget,
>
>             fset=newsetter,
>
>             fdel=self.fdel,
>
>             doc=self.__doc__)
>
>  
>
> *From:* Lukas Cenovsky [mailto:cenovsky at bakalari.cz]
> *Sent:* Thursday, November 12, 2009 11:01 AM
> *To:* Shri Borde
> *Subject:* Re: [IronPython] .NET attributes for methods
>
>  
>
> Shri Borde wrote:
>
> So the new clrtype.py still works - cool!
>
> Yep ;-)
>
>  I am not an expert on data binding, so I don't have any suggestions. 
> Why do you say that the decorator approach will not work with 
> Silverlight? Does @notifiy_property from 
> http://gui-at.blogspot.com/2009/11/inotifypropertychanged-in-ironpython.html 
> use any feature not available in Silverlight?
>
> It does not (as far as I know because it is pure IronPython). But 
> @notify_property does not work with clrtypes:
>
> class ViewModel(NotifyPropertyChangedBase):
>     __metaclass__ = clrtype.ClrMetaclass
>     _clrnamespace = "Cenda.ViewModel"
>     _clrproperties = {'size': str}
>     
>     def __init__(self):
>         super(ViewModel, self).__init__()
>         # must be string to two-way binding work correctly
>         self.size = '10'
>  
>     @notify_property
>     def size(self):
>         return self._size
>  
>     @size.setter
>     def size(self, value):
>         self._size = value
>         print 'Size changed to %r' % self.size
>  
>
>
> When I run this code, the size is still clr property and Python getter 
> and setter are not run.
>
> So basically I need to override/enhance clr getter and setter created 
> by clrtype._clrproperties.
>
> --
> -- Lukáš
>
>
>  
>
> *From:* Lukas Cenovsky [mailto:cenovsky at bakalari.cz]
> *Sent:* Thursday, November 12, 2009 8:09 AM
> *To:* Shri Borde
> *Subject:* Re: [IronPython] .NET attributes for methods
>
>  
>
> Thanks, that works!
>
> What do you think would be the best approach to create notifiable 
> properties for Silverlight? I did it for WPF (via decorators: 
> http://gui-at.blogspot.com/2009/11/inotifypropertychanged-in-ironpython.html) 
> but it seems to me it won't be possible to do it similarly for 
> Silverlight...
>
> --
> -- Lukáš
>
> Shri Borde wrote:
>
> Can you use "_clrproperties" instead of "_clrfields"? DevHawk's same 
> created a field and a property even when you just used "_clrfields". I 
> don't do that anymore. So you will need to use "_clrproperties" to get 
> properties, which SL must use for data binding.
>
>  
>
> *From:* users-bounces at lists.ironpython.com 
> <mailto:users-bounces at lists.ironpython.com> 
> [mailto:users-bounces at lists.ironpython.com] *On Behalf Of *Lukas Cenovsky
> *Sent:* Wednesday, November 11, 2009 2:37 AM
> *To:* Discussion of IronPython
> *Subject:* Re: [IronPython] .NET attributes for methods
>
>  
>
> I did change __metaclass__ to ClrMetaclass. See the attached source I 
> use for testing - the only difference is to comment/uncomment 
> appropriate part in product.py.
>
> The outputs look the same, there are no visible exceptions:
>
> DevHawk:
>
> py> a.root.FindName('listbox1').ItemsSource[0].GetType().GetFields()
> => Array[FieldInfo]((<System.Reflection.RtFieldInfo object at 0x000000000000002B [Double cost]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002C [Int32 quantity]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002D [System.String name]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002E [IronPython.Runtime.Types.PythonType .class]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002F [IronPython.Runtime.PythonDictionary .dict]>,
> <System.Reflection.RtFieldInfo object at 0x0000000000000030 [System.Object[] .slots_and_weakref]>))
>
>
> Shri:
>
> py> a.root.FindName('listbox1').ItemsSource[0].GetType().GetFields()
> => Array[FieldInfo]((<System.Reflection.RtFieldInfo object at 0x000000000000002B [Double cost]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002C [Int32 quantity]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002D [System.String name]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002E [IronPython.Runtime.Types.PythonType .class]>,
> <System.Reflection.RtFieldInfo object at 0x000000000000002F [IronPython.Runtime.PythonDictionary .dict]>,
> <System.Reflection.RtFieldInfo object at 0x0000000000000030 [System.Object[] .slots_and_weakref]>))
>
>  
>
> --
> -- Lukáš
>
>
> Shri Borde wrote:
>
> Note that you will have to set __metaclass__ to ClrMetaclass, not 
> ClrTypeMetaclass as in DevHawk's sample. I had changed the name of the 
> type. The old name will cause a NameError, but maybe SL is hiding 
> exceptions. Can you do "o.GetType().GetFields()" and display that on 
> the page to inspect the object and also make sure that no exceptions 
> were thrown?
>
>  
>
> *From:* users-bounces at lists.ironpython.com 
> <mailto:users-bounces at lists.ironpython.com> 
> [mailto:users-bounces at lists.ironpython.com] *On Behalf Of *Lukas Cenovsky
> *Sent:* Tuesday, November 10, 2009 2:59 PM
> *To:* Discussion of IronPython
> *Subject:* Re: [IronPython] .NET attributes for methods
>
>  
>
> I have just found that the Silverlight binding does not work with this 
> version of clrtype and/or IronPython 2.6RC2.
> I used DevHawk demo [1] and after I added reference to 
> Microsoft.Dynamic in clrtypemetaclass.py it worked flawlessly. But 
> when I switch to your version, no items show in the listbox.
>
> By the way - I have seen a commit message you have added support for 
> interfaces - nice! ;-)
>
> --
> -- Lukáš
>
> [1] 
> http://cid-0d9bc809858885a4.skydrive.live.com/self.aspx/DevHawk%20Content/IronPython%20Stuff/^_^_clrtype^_^_/SL%20databinding%20demo.zip 
> <http://cid-0d9bc809858885a4.skydrive.live.com/self.aspx/DevHawk%20Content/IronPython%20Stuff/%5E_%5E_clrtype%5E_%5E_/SL%20databinding%20demo.zip>
>
>  
>
>  
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.ironpython.com
> http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
>   

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/ironpython-users/attachments/20091113/ec78d6f8/attachment.html>


More information about the Ironpython-users mailing list