[pypy-svn] r18560 - pypy/dist/pypy/translator/js

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Oct 14 17:22:44 CEST 2005


Author: ericvrp
Date: Fri Oct 14 17:22:43 2005
New Revision: 18560

Modified:
   pypy/dist/pypy/translator/js/arraynode.py
   pypy/dist/pypy/translator/js/codewriter.py
   pypy/dist/pypy/translator/js/database.py
   pypy/dist/pypy/translator/js/funcnode.py
   pypy/dist/pypy/translator/js/js.py
   pypy/dist/pypy/translator/js/node.py
   pypy/dist/pypy/translator/js/opaquenode.py
   pypy/dist/pypy/translator/js/opwriter.py
   pypy/dist/pypy/translator/js/structnode.py
Log:
* Even more simplifications of what gets written.

* working on forward declartion and global data.

[90 passed, 73 failed]


Modified: pypy/dist/pypy/translator/js/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/js/arraynode.py	(original)
+++ pypy/dist/pypy/translator/js/arraynode.py	Fri Oct 14 17:22:43 2005
@@ -39,14 +39,14 @@
     # ______________________________________________________________________
     # entry points from genllvm
     #
-    def writedatatypedecl(self, codewriter):
-        codewriter.arraydef(self.ref,
-                            'int',
-                            self.db.repr_type(self.arraytype))
-
-    def writedecl(self, codewriter): 
-        # declaration for constructor
-        codewriter.declare(self.constructor_decl)
+    #def writedatatypedecl(self, codewriter):
+    #    codewriter.arraydef(self.ref,
+    #                        'int',
+    #                        self.db.repr_type(self.arraytype))
+
+    #def writedecl(self, codewriter): 
+    #    # declaration for constructor
+    #    codewriter.declare(self.constructor_decl)
 
 
 class VoidArrayTypeNode(LLVMNode):
@@ -58,9 +58,9 @@
         self.array = array
         self.ref = "arraytype_Void"
 
