[pypy-svn] r24517 - in pypy/dist/pypy/translator/squeak: . test
nik at codespeak.net
nik at codespeak.net
Fri Mar 17 14:27:13 CET 2006
Author: nik
Date: Fri Mar 17 14:27:01 2006
New Revision: 24517
Modified:
pypy/dist/pypy/translator/squeak/codeformatter.py
pypy/dist/pypy/translator/squeak/gensqueak.py
pypy/dist/pypy/translator/squeak/node.py
pypy/dist/pypy/translator/squeak/opformatter.py
pypy/dist/pypy/translator/squeak/test/runtest.py
pypy/dist/pypy/translator/squeak/test/test_llops.py
Log:
added implementation and test for bool_not llop. stumbled over the
camel_case mess and cleaned that up, camel_case is now defined in and
exclusively called from gensqueak.py. also, check uniqueness of
variable names as well, since there can be collisions, e.g. between
v19 and v1_9 (this one actually happened!).
Modified: pypy/dist/pypy/translator/squeak/codeformatter.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/codeformatter.py (original)
+++ pypy/dist/pypy/translator/squeak/codeformatter.py Fri Mar 17 14:27:01 2006
@@ -1,11 +1,6 @@
from pypy.objspace.flow.model import Constant, Variable
from pypy.rpython.ootypesystem import ootype
-def camel_case(identifier):
- identifier = identifier.replace(".", "_")
- words = identifier.split('_')
- return ''.join([words[0]] + [w.capitalize() for w in words[1:]])
-
class AbstractCode:
pass
@@ -13,7 +8,7 @@
class Message(AbstractCode):
def __init__(self, name):
- self.name = camel_case(name) # XXX Should not use camel_case here
+ self.name = name
self.infix = False
if len(name) <= 2 and not name.isalnum():
# Binary infix selector, e.g. "+"
@@ -82,7 +77,7 @@
def format_arg(self, arg):
"""Formats Variables and Constants."""
if isinstance(arg, Variable):
- return camel_case(arg.name)
+ return self.gen.unique_var_name(arg)
elif isinstance(arg, Constant):
if isinstance(arg.concretetype, ootype.Instance):
# XXX fix this
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 17 14:27:01 2006
@@ -1,5 +1,4 @@
from pypy.translator.gensupp import NameManager
-from pypy.translator.squeak.codeformatter import camel_case
from pypy.translator.squeak.node import FunctionNode, ClassNode, SetupNode
from pypy.translator.squeak.node import MethodNode, SetterNode, GetterNode
try:
@@ -91,6 +90,9 @@
return self.unique_name(
(INSTANCE, "field", field_name), field_name)
+ def unique_var_name(self, variable):
+ return self.unique_name(variable, variable.name)
+
def unique_name(self, key, basename):
# XXX should account for squeak keywords here
if self.unique_name_mapping.has_key(key):
@@ -101,3 +103,9 @@
self.unique_name_mapping[key] = unique
return unique
+
+def camel_case(identifier):
+ identifier = identifier.replace(".", "_")
+ words = identifier.split('_')
+ return ''.join([words[0]] + [w.capitalize() for w in words[1:]])
+
Modified: pypy/dist/pypy/translator/squeak/node.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/node.py (original)
+++ pypy/dist/pypy/translator/squeak/node.py Fri Mar 17 14:27:01 2006
@@ -1,7 +1,7 @@
import datetime
from pypy.objspace.flow.model import Constant, Variable
from pypy.translator.squeak.opformatter import OpFormatter
-from pypy.translator.squeak.codeformatter import CodeFormatter, Message, camel_case
+from pypy.translator.squeak.codeformatter import CodeFormatter, Message
from pypy.translator.squeak.codeformatter import Field, Assignment, CustomVariable
from pypy.rpython.ootypesystem.ootype import Instance, ROOT
@@ -269,7 +269,7 @@
codef.format(self.INSTANCE), "initializers")
fields = self.INSTANCE._allfields()
args = [CustomVariable("a%s" % i) for i in range(len(fields))]
- message = Message("field_init").with_args(args)
+ message = Message("fieldInit").with_args(args)
yield codef.format(message)
for field_name, arg in zip(fields.keys(), args):
unique_field = self.gen.unique_field_name(self.INSTANCE, field_name)
@@ -306,7 +306,7 @@
field_names = INST._allfields().keys()
field_values = [getattr(const.value, f) for f in field_names]
new = Message("new").send_to(INST, [])
- init_message = Message("field_init").send_to(new, field_values)
+ init_message = Message("fieldInit").send_to(new, field_values)
yield " Constants at: '%s' put: %s." \
% (const_id, codef.format(init_message))
yield "! !"
Modified: pypy/dist/pypy/translator/squeak/opformatter.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/opformatter.py (original)
+++ pypy/dist/pypy/translator/squeak/opformatter.py Fri Mar 17 14:27:01 2006
@@ -30,6 +30,7 @@
'runtimenew': 'new',
'classof': 'class',
'same_as': 'yourself',
+ 'bool_not': 'not',
}
number_ops = {
@@ -80,7 +81,10 @@
if op_method is not None:
return op_method(op)
else:
- name = self.ops.get(op.opname, op.opname)
+ if not self.ops.has_key(op.opname):
+ raise NotImplementedError(
+ "operation not supported: %s" % op.opname)
+ name = self.ops[op.opname]
sent = Message(name).send_to(op.args[0], op.args[1:])
return self.codef.format(sent.assign_to(op.result))
Modified: pypy/dist/pypy/translator/squeak/test/runtest.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/runtest.py (original)
+++ pypy/dist/pypy/translator/squeak/test/runtest.py Fri Mar 17 14:27:01 2006
@@ -1,7 +1,7 @@
import os
import py
from pypy.tool.udir import udir
-from pypy.translator.squeak.gensqueak import GenSqueak
+from pypy.translator.squeak.gensqueak import GenSqueak, camel_case
from pypy.translator.translator import TranslationContext
from pypy import conftest
@@ -67,7 +67,7 @@
return startup_st
def _symbol(self, arg_count):
- name = self._func.__name__
+ name = camel_case(self._func.__name__)
if arg_count == 0:
return name
else:
Modified: pypy/dist/pypy/translator/squeak/test/test_llops.py
==============================================================================
--- pypy/dist/pypy/translator/squeak/test/test_llops.py (original)
+++ pypy/dist/pypy/translator/squeak/test/test_llops.py Fri Mar 17 14:27:01 2006
@@ -17,10 +17,12 @@
return llop.%s(%s, %s)""" \
% (arg_signature, llopname, RESTYPE._name,
arg_signature)
+ llfunctest(lloptest, args)
+def llfunctest(llfunc, args):
annotation = [type(a) for a in args]
- sqfunc = compile_function(lloptest, annotation)
- expected_res = interpret(lloptest, args, policy=LowLevelAnnotatorPolicy())
+ sqfunc = compile_function(llfunc, annotation)
+ expected_res = interpret(llfunc, args, policy=LowLevelAnnotatorPolicy())
res = sqfunc(*args)
assert res == str(expected_res).lower() # lowercasing for booleans
@@ -112,3 +114,12 @@
for t in tests:
yield optest, t
+def test_booloperations():
+ def bool_not(i):
+ if i == 1:
+ j = True
+ else:
+ j = False
+ return llop.bool_not(Bool, j)
+ llfunctest(bool_not, (1,))
+
More information about the Pypy-commit
mailing list