[pypy-svn] r37509 - in pypy/dist/pypy/module/_dotnet: . test
antocuni at codespeak.net
antocuni at codespeak.net
Mon Jan 29 11:10:04 CET 2007
Author: antocuni
Date: Mon Jan 29 11:10:01 2007
New Revision: 37509
Modified:
pypy/dist/pypy/module/_dotnet/__init__.py
pypy/dist/pypy/module/_dotnet/app_dotnet.py
pypy/dist/pypy/module/_dotnet/interp_dotnet.py
pypy/dist/pypy/module/_dotnet/test/test_dotnet.py
Log:
Dynamically load .NET classes instead of using hard-coded
definitions.
Modified: pypy/dist/pypy/module/_dotnet/__init__.py
==============================================================================
--- pypy/dist/pypy/module/_dotnet/__init__.py (original)
+++ pypy/dist/pypy/module/_dotnet/__init__.py Mon Jan 29 11:10:01 2007
@@ -4,12 +4,10 @@
class Module(MixedModule):
"""CLR module"""
- appleveldefs = {
- 'ArrayList': 'app_dotnet.ArrayList',
- 'Math': 'app_dotnet.Math',
- }
+ appleveldefs = {}
interpleveldefs = {
'_CliObject_internal': 'interp_dotnet.W_CliObject',
'call_staticmethod': 'interp_dotnet.call_staticmethod',
+ 'load_cli_class': 'interp_dotnet.load_cli_class',
}
Modified: pypy/dist/pypy/module/_dotnet/app_dotnet.py
==============================================================================
--- pypy/dist/pypy/module/_dotnet/app_dotnet.py (original)
+++ pypy/dist/pypy/module/_dotnet/app_dotnet.py Mon Jan 29 11:10:01 2007
@@ -77,14 +77,12 @@
self.__cliobj__ = _dotnet._CliObject_internal(self.__cliclass__)
-class ArrayList(CliClassWrapper):
- __cliclass__ = 'System.Collections.ArrayList'
- Add = MethodWrapper('Add')
- get_Item = MethodWrapper('get_Item')
- __getitem__ = get_Item
- IndexOf = MethodWrapper('IndexOf')
-
-
-class Math(CliClassWrapper):
- __cliclass__ = 'System.Math'
- Abs = StaticMethodWrapper(__cliclass__, 'Abs')
+def build_wrapper(namespace, classname, staticmethods, methods):
+ fullname = '%s.%s' % (namespace, classname)
+ d = {'__cliclass__': fullname,
+ '__module__': namespace}
+ for name in staticmethods:
+ d[name] = StaticMethodWrapper(fullname, name)
+ for name in methods:
+ d[name] = MethodWrapper(name)
+ return type(classname, (CliClassWrapper,), d)
Modified: pypy/dist/pypy/module/_dotnet/interp_dotnet.py
==============================================================================
--- pypy/dist/pypy/module/_dotnet/interp_dotnet.py (original)
+++ pypy/dist/pypy/module/_dotnet/interp_dotnet.py Mon Jan 29 11:10:01 2007
@@ -1,6 +1,7 @@
+import os.path
from pypy.interpreter.baseobjspace import ObjSpace, W_Root, Wrappable
from pypy.interpreter.error import OperationError
-from pypy.interpreter.gateway import interp2app
+from pypy.interpreter.gateway import interp2app, ApplevelClass
from pypy.interpreter.typedef import TypeDef
from pypy.rpython.ootypesystem import ootype
from pypy.translator.cli.dotnet import CLR, box, unbox, NativeException, native_exc,\
@@ -10,6 +11,8 @@
TargetInvocationException = NativeException(CLR.System.Reflection.TargetInvocationException)
AmbiguousMatchException = NativeException(CLR.System.Reflection.AmbiguousMatchException)
+System.Double # force the type to be loaded, else the annotator could think that System has no Double attribute
+
def get_method(space, b_type, name, b_paramtypes):
try:
return b_type.GetMethod(name, b_paramtypes)
@@ -82,6 +85,24 @@
return call_method(self.space, self.b_obj, self.b_obj.GetType(), name, w_args, startfrom)
call_method.unwrap_spec = ['self', str, W_Root, int]
+def load_cli_class(space, namespace, classname):
+ fullname = '%s.%s' % (namespace, classname)
+ t = System.Type.GetType(fullname)
+ methods = []
+ staticmethods = []
+ methodsinfo = t.GetMethods()
+ for i in range(len(methodsinfo)):
+ meth = methodsinfo[i]
+ if meth.IsPublic:
+ if meth.IsStatic:
+ staticmethods.append(str(meth.Name))
+ else:
+ methods.append(str(meth.Name))
+ w_staticmethods = space.wrap(staticmethods)
+ w_methods = space.wrap(methods)
+ return build_wrapper(space, space.wrap(namespace), space.wrap(classname),
+ w_staticmethods, w_methods)
+load_cli_class.unwrap_spec = [ObjSpace, str, str]
def cli_object_new(space, w_subtype, typename):
b_type = System.Type.GetType(typename)
@@ -90,9 +111,14 @@
return space.wrap(W_CliObject(space, b_obj))
cli_object_new.unwrap_spec = [ObjSpace, W_Root, str]
-
W_CliObject.typedef = TypeDef(
'_CliObject_internal',
__new__ = interp2app(cli_object_new),
call_method = interp2app(W_CliObject.call_method),
)
+
+path, _ = os.path.split(__file__)
+app_dotnet = os.path.join(path, 'app_dotnet.py')
+app = ApplevelClass(file(app_dotnet).read())
+del path, app_dotnet
+build_wrapper = app.interphook("build_wrapper")
Modified: pypy/dist/pypy/module/_dotnet/test/test_dotnet.py
==============================================================================
--- pypy/dist/pypy/module/_dotnet/test/test_dotnet.py (original)
+++ pypy/dist/pypy/module/_dotnet/test/test_dotnet.py Mon Jan 29 11:10:01 2007
@@ -1,5 +1,4 @@
from pypy.conftest import gettestobjspace
-import os
class AppTestDotnet:
def setup_class(cls):
@@ -14,7 +13,8 @@
def test_ArrayList(self):
import _dotnet
- obj = _dotnet.ArrayList()
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
obj.Add(42)
obj.Add(43)
total = obj.get_Item(0) + obj.get_Item(1)
@@ -22,43 +22,51 @@
def test_ArrayList_error(self):
import _dotnet
- obj = _dotnet.ArrayList()
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
raises(StandardError, obj.get_Item, 0)
def test_float_conversion(self):
import _dotnet
- obj = _dotnet.ArrayList()
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
obj.Add(42.0)
item = obj.get_Item(0)
assert isinstance(item, float)
def test_getitem(self):
+ skip('skip for now')
import _dotnet
- obj = _dotnet.ArrayList()
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
obj.Add(42)
assert obj[0] == 42
def test_unboundmethod(self):
import _dotnet
- obj = _dotnet.ArrayList()
- _dotnet.ArrayList.Add(obj, 42)
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
+ ArrayList.Add(obj, 42)
assert obj.get_Item(0) == 42
def test_unboundmethod_typeerror(self):
import _dotnet
- raises(TypeError, _dotnet.ArrayList.Add)
- raises(TypeError, _dotnet.ArrayList.Add, 0)
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ raises(TypeError, ArrayList.Add)
+ raises(TypeError, ArrayList.Add, 0)
def test_overload(self):
import _dotnet
- obj = _dotnet.ArrayList()
+ ArrayList = _dotnet.load_cli_class('System.Collections', 'ArrayList')
+ obj = ArrayList()
for i in range(10):
obj.Add(i)
assert obj.IndexOf(7) == 7
assert obj.IndexOf(7, 0, 5) == -1
def test_staticmethod(self):
- from _dotnet import Math
+ import _dotnet
+ Math = _dotnet.load_cli_class('System', 'Math')
res = Math.Abs(-42)
assert res == 42
assert type(res) is int
More information about the pypy-svn
mailing list