In case anyone is interested:
I have added a Constructors object named '__overloads__' to the
ClassObject.__dict__ that has the necessary machinery to select
overloaded constructors using subscript notation, as in:
from System import String, Char, Int32
s = String.__overloads__[Char, Int32]('A', 10)
or
from System import Array
CharArrType = Array[Char]
StringFromCharArr = String.__overloads__[CharArrType]
s = StringFromCharArr(list('hello'))
Just as in MethodObject, I implement a Descriptor __get__() in managed
code that returns a CtorMapper for ctor selection and invoking.
Also fixed a bug in MethodBinder.Bind() that threw an unhandled
InvalidCastException when calling a non-static method on a class rather
than on an instance of the class. Here's the patch as it stands:
diff --git a/src/runtime/methodbinder.cs b/src/runtime/methodbinder.cs
index 862a110..f1bc042 100644
-- a/src/runtime/methodbinder.cs
++ b/src/runtime/methodbinder.cs
@@ -294,23 +295,39 @@ namespace Python.Runtime {
Object target = null;
if ((!mi.IsStatic) && (inst != IntPtr.Zero)) {
- CLRObject co =
(CLRObject)ManagedType.GetManagedObject(
- inst
- );
+ //CLRObject co =
(CLRObject)ManagedType.GetManagedObject(inst);
+ // Calling on a ClassObject raises an unhandled
exception:
+ // InvalidCastException: Unable to cast object
of type
+ // 'Python.Runtime.ClassObject' to type
'Python.Runtime.CLRObject'
+ //
+ //ManagedType mt =
ManagedType.GetManagedObject(inst);
+ // The above cast would fail if
GetManagedObject(inst) returned null.
+ //CLRObject co = mt as CLRObject;
+
+ CLRObject co =
ManagedType.GetManagedObject(inst) as CLRObject;
+
+ // Sanity check: this ensures a graceful exit
if someone does
+ // something intentionally wrong like call a
non-static method
+ // on the class rather than on an instance of
the class.
+ // XXX maybe better to do this before all the
other rigmarole.
+ if (co == null) {
+ return null;
+ }
target = co.inst;
}
-
+ // target may or may not be null, here
return new Binding(mi, target, margs, outs);
}
- }
+ } // END foreach MethodBase mi in _methods
I sure with that we could get the maintainers of the SourceForge project
to make some contact...
possibly bring in some fresh blood to the project.
On 7/5/2010 11:29 PM, Barton wrote:
The readme clearly states that
from System import String, Char, Int32
s = String.__overloads__[Char, Int32]('A', 10)
should select the desired constructor, but ...
it doesn't
Is this something that worked in an earlier version?
Where there changes that were made that were not committed to the trunk?
Is this something that anybody else has come up against? fixed???
Thanks, all,
Barton
Windows 7, Framework Version: 2.0.50727.42 (AFAIK)
Python 2.6.5
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
http://mail.python.org/mailman/listinfo/pythondotnet
_________________________________________________
Python.NET mailing list - PythonDotNet@python.org
http://mail.python.org/mailman/listinfo/pythondotnet