-    def writedatatypedecl(self, codewriter):
-        td = "%s = type { int }" % self.ref
-        codewriter.append(td)
+    #def writedatatypedecl(self, codewriter):
+    #    td = "%s = type { int }" % self.ref
+    #    codewriter.append(td)
         
 class ArrayNode(ConstantLLVMNode):
     """ An arraynode.  Elements can be
@@ -91,6 +91,12 @@
         if p is not None:
             self.db.prepare_constant(lltype.typeOf(p), p)
 
+    def writedecl(self, codewriter):
+        if self.arraytype is lltype.Char:  #or use seperate nodetype
+            codewriter.declare(self.ref + ' = new String()')
+        else:
+            codewriter.declare(self.ref + ' = new Array()')
+
     def get_length(self):
         """ returns logical length of array """
         items = self.value.items
@@ -157,10 +163,6 @@
     def get_arrayvalue(self):
         items = self.value.items
         item_length = len(items)
-        #don't force null termination anymore!
-        #if item_length == 0 or items[-1] != chr(0):
-        #    items = items + [chr(0)]
-        #    item_length += 1
         s = []
         for c in items:
             if ord(c) in StrArrayNode.printables:

Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py	(original)
+++ pypy/dist/pypy/translator/js/codewriter.py	Fri Oct 14 17:22:43 2005
@@ -54,18 +54,20 @@
             self.llvm(line, 0)
 
     def structdef(self, name, typereprs):
-        self.llvm("%s = type { %s }" %(name, ", ".join(typereprs)), 0)
+        #self.llvm("%s = type { %s }" %(name, ", ".join(typereprs)), 0)
+        pass
 
     def arraydef(self, name, lentype, typerepr):
-        self.llvm("%s = type { %s, [0 x %s] }" % (name, lentype, typerepr), 0)
+        #self.llvm("%s = type { %s, [0 x %s] }" % (name, lentype, typerepr), 0)
+        pass
 
     def funcdef(self, name, rettyperepr, argtypereprs):
-        self.llvm("%s = type %s (%s)" % (name, rettyperepr,
-                                           ", ".join(argtypereprs)), 0)
+        #self.llvm("%s = type %s (%s)" % (name, rettyperepr,
+        #                                   ", ".join(argtypereprs)), 0)
+        pass
 
     def declare(self, decl):
-        #self.llvm("declare %s" % decl, 0)
-        pass
+        self.append(decl, 0)
 
     def startimpl(self):
         #self.llvm("implementation", 0)
@@ -88,6 +90,8 @@
                 src = 'false'
             elif src == 'True':
                 src = 'true'
+            elif src == 'None':
+                src = 'undefined'
             if dest != src:
                 self.append('%s = %s' % (dest, src), indentation_level)
 

Modified: pypy/dist/pypy/translator/js/database.py
==============================================================================
--- pypy/dist/pypy/translator/js/database.py	(original)
+++ pypy/dist/pypy/translator/js/database.py	Fri Oct 14 17:22:43 2005
@@ -242,7 +242,7 @@
             if isinstance(type_, lltype.Primitive):
                 return self.primitives[type_]
             elif isinstance(type_, lltype.Ptr):
-                return self.repr_type(type_.TO) + '*'
+                return '' #self.repr_type(type_.TO) + 'XXX*'
             else: 
                 raise TypeError("cannot represent %r" %(type_,))
             
@@ -334,13 +334,13 @@
     # __________________________________________________________
     # Other helpers
 
-    def is_function_ptr(self, arg):
-        if isinstance(arg, (Constant, Variable)): 
-            arg = arg.concretetype 
-            if isinstance(arg, lltype.Ptr):
-                if isinstance(arg.TO, lltype.FuncType):
-                    return True
-        return False
+    #def is_function_ptr(self, arg):
+    #    if isinstance(arg, (Constant, Variable)): 
+    #        arg = arg.concretetype 
+    #        if isinstance(arg, lltype.Ptr):
+    #            if isinstance(arg.TO, lltype.FuncType):
+    #                return True
+    #    return False
 
     def get_childref(self, parent, child):
         node = self.obj2node[parent]

Modified: pypy/dist/pypy/translator/js/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/js/funcnode.py	(original)
+++ pypy/dist/pypy/translator/js/funcnode.py	Fri Oct 14 17:22:43 2005
@@ -31,10 +31,10 @@
         self.db.prepare_type(self.type_.RESULT)
         self.db.prepare_type_multi(self.type_._trueargs())
  
-    def writedatatypedecl(self, codewriter):
-        returntype = self.db.repr_type(self.type_.RESULT)
-        inputargtypes = [self.db.repr_type(a) for a in self.type_._trueargs()]
-        codewriter.funcdef(self.ref, returntype, inputargtypes)
+    #def writedatatypedecl(self, codewriter):
+    #    returntype = self.db.repr_type(self.type_.RESULT)
+    #    inputargtypes = [self.db.repr_type(a) for a in self.type_._trueargs()]
+    #    codewriter.funcdef(self.ref, returntype, inputargtypes)
 
 class FuncNode(ConstantLLVMNode):
     __slots__ = "db value ref graph blockindex".split()
@@ -77,8 +77,8 @@
 
     # ______________________________________________________________________
     # main entry points from genllvm 
-    def writedecl(self, codewriter): 
-        codewriter.declare(self.getdecl())
+    #def writedecl(self, codewriter): 
+    #    codewriter.declare(self.getdecl())
 
     def writeimpl(self, codewriter):
         graph = self.graph

Modified: pypy/dist/pypy/translator/js/js.py
==============================================================================
--- pypy/dist/pypy/translator/js/js.py	(original)
+++ pypy/dist/pypy/translator/js/js.py	Fri Oct 14 17:22:43 2005
@@ -4,6 +4,7 @@
     http://webreference.com/programming/javascript/
     http://mochikit.com/
     http://www.mozilla.org/js/spidermonkey/
+    svn co http://codespeak.net/svn/kupu/trunk/ecmaunit 
 '''
 
 #import os
@@ -77,7 +78,7 @@
         #    codewriter.comment("External Function Declarations")
         #    codewriter.append(llexterns_header)
 
-        codewriter.comment("Type Declarations", 0)
+        #codewriter.comment("Type Declarations", 0)
         #for c_name, obj in extern_decls:
         #    if isinstance(obj, lltype.LowLevelType):
         #        if isinstance(obj, lltype.Ptr):
@@ -85,26 +86,24 @@
         #        l = "%%%s = type %s" % (c_name, self.db.repr_type(obj))
         #        codewriter.append(l)
 
+        codewriter.comment("Function Implementation", 0)
+        for typ_decl in self.db.getnodes():
+            typ_decl.writeimpl(codewriter)
+
+        codewriter.comment("Forward Declarations", 0)
+        #for typ_decl in self.db.getnodes():
+        #    typ_decl.writedatatypedecl(codewriter)
         for typ_decl in self.db.getnodes():
-            typ_decl.writedatatypedecl(codewriter)
+            typ_decl.writedecl(codewriter)
 
         codewriter.comment("Global Data", 0)
         for typ_decl in self.db.getnodes():
             typ_decl.writeglobalconstants(codewriter)
 
-        codewriter.comment("Function Prototypes", 0)
+        #codewriter.comment("Function Prototypes", 0)
         #codewriter.append(extdeclarations)
         #codewriter.append(self.gcpolicy.declarations())
 
-        for typ_decl in self.db.getnodes():
-            typ_decl.writedecl(codewriter)
-
-        codewriter.comment("Function Implementation", 0)
-        codewriter.startimpl()
-        
-        for typ_decl in self.db.getnodes():
-            typ_decl.writeimpl(codewriter)
-
         pypy_prefix = '' #pypy_
 
         #codewriter.append(self.exceptionpolicy.llvmcode(self.entrynode))

Modified: pypy/dist/pypy/translator/js/node.py
==============================================================================
--- pypy/dist/pypy/translator/js/node.py	(original)
+++ pypy/dist/pypy/translator/js/node.py	Fri Oct 14 17:22:43 2005
@@ -32,10 +32,10 @@
         pass
 
     # __________________ before "implementation" ____________________
-    def writedatatypedecl(self, codewriter):
-        """ write out declare names of data types 
-            (structs/arrays/function pointers)
-        """
+    #def writedatatypedecl(self, codewriter):
+    #    """ write out declare names of data types 
+    #        (structs/arrays/function pointers)
+    #    """
 
     def writeglobalconstants(self, codewriter):
         """ write out global values.  """

