From 9b70aa0141386814e6ca5029e7f4c6091309a137 Mon Sep 17 00:00:00 2001
From: Anders Blomdell <anders.blomdell@control.lth.se>
Date: Thu, 26 Feb 2015 15:49:29 +0100
Subject: [PATCH] Removed some redundancy from generated python code, made list
 of samples immutable (tuple instead of list).

---
 compiler/2014/Python_CodeGen.jrag |  6 +++---
 lib/python/labcomm/LabComm.py     | 20 ++++++++++++++++----
 test/test_encoder_decoder.py      | 14 +++++++-------
 3 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/compiler/2014/Python_CodeGen.jrag b/compiler/2014/Python_CodeGen.jrag
index 17203b8..c454f92 100644
--- a/compiler/2014/Python_CodeGen.jrag
+++ b/compiler/2014/Python_CodeGen.jrag
@@ -91,13 +91,13 @@ aspect Python_CodeGen {
     //}
     //env.unindent();
     //env.println("]");
-    env.println("sample = [");
+    env.println("sample = tuple([");
     env.indent();
     for (int i = 0 ; i < getNumDecl() ; i++) {
       getDecl(i).Python_genSampleListEntry(env);
     }
     env.unindent();
-    env.println("]");
+    env.println("])");
   }
 
 }
@@ -211,7 +211,7 @@ aspect PythonTypes {
   }
 
   public void SampleDecl.Python_genSampleListEntry(Python_env env) {
-    env.println("('" + getName() + "', " + getName() + ".signature),");
+    env.println(getName()+ ",");
   }
 
   public String Exp.Python_getValue() {
diff --git a/lib/python/labcomm/LabComm.py b/lib/python/labcomm/LabComm.py
index 57f70f4..039d10b 100644
--- a/lib/python/labcomm/LabComm.py
+++ b/lib/python/labcomm/LabComm.py
@@ -219,10 +219,16 @@ class length_encoder:
 def indent(i, s):
     return ("\n%s" % (" " * i)).join(s.split("\n"))
 
+#
+# Base type for all decl's
+#
+class type_decl(object):
+    pass
+
 #
 # Primitive types
 #
-class primitive(object):
+class primitive(type_decl):
     def decode_decl(self, decoder):
         return self
 
@@ -383,7 +389,7 @@ class SAMPLE(primitive):
 #
 # Aggregate types
 #
-class sample_def_or_ref(object):
+class sample_def_or_ref(type_decl):
     def __init__(self, name=None, decl=None):
         self.name = name
         self.decl = decl
@@ -460,7 +466,7 @@ class sample_ref(sample_def_or_ref):
     def add_index(self, decoder, index, decl):
         decoder.add_ref(decl, index)
 
-class array(object):
+class array(type_decl):
     def __init__(self, indices, decl):
         self.indices = tuple(indices)
         self.decl = decl
@@ -587,7 +593,7 @@ class array(object):
         return "labcomm.array(%s,\n    %s)" % (
             self.indices, indent(4, self.decl.__repr__()))
     
-class struct:
+class struct(type_decl):
     def __init__(self, field):
         self.field = tuple(field)
 
@@ -759,6 +765,8 @@ class Encoder(Codec):
         self.writer.write(packer.pack(format, *args))
 
     def add_decl(self, decl, index=0):
+        if not isinstance(decl, type_decl):
+            decl = decl.signature
         if index == 0:
             self.writer.mark_begin(decl, None)
             if super(Encoder, self).add_decl(decl, index):
@@ -766,6 +774,8 @@ class Encoder(Codec):
             self.writer.mark_end(decl, None)
  
     def add_ref(self, decl, index=0):
+        if not isinstance(decl, type_decl):
+            decl = decl.signature
         ref = sample_ref(name=decl.name, decl=decl.decl, sample=decl)
         if index == 0:
             self.writer.mark_begin(decl, None)
@@ -777,6 +787,8 @@ class Encoder(Codec):
         if decl == None:
             name = self.type_to_name[object.__class__]
             decl = self.name_to_decl[name]
+        if not isinstance(decl, type_decl):
+            decl = decl.signature
         self.writer.mark_begin(decl, object)
         self.encode_type_number(decl)
         with length_encoder(self) as e:
diff --git a/test/test_encoder_decoder.py b/test/test_encoder_decoder.py
index 7f0fb8b..08a0c96 100755
--- a/test/test_encoder_decoder.py
+++ b/test/test_encoder_decoder.py
@@ -37,7 +37,7 @@ def get_signatures(path):
     with fp as fp:
         m = imp.load_module('signatures', fp, pathname, description)
         pass
-    return m.sample
+    return map(lambda s: s.signature, m.sample)
 
 class Test:
     
@@ -117,7 +117,7 @@ class Test:
             return ['string', u'sträng' ]
     
         elif decl.__class__ == labcomm.SAMPLE:
-            return [ s for n,s in self.signatures ]
+            return self.signatures
     
         print>>sys.stderr, decl
         raise Exception("unhandled decl %s" % decl.__class__)
@@ -154,14 +154,14 @@ class Test:
         decoder = threading.Thread(target=self.decode, args=(p.stdout,))
         decoder.start()
         encoder = labcomm.Encoder(labcomm.StreamWriter(p.stdin))
-        for name,signature in self.signatures:
+        for signature in self.signatures:
             encoder.add_decl(signature)
             pass
-        if self.uses_refs([ s for n,s in self.signatures ]):
-            for name,signature in self.signatures:
+        if self.uses_refs(self.signatures):
+            for signature in self.signatures:
                 encoder.add_ref(signature)
-        for name,signature in self.signatures:
-            print>>sys.stderr, "Checking", name,
+        for signature in self.signatures:
+            print>>sys.stderr, "Checking", signature.name,
             for decl,value in self.generate(signature):
                 sys.stderr.write('.')
                 #print name,decl,value,value.__class__
-- 
GitLab