[pypy-svn] r28379 - in pypy/dist/pypy/translator/js2: . modules test
fijal at codespeak.net
fijal at codespeak.net
Tue Jun 6 15:42:42 CEST 2006
Author: fijal
Date: Tue Jun 6 15:42:41 2006
New Revision: 28379
Modified:
pypy/dist/pypy/translator/js2/metavm.py
pypy/dist/pypy/translator/js2/modules/dom.py
pypy/dist/pypy/translator/js2/opcodes.py
pypy/dist/pypy/translator/js2/test/test_dom.py
Log:
DOM preliminary version now works, also with element getting/setting.
Modified: pypy/dist/pypy/translator/js2/metavm.py
==============================================================================
--- pypy/dist/pypy/translator/js2/metavm.py (original)
+++ pypy/dist/pypy/translator/js2/metavm.py Tue Jun 6 15:42:41 2006
@@ -34,14 +34,10 @@
generator.load(func_arg)
generator.call_external(builtin, args[1:])
- def _render_builtin_method(self, generator, builtin, args, is_property):
- if not is_property:
- for func_arg in args:
- generator.load(func_arg)
- generator.call_external_method(builtin, len(args)-1)
- else:
- generator.load(args[0])
- generator.get_field(None, builtin)
+ def _render_builtin_method(self, generator, builtin, args):
+ for func_arg in args:
+ generator.load(func_arg)
+ generator.call_external_method(builtin, len(args)-1)
def _render_function(self, generator, graph, args):
for func_arg in args[1:]: # push parameters
@@ -71,6 +67,11 @@
'll_js_jseval' : CallBuiltin('eval'),
'll_newlist' : lambda g,op: g.ilasm.load_const("[]"),
'll_alloc_and_set' : CallBuiltin('alloc_and_set'),
+ 'get_document' : lambda g,op: g.ilasm.load_const('document'),
+ 'setTimeout' : CallBuiltin('setTimeout'),
+ 'll_int_str' : lambda g,op: Call._render_builtin_method(g, 'toString' , [op.args[2]]),
+ 'll_strconcat' : InstructionList([PushAllArgs, '+']),
+ 'll_int' : CallBuiltin('parseInt'),
}
self.builtin_obj_map = {
ootype.String.__class__: {
@@ -134,9 +135,8 @@
class _GetBuiltinField(MicroInstruction):
def render(self, generator, op):
this = op.args[0]
- field = op.args[1]
- field_name = this.value.methods[field].name[1:]
- self.run_it(generator, this, field_name)
+ field = op.args[1].value[1:]
+ self.run_it(generator, this, field)
def run_it(self, generator, this, field_name):
generator.load(this)
@@ -147,10 +147,13 @@
class _SetBuiltinField(MicroInstruction):
def render(self, generator, op):
this = op.args[0]
- field = op.args[1]
- value = op.args[2]
- field_name = this.value.methods[field].name[1:]
- self.run_it(generator, this, field_name, value)
+ field = op.args[1].value
+ if not field.startswith('o'):
+ generator.load_void()
+ else:
+ value = op.args[2]
+ field_name = field[1:]
+ self.run_it(generator, this, field_name, value)
def run_it(self, generator, this, field_name, value):
generator.load(this)
@@ -164,6 +167,16 @@
method = op.args[0]
self._render_method(generator, method.value, op.args[1:])
+class _CallBuiltinObject(_Call):
+ def render(self, generator, op):
+ this = op.args[1].concretetype
+ method = op.args[0]
+ method_name = this._methods[method.value]._name[1:]
+ generator.load(op.args[1])
+ self._render_builtin_method(generator, method_name, op.args[1:])
+
+CallBuiltinObject = _CallBuiltinObject()
+
class _IsInstance(MicroInstruction):
def render(self, generator, op):
# FIXME: just temporary hack
@@ -206,8 +219,8 @@
if getattr(func.value._callable, 'suggested_primitive', False):
func_name = func.value._name.split("__")[0]
log("Function name: %s suggested primitive" % func_name)
- if Builtins.builtin_map.has_key(func_name):
- return Builtins.builtin_map[func_name](generator, op)
+ #if Builtins.builtin_map.has_key(func_name):
+ return Builtins.builtin_map[func_name](generator, op)
else:
return Call.render(generator, op)
Modified: pypy/dist/pypy/translator/js2/modules/dom.py
==============================================================================
--- pypy/dist/pypy/translator/js2/modules/dom.py (original)
+++ pypy/dist/pypy/translator/js2/modules/dom.py Tue Jun 6 15:42:41 2006
@@ -9,21 +9,12 @@
import time
class Style(object):
+ _rpython_hints = {'_suggested_external' : True}
+
def __init__(self, s_str):
self.left = "0"
self.top = "0"
-
- def setLeft(self, left):
- self.left = left
-
- def getLeft(self):
- return self.left
-
- def setTop(self, top):
- self.top = top
-
- def getTop(self):
- return self.top
+
class Node(object):
_rpython_hints = {'_suggested_external' : True}
@@ -35,18 +26,19 @@
def getElementById(self, id):
return Node()
- def setInnerHTML(self, data):
- self.innerHTML = data
-
def setAttribute(self, name, style_str):
if name == 'style':
self.style = Style( style_str)
-
- def getStyle(self):
- return self.style
+
+def get_document():
+ return Node()
+
+get_document.suggested_primitive = True
document = Node()
def setTimeout(func, delay):
# scheduler call, but we don't want to mess with threads right now
return func
+
+setTimeout.suggested_primitive = True
Modified: pypy/dist/pypy/translator/js2/opcodes.py
==============================================================================
--- pypy/dist/pypy/translator/js2/opcodes.py (original)
+++ pypy/dist/pypy/translator/js2/opcodes.py Tue Jun 6 15:42:41 2006
@@ -6,7 +6,8 @@
InstructionList, New, SetField, GetField, RuntimeNew, MicroInstruction
from pypy.translator.js2.metavm import SameAs, IsInstance, Call, CallMethod, CopyName, CastString,\
- _Prefix, _CastFun, _NotImplemented, GetFieldDispatcher, SetFieldDispatcher, CallDispatcher, MethodDispatcher
+ _Prefix, _CastFun, _NotImplemented, GetFieldDispatcher, SetFieldDispatcher, CallDispatcher, MethodDispatcher,\
+ CallBuiltin
DoNothing = [PushAllArgs]
@@ -105,6 +106,7 @@
'oodowncast' : DoNothing,
'oononnull' : [PushAllArgs,_Prefix('!!')],
'oostring' : [CastString],
+ 'ooparse_int' : [CallBuiltin('parseInt')],
'oois' : '==', # FIXME: JS does not have real equal
# when casting from bool we want that every truth value is casted
# to 1: we can't simply DoNothing, because the CLI stack could
Modified: pypy/dist/pypy/translator/js2/test/test_dom.py
==============================================================================
--- pypy/dist/pypy/translator/js2/test/test_dom.py (original)
+++ pypy/dist/pypy/translator/js2/test/test_dom.py Tue Jun 6 15:42:41 2006
@@ -5,7 +5,7 @@
import py
from pypy.translator.js2.test.runtest import compile_function
-from pypy.translator.js2.modules.dom import document, setTimeout, Node
+from pypy.translator.js2.modules.dom import document, setTimeout, Node, get_document
from pypy.translator.js2 import conftest
import time
@@ -16,7 +16,7 @@
class TestDOM(object):
def test_document_base(self):
def f():
- return document.getElementById("dupa")
+ return get_document().getElementById("dupa")
#document.getElementById("dupa").setInnerHTML("<h1>Fire!</h1>")
#return document.getElementById("dupa")
@@ -28,8 +28,8 @@
if dir < 0:
dx = -dx
dy = -dy
- obj.getStyle().setLeft(str(int(obj.getStyle().getLeft()) + dx) + "px")
- obj.getStyle().setTop(str(int(obj.getStyle().getTop()) + dy) + "px")
+ obj.style.left = str(int(obj.style.left) + dx) + "px"
+ obj.style.top = str(int(obj.style.top) + dy) + "px"
def move_it():
move_it_by(get_document().getElementById("anim_img"), 3, 3, 1)
More information about the Pypy-commit
mailing list