[pypy-svn] r18444 - pypy/dist/pypy/translator/js
ericvrp at codespeak.net
ericvrp at codespeak.net
Wed Oct 12 10:55:24 CEST 2005
Author: ericvrp
Date: Wed Oct 12 10:55:23 2005
New Revision: 18444
Modified:
pypy/dist/pypy/translator/js/codewriter.py
pypy/dist/pypy/translator/js/funcnode.py
pypy/dist/pypy/translator/js/opaquenode.py
pypy/dist/pypy/translator/js/opwriter.py
pypy/dist/pypy/translator/js/structnode.py
Log:
Cleaning up.
In the process to move phi node handling to the source block.
This will produce cleaner (js) code where I don;t have to keep
track of the previous block anymore.
Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py (original)
+++ pypy/dist/pypy/translator/js/codewriter.py Wed Oct 12 10:55:23 2005
@@ -11,13 +11,18 @@
def __init__(self, f, js):
self.f = f
self.js = js
+ self._skip_closeblock = False
def append(self, line, indentation_level=4):
if indentation_level:
s = self.tabstring * indentation_level
else:
s = ''
- self.f.write(s + line + '\n')
+ if not line or line[-1] in '{:};' or line.lstrip()[:2] == '//':
+ eol = '\n'
+ else:
+ eol = ';\n'
+ self.f.write(s + line + eol)
def comment(self, line, indentation_level=4):
self.append("// " + line, indentation_level)
@@ -30,10 +35,15 @@
def label(self, name):
self.append("case %d:" % name, 3)
- openblock = label
+
+ def openblock(self, name):
+ self.append("case %d:" % name, 3)
+ self._currentblock = name
def closeblock(self):
- self.append('continue')
+ if not self._skip_closeblock:
+ self.append('break')
+ self._skip_closeblock = False
def globalinstance(self, name, typeanddata):
#self.append('%s = %s' % (name, typeanddata[1:].split('{')[1][:-1]), 0)
@@ -61,15 +71,29 @@
#self.llvm("implementation", 0)
pass
- def br_uncond(self, blockname):
- self.append('prevblock = block')
- self.append('block = %d' % blockname)
- #self.llvm("br label %s" %(blockname,))
-
- def br(self, cond, blockname_false, blockname_true):
- self.append('prevblock = block')
- self.append('block = %s ? %d : %d' % (cond, blockname_true, blockname_false))
- #self.llvm("br bool %s, label %s, label %s" % (cond, blockname_true, blockname_false))
+ def br_uncond(self, block):
+ self.append('prevblock = ' + str(self._currentblock))
+ if block == self._currentblock + 1:
+ self._skip_closeblock = True
+ else:
+ self.append('block = ' + str(block))
+
+ def br(self, cond, block_false, block_true):
+ self.append('prevblock = ' + str(self._currentblock))
+ self.append('if (%s) {' % cond)
+ if block_true == self._currentblock + 1:
+ self._skip_closeblock = True
+ else:
+ self.append('block = ' + str(block_true), 5)
+ self.append('break', 5)
+ if block_false == self._currentblock + 1:
+ self._skip_closeblock = True
+ else:
+ self.append('} else {')
+ self.append('block = ' + str(block_false), 5)
+ self.append('break', 5)
+ self.append('}')
+ self.comment('block = %s ? %d : %d' % (cond, block_true, block_false))
def switch(self, intty, cond, defaultdest, value_label):
labels = ''
@@ -91,28 +115,29 @@
self.append("function %s {" % self.decl, 0)
if usedvars:
self.append("var %s" % ', '.join(usedvars.keys()), 1)
- self.append("var block = 0", 1)
- self.append("while (block != undefined) {", 1)
+ self.append("for (var block = 0;;) {", 1)
self.append("switch (block) {", 2)
def closefunc(self):
- self.append("} // end of switch (block)", 2)
- self.append("} // end of while (block != undefined)", 1)
- self.append("} // end of function %s" % self.decl, 0)
+ self.append("}", 2)
+ self.append("}", 1)
+ self.append("};", 0)
def ret(self, type_, ref):
if type_ == 'void':
self.append("return")
else:
self.append("return " + ref)
+ self._skip_closeblock = True
+
+ def phi(self, targetvar, type_, refs, blocks):
+ assert refs and len(refs) == len(blocks), "phi node requires blocks"
+ mergelist = ", ".join(
+ ["[%s, %s]" % item
+ for item in zip(refs, blocks)])
+ s = "%s = phi %s %s" % (targetvar, type_, mergelist)
+ self.llvm(s)
- def phi(self, targetvar, type_, refs, blocknames):
- assert refs and len(refs) == len(blocknames), "phi node requires blocks"
- #mergelist = ", ".join(
- # ["[%s, %s]" % item
- # for item in zip(refs, blocknames)])
- #s = "%s = phi %s %s" % (targetvar, type_, mergelist)
- #self.llvm(s)
all_refs_identical = True
for ref in refs:
if ref != refs[0]:
@@ -122,17 +147,17 @@
if targetvar != refs[0]:
self.append('%s = %s' % (targetvar, refs[0]))
else:
- if len(blocknames) == 1:
+ if len(blocks) == 1:
self.append('%s = %s' % (targetvar, refs[i]))
else:
n = 0
- for i, blockname in enumerate(blocknames):
+ for i, block in enumerate(blocks):
if targetvar != refs[i]:
if n > 0:
s = 'else '
else:
s = ''
- self.append('%sif (prevblock == %d) %s = %s' % (s, blockname, targetvar, refs[i]))
+ self.append('%sif (prevblock == %d) %s = %s' % (s, block, targetvar, refs[i]))
n += 1
def binaryop(self, name, targetvar, type_, ref1, ref2):
@@ -155,10 +180,10 @@
self.append('%s = %s(%s)' % (targetvar, functionref, args))
def cast(self, targetvar, fromtype, fromvar, targettype):
- self.comment('codewriter cast 1 targettype=%(targettype)s, targetvar=%(targetvar)s, fromtype=%(fromtype)s, fromvar=%(fromvar)s' % locals())
+ #self.comment('codewriter cast 1 targettype=%(targettype)s, targetvar=%(targetvar)s, fromtype=%(fromtype)s, fromvar=%(fromvar)s' % locals())
if fromtype == 'void' and targettype == 'void':
return
- self.comment('codewriter cast 2')
+ #self.comment('codewriter cast 2')
if targettype == fromtype:
self.append("%(targetvar)s = %(fromvar)s" % locals())
elif targettype in ('int','uint',):
Modified: pypy/dist/pypy/translator/js/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/js/funcnode.py (original)
+++ pypy/dist/pypy/translator/js/funcnode.py Wed Oct 12 10:55:23 2005
@@ -22,7 +22,7 @@
self.db = db
assert isinstance(type_, lltype.FuncType)
self.type_ = type_
- self.ref = self.make_ref('%functiontype', '')
+ self.ref = self.make_ref('functiontype', '')
def __str__(self):
return "<FuncTypeNode %r>" % self.ref
Modified: pypy/dist/pypy/translator/js/opaquenode.py
==============================================================================
--- pypy/dist/pypy/translator/js/opaquenode.py (original)
+++ pypy/dist/pypy/translator/js/opaquenode.py Wed Oct 12 10:55:23 2005
@@ -7,7 +7,7 @@
assert isinstance(opaquetype, lltype.OpaqueType)
self.db = db
self.opaquetype = opaquetype
- self.ref = "%%opaquetype.%s" % (opaquetype.tag)
+ self.ref = "opaquetype." + opaquetype.tag
def __str__(self):
return "<OpaqueNode %r>" %(self.ref,)
Modified: pypy/dist/pypy/translator/js/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/opwriter.py (original)
+++ pypy/dist/pypy/translator/js/opwriter.py Wed Oct 12 10:55:23 2005
@@ -212,7 +212,7 @@
targettype = self.db.repr_arg_type(op.result)
fromvar = self.db.repr_arg(op.args[0])
fromtype = self.db.repr_arg_type(op.args[0])
- self.codewriter.comment(op.opname)
+ self.codewriter.comment('next line='+op.opname)
self.codewriter.cast(targetvar, fromtype, fromvar, targettype)
same_as = cast_primitive
@@ -412,9 +412,11 @@
targettype = self.db.repr_arg_type(op.result)
if targettype != "void":
assert index != -1
- self.codewriter.getelementptr(tmpvar, structtype, struct,
- ("uint", index))
- self.codewriter.load(targetvar, targettype, tmpvar)
+ #self.codewriter.getelementptr(tmpvar, structtype, struct,
+ # ("uint", index))
+ #self.codewriter.load(targetvar, targettype, tmpvar)
+ self.codewriter.comment('XXX getfield')
+ self.codewriter.load(targetvar, struct, (index,))
else:
self._skipped(op)
@@ -433,9 +435,11 @@
index = self._getindexhelper(op.args[1].value, op.args[0].concretetype.TO)
valuevar, valuetype = self.db.repr_argwithtype(op.args[2])
if valuetype != "void":
- self.codewriter.getelementptr(tmpvar, structtype, struct,
- ("uint", index))
- self.codewriter.store(valuetype, valuevar, tmpvar)
+ #self.codewriter.getelementptr(tmpvar, structtype, struct,
+ # ("uint", index))
+ #self.codewriter.store(valuetype, valuevar, tmpvar)
+ self.codewriter.comment('XXX setfield')
+ self.codewriter.store(struct, (index,), valuevar)
else:
self._skipped(op)
Modified: pypy/dist/pypy/translator/js/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/js/structnode.py (original)
+++ pypy/dist/pypy/translator/js/structnode.py Wed Oct 12 10:55:23 2005
@@ -83,7 +83,7 @@
self.db = db
self.value = value
self.structtype = self.value._TYPE
- prefix = '%structinstance.'
+ prefix = 'structinstance.'
name = str(value).split()[1]
self.ref = self.make_ref(prefix, name)
self._get_ref_cache = None
@@ -124,8 +124,6 @@
found = True
break
pos += 1
- #Structure types require uint constants!
- #see: http://llvm.cs.uiuc.edu/docs/LangRef.html#i_getelementptr
return "getelementptr(%s* %s, int 0, uint %s)" %(
self.get_typerepr(),
self.get_ref(),
More information about the Pypy-commit
mailing list