[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