[pypy-svn] r45258 - in pypy/dist/pypy/translator/jvm: . test

fijal at codespeak.net fijal at codespeak.net
Sun Jul 22 20:35:09 CEST 2007


Author: fijal
Date: Sun Jul 22 20:35:08 2007
New Revision: 45258

Added:
   pypy/dist/pypy/translator/jvm/platform.py   (contents, props changed)
   pypy/dist/pypy/translator/jvm/test/test_platform.py   (contents, props changed)
Modified:
   pypy/dist/pypy/translator/jvm/database.py
   pypy/dist/pypy/translator/jvm/typesystem.py
Log:
A relatively easy and quick hack to have RPython-level bindings for
Jvm. Looks like working.


Modified: pypy/dist/pypy/translator/jvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/database.py	(original)
+++ pypy/dist/pypy/translator/jvm/database.py	Sun Jul 22 20:35:08 2007
@@ -14,12 +14,14 @@
 import pypy.translator.jvm.constant as jvmconst
 from pypy.translator.jvm.typesystem import \
      jStringBuilder, jInt, jVoid, jString, jChar, jPyPyConst, jObject, \
-     jThrowable
+     jThrowable, JvmNativeClass
 from pypy.translator.jvm.builtin import JvmBuiltInType
 from pypy.rpython.lltypesystem.llmemory import WeakGcAddress
 
 from pypy.translator.oosupport.database import Database as OODatabase
-
+from pypy.rpython.ootypesystem.bltregistry import ExternalType
+from pypy.annotation.signature import annotation
+from pypy.annotation.model import annotation_to_lltype
 
 # ______________________________________________________________________
 # Database object
@@ -492,9 +494,18 @@
             return self._translate_record(OOT)
         if isinstance(OOT, ootype.StaticMethod):
             return self.record_delegate(OOT)
+
+        # handle externals
+        if isinstance(OOT, ExternalType):
+            return JvmNativeClass(self, OOT)
         
         assert False, "Untranslatable type %s!" % OOT
 
+    def annotation_to_cts(self, _tp):
+        s_tp = annotation(_tp)
+        TP = annotation_to_lltype(s_tp)
+        return self.lltype_to_cts(TP)
+
     def exception_root_object(self):
         """
         Returns a JvmType representing the version of Object that

Added: pypy/dist/pypy/translator/jvm/platform.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/jvm/platform.py	Sun Jul 22 20:35:08 2007
@@ -0,0 +1,16 @@
+
+from pypy.rpython.ootypesystem.bltregistry import BasicExternal, described
+
+#class Jvm(object):
+#    def __getattr__(self, name):
+#        return None
+
+class Jvm(object):
+    pass
+
+class Random(BasicExternal):
+    @described(retval=int)
+    def nextInt(self):
+        pass
+
+Jvm.Random = Random

Added: pypy/dist/pypy/translator/jvm/test/test_platform.py
==============================================================================
--- (empty file)
+++ pypy/dist/pypy/translator/jvm/test/test_platform.py	Sun Jul 22 20:35:08 2007
@@ -0,0 +1,13 @@
+
+from pypy.translator.jvm.test.runtest import JvmTest
+from pypy.translator.jvm.platform import Jvm
+
+class TestJvmPlatform(JvmTest):
+    def test_basic_interaction(self):
+        def fn():
+            rand = Jvm.Random()
+            x = rand.nextInt()
+            return x
+
+        ret = self.interpret(fn, [])
+        assert isinstance(ret, int)

Modified: pypy/dist/pypy/translator/jvm/typesystem.py
==============================================================================
--- pypy/dist/pypy/translator/jvm/typesystem.py	(original)
+++ pypy/dist/pypy/translator/jvm/typesystem.py	Sun Jul 22 20:35:08 2007
@@ -114,6 +114,7 @@
         self.descriptor = descriptor  # public
         self.name = None              # public, string like "java.lang.Object"
                                       # (None for scalars and arrays)
+
     def lookup_field(self, fieldnm):
         """ If the class has a field named 'fieldnm', returns a
         jvmgen.Field or jvmgen.Property object that represents it and can
@@ -303,3 +304,32 @@
 jPyPyHashCode = JvmCallbackInterface('pypy.HashCode', [jObject], jInt)
 jPyPyEquals = JvmCallbackInterface('pypy.Equals', [jObject, jObject], jBool)
 
+class JvmNativeClass(JvmClassType):
+    def __init__(self, db, OOTYPE):
+        self.OOTYPE = OOTYPE
+        self.db = db
+        # XXX fixed java.lang?
+        self.methods = {}
+        JvmClassType.__init__(self, "java.util." + OOTYPE._name)
+        self._add_methods()
+
+    def __eq__(self, other):
+        return isinstance(other, JvmNativeClass) and other.OOTYPE == self.OOTYPE
+    
+    def __hash__(self):
+        return hash(("JvmNativeClass", self.OOTYPE))
+
+    def lookup_field(self):
+        XXX
+
+    def lookup_method(self, methname):
+        return self.methods[methname]
+
+    def _add_methods(self):
+        from pypy.translator.jvm.generator import Method
+        for methname, methspec in self.OOTYPE._class_._methods.items():
+            argtypes = [self.db.annotation_to_cts(arg._type) for arg in
+                        methspec.args]
+            restype = self.db.annotation_to_cts(methspec.retval._type)
+            self.methods[methname] = Method.v(self, methname,
+                                              argtypes, restype)



More information about the Pypy-commit mailing list