Modified: pypy/dist/pypy/translator/js/opaquenode.py
==============================================================================
--- pypy/dist/pypy/translator/js/opaquenode.py	(original)
+++ pypy/dist/pypy/translator/js/opaquenode.py	Fri Oct 14 17:22:43 2005
@@ -15,9 +15,9 @@
     # ______________________________________________________________________
     # main entry points from genllvm 
 
-    def writedatatypedecl(self, codewriter):
-        # XXX Dummy - not sure what what we want
-        codewriter.funcdef(self.ref, 'sbyte*', ['sbyte *'])
+    #def writedatatypedecl(self, codewriter):
+    #    # XXX Dummy - not sure what what we want
+    #    codewriter.funcdef(self.ref, 'sbyte*', ['sbyte *'])
 
 
 class OpaqueNode(ConstantLLVMNode):

Modified: pypy/dist/pypy/translator/js/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/opwriter.py	(original)
+++ pypy/dist/pypy/translator/js/opwriter.py	Fri Oct 14 17:22:43 2005
@@ -254,8 +254,8 @@
         functionref = self.db.repr_arg(op_args[0])
         argrefs = self.db.repr_arg_multi(op_args[1:])
         argtypes = self.db.repr_arg_type_multi(op_args[1:])
-        if self.db.is_function_ptr(op.result):
-            returntype = "%s (%s)*" % (returntype, ", ".join(argtypes))
+        #if self.db.is_function_ptr(op.result):
+        #    returntype = "%s (%s)*" % (returntype, ", ".join(argtypes))
         self.codewriter.call(targetvar,returntype,functionref,argrefs,argtypes)
 
     def last_exception_type_ptr(self, op):
