[pypy-svn] r28761 - in pypy/dist/pypy/translator: js js/modules js/modules/test oosupport

fijal at codespeak.net fijal at codespeak.net
Tue Jun 13 23:00:49 CEST 2006


Author: fijal
Date: Tue Jun 13 23:00:45 2006
New Revision: 28761

Modified:
   pypy/dist/pypy/translator/js/database.py
   pypy/dist/pypy/translator/js/js.py
   pypy/dist/pypy/translator/js/jts.py
   pypy/dist/pypy/translator/js/metavm.py
   pypy/dist/pypy/translator/js/modules/test/test_dom.py
   pypy/dist/pypy/translator/js/modules/xmlhttp.py
   pypy/dist/pypy/translator/js/opcodes.py
   pypy/dist/pypy/translator/oosupport/metavm.py
Log:
Added support for External Builtin Objects.


Modified: pypy/dist/pypy/translator/js/database.py
==============================================================================
--- pypy/dist/pypy/translator/js/database.py	(original)
+++ pypy/dist/pypy/translator/js/database.py	Tue Jun 13 23:00:45 2006
@@ -14,6 +14,7 @@
 from pypy.rpython.lltypesystem.lltype import SignedLongLong, UnsignedLongLong, typeOf
 from pypy.rpython.lltypesystem.lltype import Char, UniChar
 from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.ootypesystem import bltregistry
 
 from pypy.objspace.flow.model import Variable, Constant
 from pypy.translator.js.modules import dom
@@ -197,6 +198,8 @@
             return StringConst(db, const)
         elif isinstance(const, ootype._dict):
             return DictConst(db, const)
+        elif isinstance(const, bltregistry._external_type):
+            return ExtObject(db, const)
         else:
             assert False, 'Unknown constant: %s %r' % (const, typeOf(const))
     make = staticmethod(make)
@@ -376,3 +379,22 @@
             self.db.load_const(typeOf(i), i, ilasm)
             ilasm.list_setitem()
             ilasm.store_void()
+
+class ExtObject(AbstractConst):
+    def __init__(self, db, const):
+        self.db = db
+        self.const = const
+        self.name = self.get_name()
+    
+    def __eq__(self, other):
+        return self.name == other.name
+    
+    def __hash__(self):
+        return hash(self.name)
+    
+    def get_name(self):
+        return self.const._TYPE._name.split('.')[-1][:-2]
+    
+    def init(self, ilasm):
+        #import pdb; pdb.set_trace()
+        ilasm.new(self.get_name())

Modified: pypy/dist/pypy/translator/js/js.py
==============================================================================
--- pypy/dist/pypy/translator/js/js.py	(original)
+++ pypy/dist/pypy/translator/js/js.py	Tue Jun 13 23:00:45 2006
@@ -45,6 +45,7 @@
         }
         GenOO.__init__(self, udir, translator, backend_mapping = backend_mapping, pending_graphs = ())
         self.translator = translator
+        self.db.translator = translator
     
     def gen_pendings(self):
         while self.db._pending_nodes:

Modified: pypy/dist/pypy/translator/js/jts.py
==============================================================================
--- pypy/dist/pypy/translator/js/jts.py	(original)
+++ pypy/dist/pypy/translator/js/jts.py	Tue Jun 13 23:00:45 2006
@@ -12,6 +12,8 @@
 
 from pypy.translator.js.log import log
 
+from types import FunctionType
+
 try:
     set
 except NameError:
@@ -81,7 +83,12 @@
             else:
                 val = 'true'
         elif _type is Void:
-            val = 'undefined'
+            if isinstance(v, FunctionType):
+                graph = self.db.translator.annotator.bookkeeper.getdesc(v).cachedgraph(None)
+                self.db.pending_function(graph)
+                val = graph.name
+            else:
+                val = 'undefined'
         elif isinstance(_type,String.__class__):
             val = '%r'%v._str
         elif isinstance(_type,List):

Modified: pypy/dist/pypy/translator/js/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/js/metavm.py	(original)
+++ pypy/dist/pypy/translator/js/metavm.py	Tue Jun 13 23:00:45 2006
@@ -118,8 +118,13 @@
         generator.load(this)
         generator.load(value)
         generator.set_field(None, field_name)
+    
+class _SetExternalField(_SetBuiltinField):
+    def render(self, generator, op):
+        self.run_it(generator, op.args[0], op.args[1].value, op.args[2])
 
 SetBuiltinField = _SetBuiltinField()
+SetExternalField = _SetExternalField()
 
 class _CallMethod(_Call):
     def render(self, generator, op):
@@ -134,7 +139,16 @@
         generator.load(op.args[1])
         self._render_builtin_method(generator, method_name, op.args[1:])
 
