Przeglądaj źródła

Added unittest for movA-A replacement, fixed replace.

Jayke Meijer 14 lat temu
rodzic
commit
c43b02ec9e
4 zmienionych plików z 16 dodań i 3 usunięć
  1. 1 0
      src/optimize.py
  2. 6 1
      src/statement.py
  3. 8 2
      tests/test_optimize.py
  4. 1 0
      tests/test_statement.py

+ 1 - 0
src/optimize.py

@@ -13,6 +13,7 @@ def optimize_global(statements):
 
             # mov $regA, $regA          ->  --- remove it
             if s.is_command('move') and s[0] == s[1]:
+                print "Let me fix that", s
                 statements.replace(1, [])
                 continue
 

+ 6 - 1
src/statement.py

@@ -21,6 +21,9 @@ class Statement:
         arguments."""
         return self.stype == other.stype and self.name == other.name \
                and self.args == other.args
+               
+    def __len__(self):
+        return len(self.args)
 
     def __str__(self):  # pragma: nocover
         return '<Statement type=%s name=%s args=%s>' \
@@ -115,8 +118,10 @@ class Block:
         """Replace the given range start-(start + count) with the given
         statement list, and move the pointer to the first statement after the
         replacement."""
+        if self.pointer == 0:
+            raise Exception('No statement have been read yet.')
         if start == None:
-            start = self.pointer
+            start = self.pointer - 1
 
         before = self.statements[:start]
         after = self.statements[start + count:]

+ 8 - 2
tests/test_optimize.py

@@ -9,5 +9,11 @@ class TestOptimize(unittest.TestCase):
     def setUp(self):
         pass
 
-    def test_(self):
-        pass
+    def test_optimize_global_movaa(self):
+        foo = S('command', 'foo')
+        bar = S('command', 'baz')
+        block = B([foo, \
+                   S('command', 'move', '$regA', '$regA'),
+                   bar])
+        optimize_global(block)
+        self.assertEquals(block.statements, [foo, bar]) 

+ 1 - 0
tests/test_statement.py

@@ -67,6 +67,7 @@ class TestStatement(unittest.TestCase):
         self.assertEqual(self.block.peek(), S('comment', 'bar'))
 
     def test_replace(self):
+        self.block.read()
         self.block.replace(1, [S('command', 'foobar')])
         self.assertEqual(self.block.pointer, 1)
         self.assertEqual(self.block.statements, [S('command', 'foobar'), \