[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