@@ -297,8 +297,8 @@
         block_label = self.node.blockindex[self.block]
         exc_label   = block_label + '_exception_handling'
 
-        if self.db.is_function_ptr(op.result):  #use longhand form
-            returntype = "%s (%s)*" % (returntype, ", ".join(argtypes))
+        #if self.db.is_function_ptr(op.result):  #use longhand form
+        #    returntype = "%s (%s)*" % (returntype, ", ".join(argtypes))
         self.codewriter.call(targetvar, returntype, functionref, argrefs,
                              argtypes, none_label, exc_label)
 

Modified: pypy/dist/pypy/translator/js/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/js/structnode.py	(original)
+++ pypy/dist/pypy/translator/js/structnode.py	Fri Oct 14 17:22:43 2005
@@ -5,6 +5,11 @@
 
 log = log.structnode 
 
+def _rename_reserved_keyword(name):
+    if name in 'if then else function for while witch continue break super int bool Array String Struct Number'.split():
+        name += '_'
+    return name
+
 class StructTypeNode(LLVMNode):
     __slots__ = "db struct ref name".split()
 
@@ -32,9 +37,9 @@
     # ______________________________________________________________________
     # main entry points from genllvm 
 
-    def writedatatypedecl(self, codewriter):
-        fields_types = [self.db.repr_type(f) for f in self._fields()]
-        codewriter.structdef(self.ref, fields_types)
+    #def writedatatypedecl(self, codewriter):
+    #    fields_types = [self.db.repr_type(f) for f in self._fields()]
+    #    codewriter.structdef(self.ref, fields_types)
 
 class StructVarsizeTypeNode(StructTypeNode):
     __slots__ = "constructor_ref constructor_decl".split()
@@ -53,9 +58,9 @@
     # ______________________________________________________________________
     # main entry points from genllvm 
 
-    def writedecl(self, codewriter): 
-        # declaration for constructor
-        codewriter.declare(self.constructor_decl)
+    #def writedecl(self, codewriter): 
+    #    # declaration for constructor
+    #    codewriter.declare(self.constructor_decl)
 
     def writeimpl(self, codewriter):
         log.writeimpl(self.ref)
@@ -112,22 +117,26 @@
         p, c = lltype.parentlink(self.value)
         if p is not None:
             self.db.prepare_constant(lltype.typeOf(p), p)
-            
+
+    def writedecl(self, codewriter):
+        codewriter.declare(self.ref + ' = new Object()')
+        
     def get_typerepr(self):
         return self.db.repr_type(self.structtype)
 
     def get_childref(self, index):
-        pos = 0
-        found = False
-        for name in self.structtype._names_without_voids():
-            if name == index:
-                found = True
-                break
-            pos += 1
-        return "getelementptr(%s* %s, int 0, uint %s)" %(
-            self.get_typerepr(),
-            self.get_ref(),
-            pos)
+        return self.get_ref() #XXX what to do with index?
+        #pos = 0
+        #found = False
+        #for name in self.structtype._names_without_voids():
+        #    if name == index:
+        #        found = True
+        #        break
+        #    pos += 1
+        #return "getelementptr(%s* %s, int 0, uint %s)" %(
+        #    self.get_typerepr(),
+        #    self.get_ref(),
+        #    pos)
 
     def get_ref(self):
         """ Returns a reference as used for operations in blocks. """        
@@ -144,12 +153,13 @@
     def get_pbcref(self, toptr):
         """ Returns a reference as used per pbc. """        
         return self.get_ref()
-    
+
     def constantvalue(self):
         """ Returns the constant representation for this node. """
         vars = []
         for i, value in enumerate(self._getvalues()):
             name = self._get_types[i][0]
+            name = _rename_reserved_keyword(name)
             var  = (name, str(value))
             vars.append(var)
         return "({%s})" % ", ".join(["%s:%s" % var for var in vars])



More information about the Pypy-commit mailing list