[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