[pypy-svn] r19068 - pypy/dist/pypy/translator/js
ericvrp at codespeak.net
ericvrp at codespeak.net
Thu Oct 27 12:57:55 CEST 2005
Author: ericvrp
Date: Thu Oct 27 12:57:54 2005
New Revision: 19068
Modified:
pypy/dist/pypy/translator/js/codewriter.py
pypy/dist/pypy/translator/js/js.py
pypy/dist/pypy/translator/js/opwriter.py
Log:
Refactoring of indentation_level. No longer hardcoded.
Modified: pypy/dist/pypy/translator/js/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/codewriter.py (original)
+++ pypy/dist/pypy/translator/js/codewriter.py Thu Oct 27 12:57:54 2005
@@ -12,13 +12,28 @@
self.f = f
self.js = js
self._skip_closeblock = False
+ self.set_indentation_level(0)
def skip_closeblock(self, flag=True):
self._skip_closeblock = flag
- def append(self, line, indentation_level=4):
- if line and indentation_level:
- s = self.tabstring * indentation_level
+ def set_indentation_level(self, indentation_level):
+ try:
+ old = self.indentation_level
+ except:
+ old = 0
+ self.indentation_level = indentation_level
+ return old
+
+ def indent_more(self):
+ self.indentation_level += 1
+
+ def indent_less(self):
+ self.indentation_level -= 1
+
+ def append(self, line):
+ if line and self.indentation_level:
+ s = self.tabstring * self.indentation_level
else:
s = ''
if not line or line[-1] in '{:};' or line.lstrip()[:2] == '//':
@@ -27,43 +42,45 @@
eol = ';\n'
self.f.write(s + line + eol)
- def comment(self, line, indentation_level=4):
- self.append("// " + line, indentation_level)
+ def comment(self, line):
+ self.append("// " + line)
- def llvm(self, line, indentation_level=4):
- self.comment("LLVM " + line, indentation_level)
+ def llvm(self, line):
+ self.comment("LLVM " + line)
def newline(self):
self.append("")
def openblock(self, name):
- self.append("case %d:" % name, 3)
+ self.indent_more()
+ self.append("case %d:" % name)
+ self.indent_more()
self._currentblock = name
def closeblock(self):
if not self._skip_closeblock:
self.append('break')
+ self.indent_less()
+ self.indent_less()
self.skip_closeblock(False)
def globalinstance(self, lines=[]):
for line in lines:
- self.append(line, 0)
+ self.append(line)
def declare(self, decl):
- self.append(decl, 0)
+ self.append(decl)
- def _goto_block(self, block, indentation_level=4):
+ def _goto_block(self, block):
if block == self._currentblock + 1:
self._skip_closeblock = True
else:
- self.append('block = ' + str(block), indentation_level)
- self.append('break', indentation_level)
+ self.append('block = ' + str(block))
+ self.append('break')
- def _phi(self, targetblock, exit, indentation_level=4):
- #self.comment('target.inputargs=%s, args=%s, targetblock=%d' % (exit.target.inputargs, exit.args, targetblock), indentation_level)
+ def _phi(self, targetblock, exit):
for i, exitarg in enumerate(exit.args):
dest = str(exit.target.inputargs[i])
- #src = str(exitarg)
src = str(self.js.db.repr_arg(exitarg))
if src == 'False':
src = 'false'
@@ -72,7 +89,7 @@
elif src == 'None':
src = 'undefined'
if dest != src:
- self.append('%s = %s' % (dest, src), indentation_level)
+ self.append('%s = %s' % (dest, src))
def br_uncond(self, block, exit):
self._phi(block, exit)
@@ -81,20 +98,24 @@
def br(self, cond, block_false, exit_false, block_true, exit_true):
self.append('if (%s) {' % cond)
- self._phi(block_true, exit_true, 5)
- self._goto_block(block_true, 5)
+ self.indent_more()
+ self._phi(block_true, exit_true)
+ self._goto_block(block_true)
+ self.indent_less()
self.append('} else {')
- self._phi(block_false, exit_false, 5)
- self._goto_block(block_false, 5)
+ self.indent_more()
+ self._phi(block_false, exit_false)
+ self._goto_block(block_false)
+ self.indent_less()
self.append('}')
self.skip_closeblock()
- def switch(self, intty, cond, defaultdest, value_label):
- labels = ''
- for value, label in value_label:
- labels += ' %s %s, label %s' % (intty, value, label)
- self.llvm("switch %s %s, label %s [%s ]"
- % (intty, cond, defaultdest, labels))
+ #def switch(self, intty, cond, defaultdest, value_label):
+ # labels = ''
+ # for value, label in value_label:
+ # labels += ' %s %s, label %s' % (intty, value, label)
+ # self.llvm("switch %s %s, label %s [%s ]"
+ # % (intty, cond, defaultdest, labels))
def openfunc(self, decl, funcnode, blocks):
self.decl = decl
@@ -110,16 +131,20 @@
targetvar = self.js.db.repr_arg(op.result)
usedvars[targetvar] = True
self.newline()
- self.append("function %s {" % self.decl, 0)
+ self.append("function %s {" % self.decl)
+ self.indent_more()
if usedvars:
- self.append("var %s" % ', '.join(usedvars.keys()), 1)
- self.append("for (var block = 0;;) {", 1)
- self.append("switch (block) {", 2)
+ self.append("var %s" % ', '.join(usedvars.keys()))
+ self.append("for (var block = 0;;) {")
+ self.indent_more()
+ self.append("switch (block) {")
def closefunc(self):
- self.append("}", 2)
- self.append("}", 1)
- self.append("};", 0)
+ self.append("}")
+ self.indent_less()
+ self.append("}")
+ self.indent_less()
+ self.append("};")
def ret(self, ref=''):
self.append("return " + ref)
@@ -131,30 +156,46 @@
def neg(self, targetvar, source):
self.append('%(targetvar)s = -%(source)s' % locals())
- def call(self, targetvar, functionref, argrefs, label=None, exceptions=[], ll_issubclass=None):
- if exceptions:
- assert label is not None
- self.append('try {')
- indentation_level = 5
- else:
- assert label is None
- indentation_level = 4
-
+ def call(self, targetvar, functionref, argrefs, label=None, exceptions=[]):
args = ", ".join(argrefs)
- self.append('%s = %s(%s)' % (targetvar, functionref, args), indentation_level)
- if exceptions:
- self._goto_block(label, indentation_level)
+ if not exceptions:
+ assert label is None
+ self.append('%s = %s(%s)' % (targetvar, functionref, args))
+ else:
+ assert label is not None
+ self.append('try {')
+ self.indent_more()
+ self._goto_block(label)
+ self.indent_less()
+
self.append('} catch (e) {')
+ self.indent_more()
+ catch_all = False
for i, exception in enumerate(exceptions):
exception_match, exception_ref, exception_target = exception
if i:
- s = 'else '
+ else_ = 'else '
+ else:
+ else_ = ''
+ if exception_ref.startswith('structinstance_object_vtable'):
+ catch_all = True
+ matcher = ''
else:
- s = ''
- self.append('%sif (%s(e.typeptr, %s) == true) {' % (s, exception_match, exception_ref), indentation_level)
- self._goto_block(exception_target, indentation_level+1)
- self.append('}', indentation_level)
+ matcher = 'if (%s(e.typeptr, %s) == true) ' % (exception_match, exception_ref)
+ self.append('%s%s{' % (else_, matcher))
+ self.indent_more()
+ self._goto_block(exception_target)
+ self.indent_less()
+ self.append('}')
+ if not catch_all:
+ self.append('else {')
+ self.indent_more()
+ self.throw('e') #reraise exception when not caught above
+ self.indent_less()
+ self.append('}')
+
+ self.indent_less()
self.append('}')
def cast(self, targetvar, fromtype, fromvar, targettype):
Modified: pypy/dist/pypy/translator/js/js.py
==============================================================================
--- pypy/dist/pypy/translator/js/js.py (original)
+++ pypy/dist/pypy/translator/js/js.py Thu Oct 27 12:57:54 2005
@@ -45,7 +45,7 @@
c = inputconst(lltype.typeOf(ptr), ptr)
self.db.prepare_arg_value(c)
- #add functions
+ #add exception matching function (XXX should only be done when needed)
e = self.db.translator.rtyper.getexceptiondata()
matchptr = getfunctionptr(self.db.translator, e.ll_exception_match)
matchconst = inputconst(lltype.typeOf(matchptr), matchptr)
@@ -141,7 +141,7 @@
#codewriter.newline()
#codewriter.append(self.wrappercode, 0)
codewriter.newline()
- codewriter.comment("EOF", 0)
+ codewriter.comment("EOF")
f.close()
log('Written:', self.filename)
Modified: pypy/dist/pypy/translator/js/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/js/opwriter.py (original)
+++ pypy/dist/pypy/translator/js/opwriter.py Thu Oct 27 12:57:54 2005
@@ -282,72 +282,6 @@
exceptions.append(exception)
self.codewriter.call(targetvar, functionref, argrefs, none_label, exceptions)
- return
-
-
-
-
- e = self.db.translator.rtyper.getexceptiondata()
- pypy_prefix = '' #pypy_
- ll_exception_match = pypy_prefix + e.ll_exception_match.__name__
- lltype_of_exception_type = ('structtype_' +
- e.lltype_of_exception_type.TO.__name__
- + '*')
- lltype_of_exception_value = ('structtype_' +
- e.lltype_of_exception_value.TO.__name__
- + '*')
-
- self.codewriter.openblock(exc_label)
-
- exc_found_labels, last_exception_type = [], None
- catch_all = False
- for link in self.block.exits[1:]:
- assert issubclass(link.exitcase, Exception)
-
- etype = self.db.obj2node[link.llexitcase._obj]
- current_exception_type = etype.get_ref()
- target = self.node.blockindex[link.target]
- #exc_found_label = block_label + '_exception_found_branchto_' + target
- exc_found_label = target #'%d_exception_found_branchto_%d' % (block_label, target)
- last_exc_type_var, last_exc_value_var = None, None
-
- #XXX refactor this
- #for p in self.node.get_phi_data(link.target):
- # arg, type_, names, blocknames = p
- # for name, blockname in zip(names, blocknames):
- # if blockname != exc_found_label:
- # continue
- # if name.startswith('last_exception_'):
- # last_exc_type_var = name
- # if name.startswith('last_exc_value_'):
- # last_exc_value_var = name
-
- t = (exc_found_label,target,last_exc_type_var,last_exc_value_var)
- exc_found_labels.append(t)
-
- not_this_exception_label = str(block_label) + '_not_exception_' + etype.ref[1:]
-
- if current_exception_type.find('getelementptr') == -1: #catch all (except:)
- catch_all = True
- self.codewriter.comment('br_uncond %s' % exc_found_label)
- #self.codewriter.br_uncond(exc_found_label)
- else: #catch specific exception (class) type
- if not last_exception_type: #load pointer only once
- last_exception_type = self.db.repr_tmpvar()
- self.codewriter.load(last_exception_type, lltype_of_exception_type, 'last_exception_type')
- self.codewriter.newline()
- ll_issubclass_cond = self.db.repr_tmpvar()
- self.codewriter.call(ll_issubclass_cond,
- ll_exception_match,
- [last_exception_type, current_exception_type],
- [lltype_of_exception_type, lltype_of_exception_type])
- self.codewriter.br(ll_issubclass_cond, not_this_exception_label, exc_found_label)
- self.codewriter.openblock(not_this_exception_label)
-
- ep = self.codewriter.js.exceptionpolicy
- if not catch_all:
- ep.reraise(self.node, self.codewriter)
- ep.fetch_exceptions(self.codewriter,self.block,exc_found_labels,lltype_of_exception_type,lltype_of_exception_value)
def malloc(self, op):
arg_type = op.args[0].value
More information about the Pypy-commit
mailing list