[pypy-svn] r24211 - in pypy/dist/pypy/translator/squeak: . test
nik at codespeak.net
nik at codespeak.net
Fri Mar 10 12:01:59 CET 2006
Author: nik
Date: Fri Mar 10 12:01:53 2006
New Revision: 24211
Modified:
pypy/dist/pypy/translator/squeak/gensqueak.py
pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py
Log:
tried to make a test about class variables pass (skipped for now), but
then got annoyed at the way dispatching on llops is done and refactored
that instead.
Modified: pypy/dist/pypy/translator/squeak/gensqueak.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/gensqueak.py (original)
+++ pypy/dist/pypy/translator/squeak/gensqueak.py Fri Mar 10 12:01:53 2006
@@ -232,6 +232,7 @@
'classof': Selector('class', 0),
'sameAs': Selector('yourself', 0),
'intAdd:': Selector('+', 1),
+ 'intEq:': Selector('=', 1),
}
def render_body(self, startblock):
@@ -254,53 +255,70 @@
raise TypeError, "expr(%r)" % (v,)
def oper(self, op):
- args = [self.expr(arg) for arg in op.args]
- if op.opname == "oosend":
- name = op.args[0].value
- receiver = args[1]
- if hasattr(self, "self") and op.args[1] == self.self:
- receiver = "self"
- args = args[2:]
- self.gen.schedule_node(
- MethodNode(self.gen, op.args[1].concretetype, name))
- elif op.opname == "oogetfield":
- receiver = args[0]
- name = op.args[1].value
- args = args[2:]
- if hasattr(self, "self") and op.args[0] == self.self:
- # Could also directly substitute op.result with name
- # everywhere for optimization.
- return "%s := %s." % (self.expr(op.result), name)
- else:
- self.gen.schedule_node(
- GetterNode(self.gen, op.args[0].concretetype, name))
- elif op.opname == "oosetfield":
- receiver = args[0]
- name = op.args[1].value
- args = args[2:]
- if hasattr(self, "self") and op.args[0] == self.self:
- # Note that the receiver variable is never used
- return "%s := %s." % (name, args[0])
- else:
- self.gen.schedule_node(
- SetterNode(self.gen, op.args[0].concretetype, name))
- elif op.opname == "direct_call":
- # XXX not sure if static methods of a specific class should
- # be treated differently.
- receiver = "PyFunctions"
- name = args[0]
- args = args[1:]
- self.gen.schedule_node(
- FunctionNode(self.gen, op.args[0].value.graph))
+ op_method = getattr(self, "op_%s" % op.opname, None)
+ if op_method is not None:
+ return op_method(op)
else:
name = op.opname
- receiver = args[0]
- args = args[1:]
- sel = Selector(name, len(args))
+ receiver = self.expr(op.args[0])
+ args = [self.expr(arg) for arg in op.args[1:]]
+ return self.assignment(op, receiver, name, args)
+
+ def assignment(self, op, receiver_name, sel_name, arg_names):
+ sel = Selector(sel_name, len(arg_names))
if op.opname != "oosend":
sel = self.selectormap.get(sel.symbol(), sel)
- return "%s := %s %s." \
- % (self.expr(op.result), receiver, sel.signature(args))
+ return "%s := %s %s." % (self.expr(op.result),
+ receiver_name, sel.signature(arg_names))
+
+ def op_oosend(self, op):
+ message = op.args[0].value
+ if hasattr(self, "self") and op.args[1] == self.self:
+ receiver = "self"
+ else:
+ receiver = self.expr(op.args[1])
+ args = [self.expr(a) for a in op.args[2:]]
+ self.gen.schedule_node(
+ MethodNode(self.gen, op.args[1].concretetype, message))
+ return self.assignment(op, receiver, message, args)
+
+ def op_oogetfield(self, op):
+ receiver = self.expr(op.args[0])
+ field_name = op.args[1].value
+ if hasattr(self, "self") and op.args[0] == self.self:
+ # Private field access
+ # Could also directly substitute op.result with name
+ # everywhere for optimization.
+ return "%s := %s." % (self.expr(op.result), field_name)
+ else:
+ # Public field access
+ self.gen.schedule_node(GetterNode(
+ self.gen, op.args[0].concretetype, field_name))
+ return self.assignment(op, receiver, field_name, [])
+
+ def op_oosetfield(self, op):
+ # Note that the result variable is never used
+ field_name = op.args[1].value
+ field_value = self.expr(op.args[2])
+ if hasattr(self, "self") and op.args[0] == self.self:
+ # Private field access
+ return "%s := %s." % (field_name, field_value)
+ else:
+ # Public field access
+ self.gen.schedule_node(SetterNode(
+ self.gen, op.args[0].concretetype, field_name))
+ receiver = self.expr(op.args[0])
+ return "%s %s: %s." % (receiver, field_name, field_value)
+
+ def op_direct_call(self, op):
+ # XXX not sure if static methods of a specific class should
+ # be treated differently.
+ receiver = "PyFunctions"
+ callable_name = self.expr(op.args[0])
+ args = [self.expr(a) for a in op.args[1:]]
+ self.gen.schedule_node(
+ FunctionNode(self.gen, op.args[0].value.graph))
+ return self.assignment(op, receiver, callable_name, args)
def render_return(self, args):
if len(args) == 2:
Modified: pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py (original)
+++ pypy/dist/pypy/translator/squeak/test/test_squeaktrans.py Fri Mar 10 12:01:53 2006
@@ -175,6 +175,21 @@
return i + a.i
assert self.run_on_squeak(f, 2) == "6"
+ def dont_test_classvars(self):
+ class A: i = 1
+ class B(A): i = 2
+ def pick(i):
+ if i == 1:
+ c = A
+ else:
+ c = B
+ return c
+ def f(i):
+ c = pick(i)
+ return c.i
+ assert self.run_on_squeak(f, 1) == "1"
+ assert self.run_on_squeak(f, 2) == "2"
+
class TestSelector:
More information about the Pypy-commit
mailing list