+class _CallExternalObject(_Call):
+    def render(self, generator, op):
+        this = op.args[1].concretetype
+        method = op.args[0]
+        method_name = method.value
+        generator.load(op.args[1])
+        self._render_builtin_method(generator, method_name, op.args[1:])
+
 CallBuiltinObject = _CallBuiltinObject()
+CallExternalObject = _CallExternalObject()
 
 class _IsInstance(MicroInstruction):
     def render(self, generator, op):

Modified: pypy/dist/pypy/translator/js/modules/test/test_dom.py
==============================================================================
--- pypy/dist/pypy/translator/js/modules/test/test_dom.py	(original)
+++ pypy/dist/pypy/translator/js/modules/test/test_dom.py	Tue Jun 13 23:00:45 2006
@@ -75,15 +75,15 @@
 def t_xml_fun():
     if xml.readyState == 4:
         alert('Wow!')
-
+        
 def test_xmlhttp():
     """ Low level XMLHttpRequest test
     """
     def xml_fun():
-        return 4+4
-        #xml.open('GET', 'http://localhost:8080/get_some_info?info=dupa', True)
-        #xml.onreadystatechange = t_xml_fun
-        #xml.send__n(None)
+        xml.open('GET', 'http://localhost:8080/get_some_info?info=dupa', True)
+        xml.onreadystatechange = t_xml_fun
+        #return xml.readyState
+        xml.send_finish()
     
     fn = compile_function(xml_fun, [])
     fn()

Modified: pypy/dist/pypy/translator/js/modules/xmlhttp.py
==============================================================================
--- pypy/dist/pypy/translator/js/modules/xmlhttp.py	(original)
+++ pypy/dist/pypy/translator/js/modules/xmlhttp.py	Tue Jun 13 23:00:45 2006
@@ -12,10 +12,15 @@
     
     _methods = {
         'open' : ((str, str, bool), None),
-        'send__s' : ((str,), None),
-        'send__n' : ((), None),
+        'send' : ((str,), None),
+        'send_finish' : ((), None),
         #'onreadystatechange' : ([], Void),
     }
+    
+    _method_mapping = {
+        # this is neede because we've got some method duplications
+        'send_finish' : 'send'
+    }
 
 ##class XMLHttpRequest(object):
 ##    _rpython_hints = {'_suggested_external' : True}

Modified: pypy/dist/pypy/translator/js/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/js/opcodes.py	(original)
+++ pypy/dist/pypy/translator/js/opcodes.py	Tue Jun 13 23:00:45 2006
@@ -9,7 +9,7 @@
 
 from pypy.translator.js.metavm import SameAs, IsInstance, Call, CallMethod, CopyName, CastString,\
     _Prefix, _CastFun, _NotImplemented, CallBuiltin, CallBuiltinObject, GetBuiltinField, SetBuiltinField,\
-    IndirectCall
+    IndirectCall, CallExternalObject, SetExternalField
 
 from pypy.translator.js.jsbuiltin import Builtins
 
@@ -24,7 +24,9 @@
     'GetBuiltinField' : GetBuiltinField,
     'GetField' : GetField,
     'SetField' : SetField,
-    'SetBuiltinField' : SetBuiltinField
+    'SetBuiltinField' : SetBuiltinField,
+    'CallExternalObject' : CallExternalObject,
+    'SetExternalField' : SetExternalField,
 }
 
 opcodes = {'int_mul': '*',

Modified: pypy/dist/pypy/translator/oosupport/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/oosupport/metavm.py	(original)
+++ pypy/dist/pypy/translator/oosupport/metavm.py	Tue Jun 13 23:00:45 2006
@@ -4,6 +4,7 @@
 """
 
 from pypy.rpython.ootypesystem import ootype
+from pypy.rpython.ootypesystem.bltregistry import ExternalType
 
 class Generator(object):
     def function_signature(self, graph):
@@ -96,11 +97,18 @@
         if not isinstance(this, ootype.Instance):
             return False
         return this._hints.get('_suggested_external')
+    
+    def check_external(self, this):
+        if isinstance(this, ExternalType):
+            return True
+        return False
 
 class _MethodDispatcher(_GeneralDispatcher):
     def render(self, generator, op):
         method = op.args[0].value
         this = op.args[1].concretetype
+        if self.check_external(this):
+            return self.class_map['CallExternalObject'].render(generator, op)
         if self.check_builtin(this):
             return self.class_map['CallBuiltinObject'].render(generator, op)
         try:
@@ -128,7 +136,9 @@
     
 class _SetFieldDispatcher(_GeneralDispatcher):
     def render(self, generator, op):
-        if self.check_builtin(op.args[0].concretetype):
+        if self.check_external(op.args[0].concretetype):
+            return self.class_map['SetExternalField'].render(generator, op)
+        elif self.check_builtin(op.args[0].concretetype):
             return self.class_map['SetBuiltinField'].render(generator, op)
         else:
             return self.class_map['SetField'].render(generator, op)



More information about the Pypy-commit mailing list