[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